16.3. Enregistrer des Fichiers

Enregistrer un fichier à partir d'Emacs veut dire écrire dans le fichier visité par un tampon le contenu de ce tampon.

C-x C-s

Enregistre le tampon courant dans le fichier qu'il visite (save-buffer).

C-x s

Enregistre certains ou tous les tampons dans les fichiers qu'ils visitent (save-some-buffers).

M-~

Oublie que le tampon courant a été modifié (not-modified).

C-x C-w

Enregistre le tampon courant dans un fichier spécifique (write-file).

M-x set-visited-file-name

Change le nom de fichier sou lequel le tampon courant sera enregistré.

Lorsque vous désirez enregistrer un fichier et rendre vos changements permanents, tapez C-x C-s (save-buffer). Une fois que l'enregistrement est terminé, C-x C-s affiche un message comme :

Wrote /u/rms/gnu/gnu.tasks

Si le tampon sélectionné n'est pas modifié (aucun changement n'y a été fait depuis que le tampon a été créé ou depuis sa dernière sauvegarde), l'enregistrement n'est pas réellement effectué, car il n'aurait aucun effet. À la place, C-x C-s affiche un message de ce style dans la zone de répercussion :

(No changes need to be saved)

La commande C-x s (save-some-buffers) offre la possibilité d'enregistrer certains ou tous les tampons modifiés. Il vous demande que faire avec chacun des tampons. Les réponses possibles sont analogues à celles de query-replace :

y

Enregistre ce tampon et demande pour les tampons suivants.

n

N'enregistre pas ce tampon, mais demande pour les tampons suivants.

!

Enregistre ce tampon et tous les suivants sans plus de questions.

RET

Termine save-some-buffers sans enregistrement supplémentaire.

.

Enregistre ce tampon, puis termine save-some-buffers sans poser de questions pour les tampons suivants.

C-r

Affiche le tampon pour lequel on vous questionne. Lorsque vous quittez le mode de Visualisation, vous retournez à save-some-buffers, qui vous repose la question.

C-h

Affiche un message d'aide sur ces options.

C-x C-c, la séquence de touches pour sortir d'Emacs, invoque save-some-buffers donc pose les même questions.

Si vous avez modifié un tampon mais ne désirez pas en enregistrer les changements, vous devrez prendre quelques précautions pour vous en prévenir. Autrement, chaque fois que vous utilisez C-x s ou C-x C-c, vous risquez d'enregistrer ce tampon par erreur. Une chose que vous pouvez faire est de taper M-~ (not-modified), qui supprime l'indication que le tampon est modifié. Si vous faites cela, aucune des commandes d'enregistrement ne pensera que ce tampon a besoin d'être enregistré. (~ est aussi utilisé comme symbole mathématique pour `non' ; ainsi, M-~ est meta-`non'.) Vous pouvez aussi utiliser set-visited-file-name (vos plus bas) pour marquer le tampon come visitant un fichier différent, un qui n'est pas utilisé pour quelque chose d'important. Alternativement, vous pouvez annuler tous les changements faits depuis que le fichier a été visité ou enregistré, en lisant de nouveau le texte à partir du fichier. Ceci est appelé faire revenir. Section 16.4. Vous pouvez aussi annuler tous les changements en répétant le commande d'annulation C-x u jusqu'à que vous ayez annulé tous les changements ; mais faire revenir est plus simple.

M-x set-visited-file-name altère le nom du fichier que le tampon courant est en train de visiter. Elle lit le nouveau nom de fichier en utilisant le mini-tampon. Elle spécifie alors le nom du fichier visité et change le nom du tampon (dans le cas où le nouveau nom n'est pas déjà en usage). set-visited-file-name n'enregistre pas le tampon dans le fichier nouvellement visité ; mais Emacs le retient au cas où vous enregistriez plus tard. Cette commande marque aussi le tampon comme "modifié" pour que C-x C-s dans ce tampon l'enregistre.

Si vous désirez marquer le tampon comme visitant un fichier différent et l'enregistrer en même temps, utilisez C-x C-w (write-file). C'est précisément équivalent à set-visited-file-name suivi de C-x C-s. C-x C-s utilisée dans un tampon ne visitant pas un fichier a le même effet que C-x C-w ; elle lit un nom de fichier, marque le tampon comme visitant ce fichier, et l'enregistre dans celui-ci. Le nom de fichier par défaut dans un tampon ne visitant pas un fichier est créé en combinant le nom du tampon avec le répertoire par défaut du tampon.

Si le nouveau nom de fichier appelle un mode majeur, alors C-x C-w lance ce mode majeur, dans la plupart des cas. La commande set-visited-file-name agit de même. Section 21.1.

Si Emacs est sur le point d'enregistrer un fichier et remarque que la date de la dernière version sur disque ne correspond pas à la date de dernière lecture ou écriture d'Emacs, il vous notifie de ce fait, car cela indique certainement un problème causé par des éditions simultanées et demande votre attention immédiate. Section 16.3.2.

Si la variable require-final-newline est non nil, Emacs place un caractère newline à la fin de chaque fichier qui ne finit pas par un tel caractère, chaque fois qu'un fichier est enregistré ou écrit. La valeur par défaut est nil.

16.3.1. Fichiers Archives

Sur la plupart des systèmes d'exploitation, réécrire un fichier écrase automatiquement l'ancien contenu du fichier. Ainsi, enregistrer un fichier depuis Emacs écrase l'ancien contenu du fichier--ou presque, à l'exception qu'Emacs copie l'ancien contenu dans un autre fichier, appelé le fichier archive, avant d'enregistrer réellement. (En assumant que la variable make-backup-files et non nil. Les fichiers archives ne sont pas écrits si cette variable est nil.) Emacs ne crée normalement pas de fichiers archives pour les fichiers se trouvant dans /tmp.

Selon votre choix, Emacs peut garder soit un seul fichier archive soit une série de fichiers archives numérotés pour chaque fichier que vous éditez.

Emacs crée une archive pour un fichier seulement la première fois que le fichier est enregistré depuis un tampon. Peu importe le nombre de fois que vous enregistrez le fichier, son fichier archive reste toujours identique à ce qu'il était avant que le fichier soit visité. Cela veut dire que le fichier archive contient normalement le contenu du fichier avant la session d'édition ; cependant, si vous détruisez le tampon puis visitez le fichier de nouveau, un nouveau fichier archive sera créé à l'enregistrement suivant.

Vous pouvez aussi demander explicitement qu'un autre fichier archive soit créé à partir d'un tampon même s'il a déjà été enregistré au moins une fois. Si vous enregistrez le tampon avec C-u C-x C-s, la version ainsi enregistrée sera mise dans un fichier archive si vous enregistrez de nouveau le tampon. C-u C-u C-x C-s enregistre le tampon, mais copie d'abord l'ancien contenu du fichier dans un nouveau fichier archive. C-u C-u C-u C-x C-s fait ces deux choses : il crée une archive à partir de l'ancien contenu, et s'arrange pour en créer une autre à partir du contenu ainsi enregistré, si vous enregistrez de nouveau.

16.3.1.1. Archives Simples ou Numérotées

Si vous choisissez d'avoir un fichier archive unique (par défaut), le nom du fichier archive est construit en ajoutant ~ au nom du fichier étant édité ; ainsi, le fichier archive pour eval.c sera eval.c~.

Si vous choisissez d'avoir une série de fichiers archives numérotés, les noms de ces fichiers sont créés en ajoutant .~, le nombre, puis un autre ~ au nom de fichier d'origine. Ainsi, les fichiers archives de eval.c seront appelés eval.c.~1~, eval.c.~2~, etc, jusqu'à des noms comme eval.c.~259~ et au delà.

Si une protection vous empêche d'écrire des fichiers archives sous le nom usuel, le fichier archive est écrit sous %backup%~ dans votre répertoire personnel. Seulement un fichier de ce type peut exister, et seul le dernier créé est disponible.

Le choix d'archives uniques ou numérotées est contrôlé par la variable version-control. Ses valeurs possibles sont :

t

Crée des archives numérotées.

nil

Crée des archives numérotées pour les fichiers qui ont déjà des archives numérotées. Autrement, crée des archives uniques.

never

Ne crée en aucun cas des archives numérotées ; crée toujours des archives uniques.

Vous pouvez définir version-control localement dans un tampon individuel pour contrôler la création des archives pour le fichier de ce tampon. Par exemple, le mode Rmail définit localement version-control à never pour être sûr qu'il n'y ait qu'une archive pour un fichier Rmail. Section 32.2.4.

Si vous définissez la variable d'environnement VERSION_CONTROL, pour dire à divers utilitaires GNU que faire avec les fichiers archives, Emacs se base aussi sur la variable d'environnement en définissant la variable Lisp version-control correctement au démarrage. Si la valeur de la variable d'environnement est t ou numbered, alors version-control devient t ; si la valeur est nil ou existing, alors version-control devient nil; si c'est never ou simple, alors version-control devient never.

Pour les fichiers sous contrôle de version (Section 16.7), la variable vc-make-backup-files détermine s'il faut créer des fichiers archives. Par défaut, elle est à nil, car les fichiers archives sont redondants lorsque vous stockez toutes les versions précédentes avec un système de contrôle de version. Section 16.7.3.

16.3.1.2. Suppression Automatique des Archives

Pour prévenir une consommation illimitée de l'espace disque, Emacs peut supprimer des versions d'archives numérotées automatiquement. Habituellement, Emacs garde les archives les plus récentes et les archives les plus anciennes, supprimant celles entre. Ceci arrive chaque fois qu'une nouvelle archive est créée.

Les deux variables kept-old-versions et kept-new-versions contrôlent cette suppression. Leurs valeurs sont, respectivement, le nombre d'archives les plus anciennes (de nombre le plus petit) à garder et le nombre d'archives les plus récentes (de nombre le plus grand) à garder, chaque fois qu'une nouvelle archive est créée. Souvenez-vous que ces valeurs sont utilisées juste après qu'une nouvelle version d'archive est créée ; cette archive nouvellement créée est inclue dans le compte dans kept-new-versions. Par défaut, ces deux variables sont 2.

Si delete-old-versions est non nil, les versions excessives du milieu sont supprimées asns un murmure. Si elle est à nil, valeur par défaut, Emacs vous demande alors si les versions excessives du milieu doivent réellement être supprimées.

La commande Dired . (Point) peut aussi être utilisée pour supprimer d'anciennes versions. Section 30.3.

16.3.1.3. Copier ou Renommer

Les fichiers archives peuvent être créés en copiant l'ancien fichier ou en le renommant. Ceci peut faire une différence lorsque l'ancien fichier a plusieurs noms. Si l'ancien fichier est renommé en fichier archive, alors les noms alternatifs deviennent les noms des fichiers archives. Si, plutôt, l'ancien fichier est copié, alors les noms alternatifs restent les noms pour les fichiers que vous éditez, et le contenu accédé par ces noms sera le nouveau contenu.

La méthode pour créer les fichiers archives peut aussi affecter le propriétaire et le groupe du fichier. Si la copie est utilisée, il n'y a pas de changement. Si le renommage est utilisé, vous devenez le propriétaire du fichier, et le groupe du fichier devient le groupe par défaut (différents systèmes d'exploitation ont différentes valeurs par défaut pour le groupe).

Changer le propriétaire est habituellement une bonne idée, car alors le propriétaire indique toujours qui a édité le fichier en dernier. De plus, les propriétaires des archives montrent qui a produit ces versions. Occasionnellement, il peut y avoir un fichier dont le propriétaire ne doit pas changer ; une bonne idée pour ces fichiers est qu'ils contiennent des listes de variables locales pour définir backup-by-copying-when-mismatch localement (Section 32.2.5).

Le choix de renommer ou de copier est contrôlé par trois variables. Renommer est le choix par défaut. Si la variable backup-by-copying ess non nil, la copie est utilisée. copying is used. Autrement, si la variable backup-by-copying-when-linked est non nil, alors la copie est utilisée pour des fichiers ayant plusieurs noms, mais le renommage est toujours utilisé lorsque le fichier édité n'a qu'un seul nom. Si la variable backup-by-copying-when-mismatch est non nil, alors la copie est utilisée si le renommage peut causer le changement de propriétaire ou de groupe.

16.3.2. Protection contre des Éditions Simultanées

Des éditions simultanées arrivent lorsque deux utilisateurs visitent le même fichier, tous deux font des changements, puis tous deux l'enregistre. Si personne n'était informé du fait, l'utilisateur ayant enregistré en premier verrait plus tard que ses changements étaient perdus.

Sur certains systèmes, Emacs remarque immédiatement lorsque le deuxième utilisateur commence à modifier le fichier, et l'avertit de suite. Sur tous les systèmes, Emacs vérifie lorsque vous enregistrez le fichier, et vous avertit si vous êtes sur le point d'écraser le changements d'un autre utilisateur. Vous pouvez éviter la perte du travail de l'autre utilisateur en faisant l'action corrective appropriée plutôt que d'enregistrer le fichier.

Lorsque vous faites la première modification dans un tampon d'Emacs visitant un fichier, Emacs note que le fichier est vérouillé par vous. (Il fait ceci en créant un lien symbolique dans le même répertoire avec un nom différent.) Emacs supprime le verrou lorsque vous enregistrez les changements. L'idée est qu'un fichier est vérouillé lorsqu'un tampon d'Emacs le visitant contient des changements non sauvegardés.

Si vous commencez à modifier le tampon lorsque le fichier visité est vérouillé par quelqu'un d'autre, cela constitue une collision. Lorsqu'Emacs détecte une collision, il vous demande que faire, en appelant la fonction Lisp ask-user-about-lock. Vous pouvez redéfinir cette fonction à titre de personalisation. La définition standard de cette fonction vous pose une question et accepte trois réponses possibles :

s

Dérobe le verrou; Quiconque étant en train de modifier le fichier perd le verrou, et vous obtenez le verrou.

p

Passe. Continue et édite le fichier en dépit qu'il soit édité par quelqu'un d'autre.

q

Quitte. Ceci entra^ine une erreur (file-locked) et les modifications que vous essayiez de faire dans le tampon ne prennent pas effet.

Notez que le verrouillage se base sur les noms de fichiers ; si un fichier a plusieurs noms, Emacs ne réalise pas que les deux noms représentent le même fichier, et ne peut pas empêcher deux utilisateurs d'éditer ce même fichier simultanément sous deux noms différents. Cependant, baser le verrouillage sur les noms permet à Emacs de verouiller l'édition de nouveaux fichiers qui n'existeront pas réellement avant d'être enregistrés.

Certains systèmes ne sont pas configurés pour permettre à Emacs de créer des verrous, et dans ces cas les fichiers verrous ne peuvent être écrits. Dans ces cas, Emacs ne peut pas détecter de problèmes à l'avance, mais il peut toujours détecter la collision lorsque vous essayez d'enregistrer un fichier et d'écraser les changements de quelqu'un d'autre.

Si Emacs ou le système d'exploitation crashe, ceci peut laisser des fichiers verrous qui n'ont plus lieu d'exister. Vous pouvez alors à l'occasion obtenir des avertissements à propos de fausses collisions. Lorsque vous déterminez que la collision est irrélevante, tapez p pour indiquer à Emacs d'ignorer la collision.

Chaque fois qu'Emacs enregistre un tampon, il examine d'abord la date de dernière modification du fichier existant sur le disque pour vérifier qu'il n'a pas changé depuis la dernière visite ou sauvegarde de ce fichier. Si la date ne correspond pas, cela veut dire que des changements ont été faits sur le fichier d'une autre manière, et ces changements seront perdus si Emacs enregistre. Pour empêcher ceci, Emacs affiche un message d'avertissement et vous demande de confirmer avant d'enregistrer. Parfois vous saurez de quelle manière le fichier a été modifié et saurez que e n'est pas important ; vous pouvez alors répondre yes et poursuivre. Autrement, vous devriez annuler l'enregistrement avec C-g et examiner la situation.

La première chose que vous devriez faire lorsque vous êtes informé que des éditions simultanées sont en cours est de lister le répertoire avec C-u C-x C-d (Section 16.8). L'auteur courant du fichier est ainsi affiché. Vous devriez essayer de le contacter pour l'avertir de ne pas continuer à éditer. Souvent, la prochaine étape est de sauvegarder le contenu de votre tampon Emacs sous un nom différent, et utiliser diff pour comparer les deux fichiers.