Wie kann ich verhindern, dass Vim zu viele Dateien zurücklässt (z. B. Auslagern, Sichern, Rückgängigmachen)?

13

Standardmäßig vimbleiben Auslagerungsdateien in meinem Projektverzeichnis und bei Abstürzen bleiben Sicherungsdateien erhalten.

Kann ich das verhindern? Oder muss ich alle .VCSignoreDateien meiner Projekte aktualisieren ?

Martin Tournoij
quelle

Antworten:

16

Sicherungs-Dateien

Standardmäßig hinterlässt Vim keine Sicherungsdateien. Es handelt sich lediglich um temporäre Dateien, die vorhanden sind, während Vim den Puffer auf der Festplatte speichert. Wie in :help backup-tablediesem Verhalten beschrieben, kann mit den Optionen 'backup'und gesteuert werden 'writebackup':

'backup' 'writebackup'  action  ~
   off       off    no backup made
   off       on     backup current file, deleted afterwards (default)
   on        off    delete old backup, backup current file
   on        on     delete old backup, backup current file

Dateien austauschen

Bei Auslagerungsdateien kann es nützlich sein, sie in einem dedizierten Verzeichnis zu sammeln. Dies kann mit der 'directory'Option erfolgen. Beispielsweise

:set directory^=$HOME/.vim/tmp//

wird $HOME/.vim/tmpzum Kopf der Liste der Verzeichnisse hinzugefügt , die Vim beim Erstellen einer Auslagerungsdatei zu verwenden versucht. Durch //das Nachstellen codiert Vim den gesamten Pfadnamen der Datei, sodass keine Kollisionen mit Dateien mit ähnlichem Namen aus verschiedenen Verzeichnissen auftreten.

Vorsichtsmaßnahme : Dadurch wird die Fähigkeit von Vim, zu bemerken, wenn mehrere Benutzer versuchen, dieselbe Datei zu bearbeiten, effektiv deaktiviert, da die Auslagerungsdateien an verschiedenen Orten gespeichert sind.

Das folgende Snippet (angepasst von tpopes vimrc ) deaktiviert auch die Auslagerungsdatei für einen Puffer, wenn sie nicht geändert wird. Wenn Vim / Ihr Computer abstürzt, wenn mehrere Dateien geöffnet sind, bleiben nur die Auslagerungsdateien übrig für geänderte Dateien.

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

Vorsichtsmaßnahme : Da die Auslagerungsdatei nur vorhanden ist, wenn der Puffer geändert wird, hat dies einen ähnlichen Effekt wie die Einstellung 'directory'. Wenn der Puffer unverändert ist, kann ein anderer Vim ihn ohne Vorankündigung bearbeiten. Wenn der zweite Vim speichert, bevor der erste weitere Änderungen vornimmt, werden diese erst bemerkt, wenn der Benutzer versucht, die Datei zu speichern, oder wenn Vim durch eine Aktion veranlasst wird, zu überprüfen, ob die Datei geändert wurde.

Jamessan
quelle
5

Ich verwende meine .vimrcauf mehreren Computern, einschließlich gemeinsam genutzter Server. Ich möchte nicht unbedingt, dass die Leute die Dateien sehen, an denen ich arbeite, und ich mag es, mein Homeverzeichnis relativ sauber zu halten. Das ist also meine Lösung, die unter Linux und Mac OS X einwandfrei funktioniert.

" Sets central temp file location, to prevent local default behavior.
if isdirectory($HOME . '/.vim/.tmp') == 0
  :silent !mkdir -m 700 -p ~/.vim/.tmp > /dev/null 2>&1
endif

set backupdir=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,
set directory=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,

Beachten Sie, dass dadurch ein .tmpVerzeichnis erstellt wird, unter dem ~/.vimes noch nicht existiert. Dies wäre das neue Zuhause Ihrer Auslagerungsdateien. Für Undo-Dateien habe ich auch folgendes in meinem .vimrc(was ziemlich ähnlich ist):

if exists("+undofile")
  " undofile -- This allows you to use undos after exiting and 
  "             restarting. NOTE: only present in 7.3+
  "             :help undo-persistence
  if isdirectory( $HOME . '/.vim/.undo' ) == 0
    :silent !mkdir -m 700 -p ~/.vim/.undo > /dev/null 2>&1
  endif
  set undodir=~/.vim/.undo
  set undofile
endif
HAL 9001
quelle
1

Das mache ich in meinem vimrc:

fun! MkdirIfNeeded(dir, flags, permissions)
    if !isdirectory(a:dir)
        call mkdir(a:dir, a:flags, a:permissions)
    endif
endfun

" Set (& create if needed) a temp directory to keep backup & swap files
if has('win32')
    let whoami = substitute(system("whoami /LOGONID"), '\n', '', '')
    let tmpdir = 'C:/tmp/vim_' . whoami
else
    let whoami = substitute(system("whoami"), '\n', '', '')
    let tmpdir = '/var/tmp/vim_' . whoami
endif
call MkdirIfNeeded(tmpdir, 'p', 0700)

let &backupdir = tmpdir
let &dir = tmpdir
let &undodir = tmpdir

/var/tmp/vim_<username>Hiermit werden alle vim-bezogenen Dateien erstellt und gespeichert. Halten Sie Ihr Projektverzeichnis sauber.

Durch whoamidie Verwendung von wird sichergestellt, dass Sie den vimrc global (dh für den Benutzer und root) verwenden können, während Sie immer noch separate Verzeichnisse verwenden. Wenn Sie dies nicht benötigen, können Sie es durch ein fest codiertes Verzeichnis ersetzen, um den Start zu beschleunigen. Sie könnten auch ein ~/.vim/Verzeichnis verwenden, aber ich verwende es gerne, /var/tmpweil es normalerweise ein separates Dateisystem ist.

Ich benutze, /var/tmpweil /tmpbeim Neustart oft gelöscht wird. Sie möchten dieses Verzeichnis wahrscheinlich nicht für die ganze Welt beschreibbar machen, da die Benutzer dort Dateien ablegen können, um beim Öffnen einer Datei potenziell schädliche Aktionen auszuführen.

Martin Tournoij
quelle
1
/var/tmpist immer von der Welt beschreibbar - es ist ein temporäres Systemverzeichnis. (Nun, Sie können es so ändern, dass es nicht so ist, aber das ist eines der Dinge, bei denen Unix-ähnliche Systeme gerne zulassen, dass Sie die Teile behalten, nachdem Sie sie zerbrochen haben.) Wenn Sie einen anderen Benutzer im System haben, kann er /var/tmp/vim_«your_username»mit Berechtigungen seiner Wahl erstellen . Und füllen Sie es dann mit Symlinks zu Ihren wichtigen Dateien, die wahrscheinlich von vim tempfiles zerstört werden.
Derobert
@derobert Nur wenn es nicht existiert. Wenn Sie dieses systemweite Verzeichnis verwenden und viele Benutzer haben, möchten Sie wahrscheinlich die Erstellung dieses Verzeichnisses zu dem hinzufügen, adduserwas auch immer Sie verwenden, um Benutzer zu erstellen . In jedem Fall verwenden die meisten Leute Vim auf vertrauenswürdigen Rechnern (aber Ihr Kommentar ist als solcher gut).
Martin Tournoij
Richtig, nur wenn es nicht existiert. Was in einem temporären Systemverzeichnis unvorhersehbar passiert, wenn diese tempfiles bereinigt werden. Ich bin mir nicht sicher, warum du es nicht einfach $HOMEirgendwo hineingesteckt hast .
Derobert
@derobert Na ja, /var/ist ein anderes Dateisystem. Die Theorie ist, dass es eine Menge von Schreibvorgängen auf zu verhindern /, /usroder /home, was zu weniger Fragmentierung & Risiko einer Beschädigung von Dateien im Fall eines Absturzes ... Dies ist auch , warum Briefkästen und Sachen auf sind /varstandardmäßig und nicht in dem homedir ...
Martin Tournoij