Vim: ¿cuáles son todas las posibles extensiones de archivos de intercambio?

32

Cuando edita un archivo en vim, genera un archivo de intercambio con el mismo nombre que su archivo actual, pero con una .swpextensión.

Si .swpya está tomado, genera uno a .swouno. Si eso ya está tomado, entonces obtienes .swa, etc., etc.

No pude encontrar ninguna documentación sobre cuál es el orden exacto de asignación de nombres para estos archivos, ¿alguien puede aclarar por qué convención se eligen las extensiones?

Newb
fuente
Ver también: Vi y Vim
gato

Respuestas:

44

El fragmento de código particular que está buscando (y comenta) está en 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
fuente
22

La información del fragmento de código está en la ayuda de Vim. Ver :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
fuente
17

En, un poco más fácil para los ojos, regex-speak:

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

La fuente de esto es el propio archivo gitignore de Github para Vim .

rublo
fuente
Esto parece coincidir incorrectamente ".swq" con ".swz".
Eric Towers
@EricTowers Debería ser correcto ahora.
rublo
2
Quizás más importante ... ¿Has presionado el parche en git? :-)
Eric Towers
9

suficientemente bueno .gitignore

Si bien las otras respuestas aquí son claramente más completas técnicamente, aquí hay una entrada lo suficientemente buena para la mayoría de los .gitignores, que es donde me he preocupado por esto con mayor frecuencia:

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

Como puede ver en las otras respuestas, vimpuede crear cientos de otros nombres, pero tendría que acumular 16 archivos de intercambio antes de que esto fallara. Al generalizar a algo como *.s[a-z][a-z]podría parecer más correcto, también coincidirá con muchas extensiones válidas, lo que en el caso .gitignoresignifica que esos archivos no serán rastreados git. Nunca he logrado crear 16 archivos de intercambio para el mismo archivo en 20 años de uso, vimasí que espero que puedas hacer lo mismo y esto funcionará para ti.

versión más estricta

Como se señaló en los comentarios, los desarrolladores de Flash pueden tener .swfarchivos, por lo que puede preferir

*.sw[g-p]

que aún ignorará 10 archivos de intercambio, lo cual es suficiente para la mayoría de las personas. La única parte triste es que pierdes la mnemotecnia de "intercambio".

polluelos
fuente
2
A menos que me falte algo, eso solo atrapará "swp", ya que el siguiente es "swo", no "swq". Personalmente, uso "* .sw [ap]" por la razón que diste y también porque dice "swap" :)
JoL
1
Para evitar ignorar cosas que no son archivos de intercambio vim .sw2o .sw$que deberían rastrearse en el repositorio.
pollitos
2
Recuerde incluir sus .swfarchivos. O actualice sus desarrolladores Flash a HTML5 :-)
Jan Fabry
3
Puede evitar la captura de la mayoría de los archivos legítimos al verificar el líder .o el _que también se agrega.
IMSoP
2
Descubrí la *.sw[a-p]mnemónica por mí mismo. Me encanta :)
Wayne Werner
1

Esta alternativa .gitignore debería satisfacer a todos. La segunda línea niega ignorar '* .swf'.

*.sw[a-p]
!*.swf
zeozod
fuente