Можно ли сделать копию оригинального файла перед записью нового буфера в файл, не выходя из vim и не копируя его вручную?
2 ответа
Да; У меня есть это в моем .vimrc
:
set backup
function! BackupDir()
if has('win32') || has('win64')
let l:backupdir=$VIM.'/backup/'.
\substitute(expand('%:p:h'), '\:', '~', '')
else
let l:backupdir=$HOME.'/.vim/backup/'.
\substitute(expand('%:p:h'), '^'.$HOME, '~', '')
endif
if !isdirectory(l:backupdir)
call mkdir(l:backupdir, 'p', 0700)
endif
let &backupdir=l:backupdir
let &backupext=strftime('~%Y-%m-%d_%H-%M-%S~')
endfunction
autocmd! bufwritepre * call BackupDir()
Это заставляет Vim сохранять файл резервной копии с уникальным именем каждый раз, когда я сохраняю какой-либо файл. Резервные копии сохраняются в ~/.vim/backup
(в Linux) в иерархии каталогов, которая копирует исходные файлы. Это действительно легко найти файл резервной копии, когда мне нужно. Я настроил это один раз и забыл; Мне это нужно очень редко (так как обычно вся история хранится в git), но когда я это делаю, это просто спасатель.
(кстати, только что проверил размер моего текущего ~/.vim/backup
, и он составляет 1,3 ГБ после ~ 2 лет работы на этой системе; возможно, мне скоро понадобится очистить)
Вы имеете в виду, что вы уже внесли некоторые изменения в файл в Vim, который вы собираетесь :write
, но хотите сделать резервную копию исходного файла, который все еще находится на диске?
Вы можете запустить команду внешней оболочки прямо из Vim. Vim :help cmdline-special
избегают жесткого кодирования текущего имени файла, так что вы можете легко превратить это в пользовательское отображение или команду:
:!cp % %.bak
В качестве альтернативы, вы можете использовать стек отмены Vim: First :earlier 1f
команда для временного восстановления исходного файла :write %.bak
, затем :later 1f
.
Если вы ищете полное решение для резервного копирования, мой плагин writebackupVersionControl также имеет такую команду, как :WriteBackupOfSavedOriginal
.