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). Avec un argument préfixe (C-u), marque le tampon courant comme modifié.

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 valeur de la variable require-final-newline est t, Emacs place silencieusement un caractère newline à la fin des fichiers qui ne finissent pas avec un tel caractère, chaque fois qu'un fichier est enregistré ou écrit. Si la valeur est nil, Emacs laisse inchangée la fin du fichier ; si ce n'est ni nil ni t, Emacs demande s'il doit ajouter un caractère newline. 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.

Pour la plupart des fichiers, la variable make-backup-files détermine s'il faut créer des fichiers archives. Sur la plupart des systèmes d'exploitation, sa valeur par défaut est t, et Emacs crée donc des fichiers archive.

Pour les fichiers gérés par un système de contrôle de version (Section 16.7), la variable vc-make-backup-files détermine s'il faut créer des fichiers archive. Par défaut, sa valeur est nil, les fichiers archives étant redondants lorsque vous enregistrez toutes les versions précédentes dans un système de contrôle de version. .

La valeur par défaut de la variable backup-enable-predicate empêche la création de fichiers archive pour les fichiers des répertoires utilisés pour les fichiers temporaires, spécifiés par temporary-file-directory ou small-temporary-file-directory.

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 normalement construit en ajoutant ~ au nom du fichier étant édité ; ainsi, le fichier archive pour eval.c sera eval.c~.

Vous pouvez changer cette fonctionnalité en définissant la variable make-backup-file-name-function comme une fonction adéquate. Alternativement, vous pouvez personnaliser la variable backup-directory-alist pour indiquer que les fichiers coorespondant à certains motifs doivent être archivés dans des répertoires spécifiques.

Une utilisation typique est d'ajouter un élément ("." . dir) pour créer toutes les archives dans le répertoire dont le nom absolu est dir ; Emacs modifie les noms de fichiers archive pour empêcher les collisions entre les fichiers de même nom provenant de répertoires différents. Alternativement, ajouter, disons, ("." ".~") créerait les archives dans le sous-répertoire invisible .~ du répertoire du fichier original. Emacs crée le répertoire, si nécessaire, pour créer l'archive.

Si le contrôle d'accès empêche Emacs d'écrire un fichier archive sous son noms habituel, il écrit le fichier archive en %backup%~ dans votre répertoire personnel. Un seul fichier de ce genre peut exister, et seul le plus récent est disponible.

Si vous choisissez d'avoir une série de fichiers archives numérotés, les noms de ces fichiers contiennent .~, le nombre, et un autre ~ après le nom de fichier original. Ainsi, les fichiers archive de eval.c seraient appelés eval.c.~1~, eval.c.~2~, et ainsi de suite jusqu'à des noms comme eval.c.~259~ et plus. La variable backup-directory-alist s'applique aux archives numérotées comme aux autres.

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 jamais d'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.

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 quatre 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. backup-by-copying-when-mismatch est t par défaut si vous démarrez Emacs en tant que super-utilisateur. La quatrième variable, backup-by-copying-when-privileged-mismatch, donne l'id utilisateur le plus haut pour lequel backup-by-copying-when-mismatch sera forcé. Ceci est utile lorsque les id-utilisateur les plus petits sont assignés à des utilisateurs système spéciaux, comme root, bin, daemon, etc., qui doivent garder la propriété de leurs fichiers.

Lorsqu'un fichier est géré par un système de contrôle de version ( (Section 16.7), Emacs ne crée normalement pas d'archives pour ce fichier. Mais l'enregistrement et le retrait sont de quelques manières similaires à la création d'archives. Une similarité malheureuse est que ces opérations rompent généralement les liens durs, en déconnectant le nom du fichier visité des noms alternatifs du même fichier. Ceci n'a rien à voir avec Emacs--c'est le système de contrôle de version qui fait cela.

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îne 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.

16.3.3. Ombrer des fichiers

M-x shadow-initialize

Initialise l'ombrage des fichiers.

M-x shadow-define-literal-group

Déclare un fichier unique à être partagé entre plusieurs sites.

M-x shadow-define-regexp-group

Rend tous les fichiers correspondant partagés entre plusieurs sites.

M-x shadow-define-cluster RET nom RET

Définit une grappe de fichier ombrés nom.

M-x shadow-copy-files

Copie tous les fichiers ombrés en attente.

M-x shadow-cancel

Annule l'instruction d'ombrer certains fichiers.

Vous pouvez vous arranger pour garder identique des copies ombrées de certains fichiers en plusieurs endroits--pourquoi pas sur des machines différentes. Pour faire cela, vous deez d'abord créer un groupe de fichiers ombrés, qui est un ensemble de fichiers de même nom partagés entre une liste de sites. Le groupe de fichiers est permanent et s'applique aux futures sessions d'Emacs aussi bien qu'à celle en cours. Une fois le groupe créé, chaque fois que vous quittez Emacs, il copiera le fichier que vous avez édité dans les autres fichiers de son groupe. Vous pouvez aussi lancer cette copie sans quitter Emacs, en tapant M-x shadow-copy-files.

Pour créer un groupe de fichiers, utilisez M-x shadow-define-literal-group ou M-x shadow-define-regexp-group. Voir leurs chaînes de documentation pour plus d'informations.

Avant de copier un fichier dans ses fichiers ombres, Emacs demande confirmation. Vous pouvez répondre "no" pour annuler la copie de ce fichier, cette fois. Si vous voulez annuler de manière permanente l'ombrage de certains fichiers, utilisez M-x shadow-cancel pour éliminer ou changer le groupe de fichiers ombrés.

Une grappe ombrée est un groupe de postes partageant des répertoires, pour lequel copier depuis ou vers l'un d'eux est suffisant pour mettre à jour le fichier sur chacun d'eux. Chaque grappe ombrée a un nom, et spécifie l'adresse réseau d'un poste primaire (celui sur lequel on copie le fichier), et une expression rationnelle qui correspond aux noms de tous les autres postes de la grappe. Vous pouvez définir une grappe ombrée avec M-x shadow-define-cluster.

16.3.4. Mise à jour automatique de timbres dateurs

Vous pouvez placer un timbre dateur dans un fichier, pour qu'il soit mis à jour automatiquement chaque fois que vous éditez et enregistrez le fichier. Le timbre dateur doit se trouver dans les huit premières lignes du fichier, et vous devez l'insérer de cette manière :

Time-stamp: <>

ou ainsi :

Time-stamp: ""

Ajoutez alors la fonction crochet time-stamp au crochet write-file-hooks; cette fonction crochet mettra automatiquement à jour le timbre dateur, en insérant la date et l'heure de la sauvegarde di fichier. Vous pouvez aussi utiliser la commande M-x time-stamp pour mettre à jour manuellement le timbre dateur. Pour d'autres personnalisations, voir le groupe de personnalisation time-stamp. Notez que les champs non numériques du timbre dateur sont formatés selon votre localisation. (Section B.5).