Vim: Was sind alle möglichen Swap-Dateierweiterungen?

32

Wenn Sie eine Datei in vim bearbeiten, wird eine Auslagerungsdatei mit demselben Namen wie Ihre aktuelle Datei, jedoch mit einer .swpErweiterung erstellt.

Wenn .swpbereits vergeben, wird eins zu .swoeins generiert . Wenn das schon vergeben ist, dann bekommst du .swausw. usw.

Ich konnte keine Dokumentation finden, in welcher Reihenfolge die Namen für diese Dateien verwendet werden. Kann jemand klären, nach welcher Konvention die Erweiterungen ausgewählt wurden?

Newb
quelle
Siehe auch: Vi und Vim
cat

Antworten:

44

Das bestimmte Stück Code, das Sie suchen (und Kommentar), ist 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. */
Thomas Dickey
quelle
22

Die Informationen aus dem Code-Snippet sind in Vims Hilfe enthalten. Siehe :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
quelle
17

In, etwas augenschonender, Regex-Sprache:

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

Die Quelle hierfür ist Githubs eigene Gitignore-Datei für Vim .

Rubel
quelle
Dies scheint falsch mit ".swq" bis ".swz" übereinzustimmen.
Eric Towers
@EricTowers Es sollte jetzt korrekt sein.
Rubel
2
Vielleicht wichtiger ... Hast du bei Patch bei Git gepusht? :-)
Eric Towers
9

gut genug .gitignore

Während die anderen Antworten hier deutlich vollständiger sind, ist hier ein Eintrag, der für die meisten s gut genug.gitignore ist, worum ich mich am häufigsten gekümmert habe:

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

Wie Sie aus den anderen Antworten ersehen vimkönnen, können Hunderte anderer Namen erstellt werden, Sie müssten jedoch 16 Auslagerungsdateien stapeln, bevor dies fehlschlagen würde. Wenn Sie auf etwas verallgemeinern, das *.s[a-z][a-z]korrekter aussehen könnte, werden auch viele gültige Erweiterungen berücksichtigt, wodurch .gitignorediese Dateien im Falle von Mitteln nicht nachverfolgt werden git. Ich habe es in 20 Jahren noch nie geschafft, 16 Auslagerungsdateien für dieselbe Datei zu erstellen. vimIch hoffe, Sie können es schaffen, dasselbe zu tun, und das wird für Sie funktionieren.

strengere Version

Wie in den Kommentaren erwähnt, haben Flash-Entwickler möglicherweise .swfDateien, die Sie bevorzugen

*.sw[g-p]

Dabei werden immer noch 10 Auslagerungsdateien ignoriert, was für die meisten Menschen ausreichend ist. Der einzige traurige Teil ist, dass Sie die "Swap" -Mnemonik verlieren.

Küken
quelle
2
Es sei denn, ich vermisse etwas, das wird nur "swp" abfangen, da das nächste "swo" ist, nicht "swq". Persönlich verwende ich "* .sw [ap]" für den von Ihnen angegebenen Grund und auch, weil es "Swap" lautet :)
JoL
1
Um zu vermeiden, Dinge zu ignorieren, die keine vim-Swap-Dateien sind .sw2oder .sw$die im Repo nachverfolgt werden sollten.
Küken
2
Denken Sie daran, Ihre .swfDateien einzuschließen. Oder aktualisieren Sie Ihre Flash-Entwickler auf HTML5 :-)
Jan Fabry
3
Sie können verhindern, dass die meisten legitimen Dateien abgefangen werden, indem Sie nach dem führenden .oder _dem hinzugefügten suchen.
IMSoP
2
Ich habe das *.sw[a-p]Mnemonikum selbst entdeckt. Ich liebe es :)
Wayne Werner
1

Diese .gitignore-Alternative sollte alle zufriedenstellen. In der zweiten Zeile wird das Ignorieren von '* .swf' negiert.

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