Vim: jakie są wszystkie możliwe rozszerzenia plików wymiany?

32

Kiedy edytujesz plik w vimie, generuje plik wymiany o takiej samej nazwie jak twój bieżący plik, ale z .swprozszerzeniem.

Jeśli .swpjest już zajęty, to generuje jeden po .swodrugim. Jeśli to już zostało zrobione, otrzymasz .swaitp. Itp.

Nie mogłem znaleźć żadnej dokumentacji dotyczącej dokładnej kolejności zastępowania nazw dla tych plików. Czy ktoś może wyjaśnić, jaką konwencją są wybrane rozszerzenia?

Newb
źródło
Zobacz także: Vi i Vim
kot

Odpowiedzi:

44

Konkretny fragment kodu, którego szukasz (i komentarz) znajduje się w 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
źródło
22

Informacje z fragmentu kodu znajdują się w pomocy Vima. Zobacz :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
źródło
17

W, nieco łatwiejsze dla oczu, regex-speak:

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

Źródłem tego jest własny plik gitignore Githuba dla Vima .

rubel
źródło
Wygląda na to, że niepoprawnie pasuje do „.swq” do „.swz”.
Eric Towers
@EricTowers To powinno być teraz poprawne.
rubel
2
Być może ważniejsze ... Czy naciskałeś łatkę na git? :-)
Eric Towers
9

wystarczająco dobry .gitignore

Podczas gdy inne odpowiedzi tutaj są wyraźnie bardziej technicznie kompletne, tutaj jest wystarczająco dobry wpis dla większości .gitignores, o to mi chodziło najczęściej:

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

Jak widać z innych odpowiedzi, vimmożna utworzyć setki innych nazw, ale trzeba by ułożyć 16 plików wymiany, zanim to się nie powiedzie. Uogólniając na coś takiego, *.s[a-z][a-z]może wydawać się bardziej poprawne, będzie również pasować do wielu prawidłowych rozszerzeń, co w przypadku .gitignoreoznacza, że ​​te pliki nie będą śledzone git. Nigdy nie udało mi się utworzyć 16 plików wymiany dla tego samego pliku w ciągu 20 lat użytkowania, vimwięc mam nadzieję, że uda ci się zrobić to samo, a to zadziała dla Ciebie.

bardziej rygorystyczna wersja

Jak wskazano w komentarzach Programiści Flash mogą mieć .swfpliki, więc wolisz

*.sw[g-p]

które nadal będą ignorować 10 plików wymiany, co jest wystarczające dla większości ludzi. Jedyną smutną częścią jest to, że tracisz mnemonik „zamiany”.

pisklęta
źródło
2
Chyba że czegoś mi brakuje, to tylko złapie „swp”, ponieważ następny to „swo”, a nie „swq”. Osobiście używam „* .sw [ap]” z podanego przez ciebie powodu, a także dlatego, że czyta „zamień” :)
JoL
1
Aby uniknąć ignorowania rzeczy, które nie są plikami wymiany vim, .sw2lub .sw$które powinny być śledzone w repozytorium.
pisklęta
2
Pamiętaj, aby dołączyć swoje .swfpliki. Lub uaktualnij programistów Flash do wersji HTML5 :-)
Jan Fabry
3
Możesz uniknąć przechwytywania najbardziej wiarygodnych plików, sprawdzając wiodące .lub _dodane również.
IMSoP
2
Sam odkryłem *.sw[a-p]mnemonikę. Uwielbiam to :)
Wayne Werner
1

Ta alternatywa .gitignore powinna zadowolić wszystkich. Drugi wiersz neguje ignorowanie „* .swf”.

*.sw[a-p]
!*.swf
zeozod
źródło