Vim: quali sono tutte le possibili estensioni del file di scambio?


32

Quando si modifica un file in vim, genera un file di scambio con lo stesso nome del file corrente, ma con .swpun'estensione.

Se .swpè già preso, quindi genera uno a .swouno. Se è già stato preso, allora ottieni .swa, ecc. Ecc.

Non sono riuscito a trovare alcuna documentazione su quale sia l'esatto ordine di denominazione e fallback per questi file, qualcuno può chiarire in base a quale convenzione sono state scelte le estensioni?


Vedi anche: Vi e Vim
cat

Risposte:


44

Il particolare pezzo di codice che stai cercando (e commentando) è in 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. */

22

Le informazioni dallo snippet di codice sono nella guida di Vim. Vedi :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.


9

abbastanza buono .gitignore

Mentre le altre risposte qui sono chiaramente più tecnicamente complete, qui c'è una voce abbastanza buona per la maggior parte delle .gitignorequali è dove mi sono preoccupato di questo più spesso:

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

Come puoi vedere dalle altre risposte vimpuoi creare centinaia di altri nomi, ma dovresti impilare 16 file di scambio prima che ciò fallisca. Generalizzando qualcosa come *.s[a-z][a-z]potrebbe apparire più corretto, corrisponderà anche a molte estensioni valide che, nel caso, .gitignoresignifica che quei file non saranno tracciati dagit . Non sono mai riuscito a creare 16 file di scambio per lo stesso file in 20 anni di utilizzo, vimquindi spero che tu riesca a fare lo stesso e questo funzionerà per te.

versione più rigorosa

Come sottolineato nei commenti, gli sviluppatori di Flash potrebbero avere dei .swffile, quindi è preferibile

*.sw[g-p]

che ignorerà comunque 10 file di scambio che è abbastanza per la maggior parte delle persone. L'unica parte triste è che perdi il mnemonico "swap".


2
A meno che non mi manchi qualcosa, questo prenderà solo "swp" poiché il prossimo è "swo" e non "swq". Personalmente, uso "* .sw [ap]" per il motivo che hai indicato e anche perché legge "swap" :)
JoL

1
Per evitare di ignorare cose che non sono simili a file di scambio vim .sw2o .sw$che dovrebbero essere monitorate nel repository.
pulcini,

2
Ricorda di includere i tuoi .swffile. O aggiorna i tuoi sviluppatori Flash a HTML5 :-)
Jan Fabry,

3
Puoi evitare che la maggior parte dei file legittimi venga rilevata controllando il comando principale .o _che viene anche aggiunto.
IMSoP,

2
Ho scoperto *.sw[a-p]me stesso il mnemonico. Lo adoro :)
Wayne Werner il

1

Questa alternativa .gitignore dovrebbe soddisfare tutti. La seconda riga nega di ignorare '* .swf'.

*.sw[a-p]
!*.swf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.