Создание «умных» резервных копий редактируемых файлов

VIM*
Резервные копии отредактированных файлов не раз помогали мне восстановить удалённые строки кода, но механизм создания backup'ов в VIM по-умолчанию достаточно неудобен — кому нужны *~-файлы, засоряющие каталог рабочего проекта?

Предлагаю вам красивое решение, которое, надеюсь, спасёт в трудную минуту и вас, или по крайней мере сэкономит драгоценное время, которое пользователи VIM так любят ценить ;-)


Раз уж мы решили не хранить файлы backup'ов в каталоге с оригинальными файлами, то придумаем для этих целей отдельный каталог. Я посчитал удобным хранить копии в ~/.vim/backup/.

Чтобы не запутаться в файлах с одинаковыми именами из разных каталогов, будем создавать в нашем копию дерева подкаталогов файловой системы, где находился оригинальный файл. Например, если редактируемый файл располагается в каталоге /etc/lighttpd/, файл с резервной копией будет помещён в ~/.vim/backup/etc/lighttpd/. Кроме того, во избежании лишнего ветвления, для файлов из домашнего каталога будем принудительно сворачивать локальный путь в привычную ~.

Дополнительно будем добавлять к имени файла резервной копии дату создания, что позволит хранить ежедневные (при необходимости ежемесячные или ежечасные) копии файлов. Например такие: ~/.vim/backup/etc/lighttpd/lighttpd.conf~2009-08-11~.

Реализация заняла 10 минут обеденного перерыва, добавляем в локальный ~/.vimrc следующий код:

" включить сохранение резервных копий
set backup

" сохранять умные резервные копии ежедневно
function! BackupDir()
	" определим каталог для сохранения резервной копии
	let l:backupdir=$HOME.'/.vim/backup/'.
			\substitute(expand('%:p:h'), '^'.$HOME, '~', '')

	" если каталог не существует, создадим его рекурсивно
	if !isdirectory(l:backupdir)
		call mkdir(l:backupdir, 'p', 0700)
	endif

	" переопределим каталог для резервных копий
	let &backupdir=l:backupdir

	" переопределим расширение файла резервной копии
	let &backupext=strftime('~%Y-%m-%d~')
endfunction

" выполним перед записью буффера на диск
autocmd! bufwritepre * call BackupDir()


К сожалению, не имею возможности проверить и поправить код для работы в Windows.

Комментарии и критика приветствуется!

P.S.: чуть было не забыл, мой .vimrc в догонку :-)
+26
11 августа 2009, 22:08
29
shutnik 12,9

комментарии (14)

+1
merlin_rterm #
А ведь легко реализовать подобное не только для файлов, редактируемых vim, но и вообще абсолютно для любых файлов, и абсолютно неважно, что их изменяет ;)

habrahabr.ru/blogs/linux/66569/
0
shutnik #
вещь интересная, но для данной задачи не очень подходит: если редактировать через VIM и системные конфиги, и рабочий код, не понятно как писать фильтр для отслеживания редактируемых пользователем данных, не на всю же систему вешать ;)
0
merlin_rterm #
А что мешает, собственно, повесить на всю систему?

Пользователю тоже доступна возможность вешать inotify на файлы, к которым у него есть разрешения.
0
shutnik #
при этом будут собираться все файлы, модифицированные любой программой, запущенной от пользователя? лишний мусор
0
coldFlame #
TimeVault этим и занимается
0
errno #
Спасибо за наводку, судя по тому что пишут, очень удобная весч, буду пробовать :)
+1
yelv #
а ещё можно пользоваться всякими системами версионинга, намного лучше помогает восстановить удаленное и занимает гораздо меньше места т.к. хранит только отличия ;)
–2
shutnik #
для файлов вне домашнего каталога это не очень подходит
0
yuretsz #
Я многое редактирую через vim
Спасибо, очень и очень хорошо работает.

ЗЫ. Не знаете способа как подружить VIM c каким-нибудь IDE?
jVi, которым я пользуюсь для NetBeans ну совсем слаб, еще и бажит к тому же.
+2
egge #
vim + Project plugin = IDE
0
yuretsz #
Ну не совсем, у IDE есть еще автодополнение по всему проекту, и быстрый переход к определению метода\функции, вот этому я VIM никак не могу научить.
0
egge #
insenvim.sourceforge.net/ — автодополнение
ctags.sourceforge.net/ — быстрый переход к определению метода\функции
0
dapi #
Подсказали бы еще подобное решение для emacs-а
0
Mishail #
Кстати, вот пара плагинов, реализующих схожую функциональность: writebackup и writebackupVersionControl. Первый собственно пишет бэкапы, а второй реализует некое подобие системы-контроля версий (diff, restore, history navigation), для бэкапов от 1-го плагина.

Сам не пробовал.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.