Vim: quelles sont toutes les extensions de fichier d'échange possibles?

32

Lorsque vous modifiez un fichier dans vim, il génère un fichier d'échange du même nom que votre fichier actuel, mais avec une .swpextension.

Si .swpest déjà pris, alors il en génère un .swoun. Si cela est déjà pris, alors vous obtenez .swa, etc. etc.

Je ne pouvais trouver aucune documentation sur l'ordre exact de remplacement pour ces fichiers. Quelqu'un peut-il préciser selon quelle convention les extensions sont choisies?

Newb
la source
Voir aussi: Vi et Vim
Chat

Réponses:

44

Le code particulier que vous recherchez (et commentez) se trouve dans memline.c:

    /* 
     * Change the ".swp" extension to find another file that can be used. 
     * First decrement the last char: ".swo", ".swn", etc. 
     * If that still isn't enough decrement the last but one char: ".svz" 
     * Can happen when editing many "No Name" buffers. 
     */
    if (fname[n - 1] == 'a')        /* ".s?a" */
    {   
        if (fname[n - 2] == 'a')    /* ".saa": tried enough, give up */
        {   
            EMSG(_("E326: Too many swap files found"));
            vim_free(fname);
            fname = NULL;
            break;  
        }
        --fname[n - 2];             /* ".svz", ".suz", etc. */
        fname[n - 1] = 'z' + 1;
    }
    --fname[n - 1];                 /* ".swo", ".swn", etc. */
Thomas Dickey
la source
22

Les informations de l'extrait de code sont dans l'aide de Vim. Voir :h swap-file:

The name of the swap file is normally the same as the file you are editing,
with the extension ".swp".
- On Unix, a '.' is prepended to swap file names in the same directory as the
  edited file.  This avoids that the swap file shows up in a directory
  listing.
- On MS-DOS machines and when the 'shortname' option is on, any '.' in the
  original file name is replaced with '_'.
- If this file already exists (e.g., when you are recovering from a crash) a
  warning is given and another extension is used, ".swo", ".swn", etc.
- An existing file will never be overwritten.
- The swap file is deleted as soon as Vim stops editing the file.

Technical: The replacement of '.' with '_' is done to avoid problems with
       MS-DOS compatible filesystems (e.g., crossdos, multidos).  If Vim
       is able to detect that the file is on an MS-DOS-like filesystem, a
       flag is set that has the same effect as the 'shortname' option.
       This flag is reset when you start editing another file.

                            *E326*
       If the ".swp" file name already exists, the last character is
       decremented until there is no file with that name or ".saa" is
       reached.  In the last case, no swap file is created.
muru
la source
17

Dans, légèrement plus facile pour les yeux, parler regex:

[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-v][a-z]
[._]sw[a-p]

Le fichier gitignore de Github pour Vim en est la source .

rouble
la source
Cela semble correspondre incorrectement ". Swq" à ". Swz".
Eric Towers
@EricTowers Cela devrait être correct maintenant.
Rouble
2
Peut-être plus important… Avez-vous insisté sur Git? :-)
Eric Towers
9

assez bien .gitignore

Alors que les autres réponses ici sont clairement plus complètes techniquement, voici une entrée assez bonne pour la plupart des .gitignores, c’est là que je me suis le plus préoccupé:

# vim swap files
##################
*.sw[a-p]

Comme vous pouvez le constater, d'autres réponses vimpeuvent créer des centaines d'autres noms, mais vous devez empiler 16 fichiers d'échange avant que cela ne soit un échec. En généralisant à quelque chose qui *.s[a-z][a-z]pourrait sembler plus correct, cela correspondra à beaucoup d'extensions valides qui, dans le cas de .gitignoremoyens, ne permettront pas de suivre ces fichiers git. Je n'ai jamais réussi à créer 16 fichiers d'échange pour le même fichier en 20 ans d'utilisation vim. J'espère donc que vous pourrez faire de même et que cela fonctionnera pour vous.

version plus stricte

Comme indiqué dans les commentaires, les développeurs Flash peuvent avoir des .swffichiers et vous préférerez peut-être

*.sw[g-p]

qui ignorera tout de même 10 fichiers d'échange, ce qui est suffisant pour la plupart des gens. La seule partie triste est que vous perdez le mnémonique "swap".

poussins
la source
2
À moins que quelque chose me manque, cela ne fera que capturer "swp" puisque le prochain est "swo" et non "swq". Personnellement, j'utilise "* .sw [ap]" pour la raison que vous avez indiquée et aussi parce qu'il se lit "swap" :)
JoL
1
Pour éviter d'ignorer les éléments qui ne sont pas comme des fichiers d'échange vim .sw2ou .sw$qui devraient être suivis dans le référentiel.
poussins
2
N'oubliez pas d'inclure vos .swffichiers. Ou mettez à niveau vos développeurs Flash vers HTML5 :-)
Jan Fabry
3
Vous pouvez éviter que la plupart des fichiers légitimes ne soient interceptés en recherchant les fichiers principaux .ou _ajoutés.
IMSoP
2
J'ai découvert le *.sw[a-p]mnémonique moi-même. Je l'aime :)
Wayne Werner
1

Cette alternative .gitignore devrait satisfaire tout le monde. La deuxième ligne nie en ignorant "* .swf".

*.sw[a-p]
!*.swf
zéozod
la source