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

32

Quando você está editando um arquivo no vim, ele gera um swapfile com o mesmo nome do arquivo atual, mas com uma extensão .swp .

Se .swp já foi obtido, então ele gera um a .swo one. Se isso já foi feito, você recebe .swa etc. etc.

Não consegui encontrar nenhuma documentação sobre qual é a ordem exata de nomeação-recuo para esses arquivos. Alguém pode esclarecer por qual convenção as extensões foram escolhidas?

    
por Newb 29.11.2016 / 02:02

5 respostas

44

A parte específica do código que você está procurando (e comente) 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. */
    
por 29.11.2016 / 02:32
22

As informações do snippet de código sã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.
    
por 29.11.2016 / 02:48
15

Em, ligeiramente mais fácil para os olhos, fala regex:

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

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

    
por 29.11.2016 / 06:09
9

bom o suficiente .gitignore

Embora as outras respostas aqui estejam claramente mais tecnicamente completas, aqui está uma entrada boa o suficiente para a maioria dos .gitignore s, que é onde eu me preocupo com isso com mais frequência:

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

Como você pode ver nas outras respostas vim pode 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] pode parecer mais correto, ele também corresponderá a muitas extensões válidas que, no caso de .gitignore , significa que esses arquivos não serão rastreados por git . Eu nunca consegui criar 16 arquivos de swap para o mesmo arquivo em 20 anos usando vim , então espero que você consiga fazer o mesmo e isso funcionará para você.

versão mais rigorosa

Como apontado nos comentários, os desenvolvedores Flash podem ter .swf arquivos, então você pode preferir

*.sw[g-p]

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

    
por 29.11.2016 / 21:12
0

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

*.sw[a-p]
!*.swf
    
por 28.12.2017 / 21:10

Tags