Можно ли сделать копию оригинального файла перед записью нового буфера в файл, не выходя из vim и не копируя его вручную?

2 ответа2

1

Да; У меня есть это в моем .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 лет работы на этой системе; возможно, мне скоро понадобится очистить)

0

Вы имеете в виду, что вы уже внесли некоторые изменения в файл в Vim, который вы собираетесь :write , но хотите сделать резервную копию исходного файла, который все еще находится на диске?

Вы можете запустить команду внешней оболочки прямо из Vim. Vim :help cmdline-special избегают жесткого кодирования текущего имени файла, так что вы можете легко превратить это в пользовательское отображение или команду:

:!cp % %.bak

В качестве альтернативы, вы можете использовать стек отмены Vim: First :earlier 1f команда для временного восстановления исходного файла :write %.bak , затем :later 1f .

Если вы ищете полное решение для резервного копирования, мой плагин writebackupVersionControl также имеет такую команду, как :WriteBackupOfSavedOriginal .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .