Vim: quais são todas as extensões possíveis de swapfile?

32

Quando você está editando um arquivo no vim, ele gera um arquivo de troca com o mesmo nome que o arquivo atual, mas com uma .swpextensão.

Se .swpjá estiver em uso, ele gera um a .swoum. Se isso já foi feito, você recebe .swa, etc. etc.

Não encontrei nenhuma documentação sobre qual é a ordem exata de fallback de nomes para esses arquivos. Alguém pode esclarecer com que convenção as extensões são escolhidas?

Newb
fonte
Veja também: Vi e Vim
cat

Respostas:

44

O trecho de código específico que você está procurando (e comenta) está em 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
fonte
22

As informações do snippet de código estão na ajuda do Vim. Veja :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
fonte
17

Em, um pouco mais fácil para os olhos, regex-speak:

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

A fonte disso é o arquivo gitignore do Github para o Vim .

rublo
fonte
Isso parece corresponder incorretamente ".swq" a ".swz".
Eric Torres
@EricTowers Deve estar correto agora.
Rublo
2
Talvez o mais importante ... Você já trabalhou no patch no git? :-)
Eric Towers
9

bom o bastante .gitignore

Enquanto as outras respostas aqui são claramente mais tecnicamente completas, aqui é uma entrada boa o suficiente para a maioria das .gitignores, que é onde eu me importo com isso com mais frequência:

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

Como você pode ver nas outras respostas, vimpode criar centenas de outros nomes, mas você teria que empilhar 16 arquivos de troca antes que isso falhasse. Ao generalizar para algo como *.s[a-z][a-z]poderia parecer mais correto, também corresponderá a muitas extensões válidas que, no caso de .gitignoremeios, não serão rastreados por esses arquivos git. Eu nunca consegui criar 16 arquivos de troca para o mesmo arquivo em 20 anos de uso, vimentão espero que você consiga fazer o mesmo e isso funcionará para você.

versão mais rigorosa

Conforme indicado nos comentários, os desenvolvedores do Flash podem ter .swfarquivos, então você pode preferir

*.sw[g-p]

que ainda ignorará 10 arquivos de troca, o que é suficiente para a maioria das pessoas. A única parte triste é que você perde o mnemônico "swap".

filhotes
fonte
2
A menos que eu esteja perdendo alguma coisa, isso só vai pegar "swp", já que o próximo é "swo" e não "swq". Pessoalmente, eu uso "* .sw [ap]" pela razão que você deu e também porque se lê "swap" :) #
317 JoL
1
Para evitar ignorar coisas que não são arquivos de troca do vim, como .sw2ou .sw$que devem ser rastreadas no repositório.
pintainhos
2
Lembre-se de incluir seus .swfarquivos. Ou atualizar seus desenvolvedores de Flash para HTML5 :-)
Jan Fabry
3
Você pode evitar que a maioria dos arquivos legítimos seja capturada verificando o líder .ou _que também é adicionado.
IMSOP
2
Eu mesmo descobri o *.sw[a-p]mnemônico. Eu adoro isso :) #
307 Wayne Werner
1

Essa alternativa .gitignore deve satisfazer a todos. A segunda linha nega ignorar '* .swf'.

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