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).
Haben Sie Neuigkeiten dazu? – tforgione
@DragonRock, no ... Ich habe keine Nachrichten ... –
Schade, danke für die Zeit zu beantworten! – tforgione