2014-11-04 3 views
11

Ich bin ein benutzerdefiniertes vimrc, um meinen Workflow zu verbessern, und ich mochte die Idee, ein zentralisiertes Verzeichnis zu setzen, um alle Backup, Swap und Dateien rückgängig zu machen, wie folgt:Warum VIM Backup-Dateinamen sind nicht korrekt? 'backupdir' -Option nicht wie erwartet

" === BACKUP SETTINGS === 
" turn backup ON 
set backup 
set backupdir=~/.vim/backup// 

" === SWAP FILES === 
" turn swap files ON 
set swapfile 
set directory=~/.vim/swap// 

" === UNDO FILES === 
" turn undofiles ON 
set undofile 
set undodir=~/.vim/undo// 

der doppelte Schrägstrich sollte in einem Dateinamen Expansion führen, wo das resultierende Backup/swap/rückgängig macht Dateinamen der vollständige Pfad sein wird, mit % jeden /, so etwas wie %home%username%path%to%your%file.ext ersetzen.

Alles funktioniert perfekt zum Austauschen und Rückgängigmachen von Dateien, aber Backups funktioniert nicht, Erstellen von Dateinamen im Format file.ext~ ohne die vollständige Pfaderweiterung, was bedeutet, dass wenn ich zwei Dateien mit dem gleichen Namen bearbeiten, die Sicherung der ersten ist verloren (von der zweiten überschrieben).

Hat jemand eine Ahnung von diesem Problem?

+0

Haben Sie Neuigkeiten dazu? – tforgione

+1

@DragonRock, no ... Ich habe keine Nachrichten ... –

+0

Schade, danke für die Zeit zu beantworten! – tforgione

Antwort

9

Es scheint, wie die 'backupdir' Option nicht die Übersetzung des vollständigen absoluten Pfad in einem Dateinamen unterstützen (% für Pfad Separatoren) wie 'directory' und 'undodir' tun. Zumindest nichts ist unter :help 'backupdir' erwähnt.

Da dies inkonsistent ist, und ich sehe Ihren Anwendungsfall, sollten Sie eine Anfrage an die vim_dev mailing list senden. Tatsächlich gibt es bereits ein solches Patch in der (gaaanz lang) Patch-Warteschlange (:help todo.txt):

7 The 'directory' option supports changing path separators to "%" to make 
    file names unique, also support this for 'backupdir'. (Mikolaj Machowski) 
    Patch by Christian Brabandt, 2010 Oct 21. 

Bitte freundlich auf die vim_dev mailing list Lobby seine Priorität angehoben zu haben!

3

Ich füge diese Antwort hinzu, weil ich es wirklich frustrierend finde.

Dies könnte ein Workaround sein, bis Vim die Pfadübersetzungsfunktionalität zu backupdir hinzufügt. Was ich tat, fügt die folgende Zeile in meinem .vimrc:

autocmd BufWritePost * :execute ':w! ' ."$HOME/.vim/backups/" . substitute(escape(substitute(expand('%:p'), "/", "%", "g"), "%"), ' ', '\\ ', 'g') 

Im Grunde jedes Mal wenn Sie eine Datei speichern, wird es auch eine Kopie in $HOME/.vim/backups speichern.

+1

danke für Ihren Vorschlag. Ich habe das versucht, aber das Hauptproblem ist, dass es die neue Version der Datei zweimal speichert, also enden wir mit zwei Kopien derselben Sache und verlieren die alte. Der Zweck der Sicherung besteht darin, die vorherige Version im 'backupdir' zu speichern. Sehen Sie sich meine Lösung in der Antwort an, die ich gerade gepostet habe. –

+1

Schön, ich sehe was du meinst. Wenn ich jedoch meistens eine Datei durcheinander bringe, vermassle ich sie mit etwas anderem als vim (git, oder 'rm' ...), so dass die Sicherung die letzte Version dessen ist, was ich mit vim gespeichert habe. und wenn ich etwas mit vim vermassle, habe ich immer noch das 'undofile', das mir helfen kann, mein Backup zu bekommen. – tforgione

+1

Ich verstehe und sehe Ihren Standpunkt. Ich denke, es ist nur eine Frage von verschiedenen Anwendungsfällen, beide gültig. Ihr Skript führt neue Funktionen ein, da in der Dokumentation angegeben ist, dass die Sicherungsfunktion die alte Version beibehalten sollte. –

5

Einige Zeit ist bereits vergangen und es scheint, dass dieser Bug nicht in absehbarer Zeit behoben wird. Der Vorschlag, der von @DragonRock präsentiert wird, ist ein netter, aber verfehlt einen entscheidenden Punkt, nämlich: das generierte Backup sollte eine Kopie der aktuellen Version der Datei sein, BEFORE überschreiben. Also habe ich die Grundidee eines automatischen Befehls, aber mit einem anderen Ereignis BufWritePre verwendet, um eine Kopie der Datei zu den Backup-Zielen zu machen, bevor die Änderungen auf den Datenträger übertragen werden.

Dies ist die letzte Lösung, die genau das gleiche Verhalten hat, wie wir aus dem gebrochenen Feature erwarten würden (funktioniert nur unter Linux):

" === BACKUP SETTINGS === 
" turn backup OFF 
" Normally we would want to have it turned on. See bug and workaround below. 
" OBS: It's a known-bug that backupdir is not supporting 
" the correct double slash filename expansion 
" see: https://code.google.com/p/vim/issues/detail?id=179 
set nobackup 

" set a centralized backup directory 
set backupdir=~/.vim/backup// 

" This is the workaround for the backup filename expansion problem. 
autocmd BufWritePre * :call SaveBackups() 

function! SaveBackups() 
    if expand('%:p') =~ &backupskip | return | endif 

    " If this is a newly created file, don't try to create a backup 
    if !filereadable(@%) | return | endif 

    for l:backupdir in split(&backupdir, ',') 
    :call SaveBackup(l:backupdir) 
    endfor 
endfunction 

function! SaveBackup(backupdir) 
    let l:filename = expand('%:p') 
    if a:backupdir =~ '//$' 
     let l:backup = escape(substitute(l:filename, '/', '%', 'g') . &backupext, '%') 
    else 
     let l:backup = escape(expand('%') . &backupext, '%') 
    endif 

    let l:backup_path = a:backupdir . l:backup 
    :silent! execute '!cp ' . resolve(l:filename) . ' ' . l:backup_path 
endfunction 

Beachten Sie, dass der Auto-Befehl wurde auf eine bestimmte Funktion extrahiert zur Klarheit. Auch die set nobackup ist wichtig, weil sonst doppelte Sicherungen (eine mit dem richtigen Namen und eine mit dem falschen Namen) generiert würde.

Es werden Backups übersprungen, die erwartungsgemäß backupskip entsprechen, mehrere Backup-Ziele unterstützen und die Datei backupext (die Dateiendung, nützlich für die Suche) anhängen.

Es wird auch übersprungen, wenn der aktuell gespeicherte Puffer brandneu ist (oder, mit anderen Worten, wenn Sie eine neue Datei direkt mit vim erstellen). Es hätte keinen Sinn, eine leere Sicherungsdatei zu erstellen, und tatsächlich würde es einen Fehler verursachen, weil die Datei immer noch nicht zum Kopieren da ist. Danke @Yahya für die suggestion!

Der Befehl silent! verhindert, dass der Sicherungsvorgang den normalen Ablauf des Dateispeichervorgangs durch Wiederholung der Sicherungserstellung oder Fehler stört (andernfalls könnte der Speichervorgang selbst fehlschlagen).

+1

Der Fehlerbericht ist umgezogen nach https://github.com/vim/vim/issues/179 –

1

Neben die Antwort von Victor Schröder, ich schlage vor, mit diesem automatischen Befehl statt:

autocmd BufWritePre * if filereadable(@%) | :call SaveBackups() | endif 

Es sei denn, dies wird in dem Fall arbeiten, die Sie eine neue Datei direkt mit vim sind openning. Und es macht keinen Sinn, ein leeres Backup zu speichern ...

+0

Nice one! Ich füge das zu meiner eigenen Version hinzu, aber ich ziehe es vor, den Scheck einfach in der Funktion auf Existenz zu setzen. –

Verwandte Themen