Привет, коллеги. Обсудим, что предлагает Вим по поводу защиты ваших файлов: от сбоев системы, и от вас самих.
Вим может создавать резервную копию файла при записи уже существующего файла (и обычно так и поступает). Для этого нужно, чтобы был выставлен хотя бы один флаг: backup или writebackup (ещё есть переменная patchmode, о которой отдельно поговорим ниже). После успешной записи резервная копия обычно удаляется, но можно настроить Вим так, чтобы этого не делать. Давайте обсудим, как этой возможностью управлять и как ею пользоваться.
Сам факт создания резервных копий, временных или постоянных, задает флаг backup.
Если выставлен флаг backup, то старая резервная копия удаляется, создается новая из текущего файла: либо уже записанный файл переименовывается и записывается новый, либо старый копируется и перезаписывается: это поведение можно тоже настроить. В любом случае вам останется последняя резервная копия, удаляйте сами или пусть лежит: дело ваше.
Если же флаг backup сброшен (выставлен nobackup), то смотрим флаг writebackup. Если он выставлен (а так по умолчанию), то создается резервная копия, которая удаляется после успешной записи. Если же оба флага сброшены, резервная копия вообще не создается (это рискованно).
Для некоторых файлов вы можете не хотеть создавать резервные копии. Чтобы не отключать эту возможность (хотя и это можно с помощью автокоманд), можно просто задать переменную backupskip, в которой заданы файловые шаблоны через запятую, можно вместе с путями. По умолчанию это /tmp/*, то есть все файлы в данном каталоге не сохраняются в виде резервной копии. Можно добавить, например, что-то ещё: :set backupskip+=*.dat например. Обратите внимание, что переменные окружения не подставляются!
Логично сохранять резервную копию в тот же каталог, где и сам файл. За это отвечает переменная backupdir, содержащая список путей через запятую. Обычно первой идет точка (текущий каталог). Используется первый подходящий каталог (то есть чтобы были права на запись и всё такое). Каталог должен существовать. Можете валить все резервные копии в ~/.backups, например, только потом трудно будет понять, кто откуда. Переменные окружения подставляются в этом случае. Можно использовать форму ./..., то есть задать путь относительно файла.
Если переменная пуста, резервная копия не может быть создана, и это может вступить в конфликт с необходимостью ее создать, и вы получите сообщение о невозможности записи файла. То же произойдет, если все указанные каталоги перепробованы и ни один не подошел. Это можно преодолеть, указав ! после команды записи.
Как назвать резервную копию? Есть разные подходы: суффикс .bak, символ ~ на конце и т.п. Вим дает полную свободу в этом вопросе. Переменная backupext содержит суффикс, который будет добавлен к имени файла. По умолчанию это тильда ~, но вы можете задать .bak или .backup, или что вам будет угодно ещё.
Справка Вим предлагает автокоманду
:au BufWritePre * let &bex = '-' . strftime("%Y%b%d%X") . '~'
для создания резервных копий с указанием времени создания. bex — это сокращенная версия backupext.
Как именно создавать резервную копию — копированием файла или переименованием и записью нового — управляет переменная backupcopy. В ней через запятую перечислены слова. auto означает "решай сам", "yes" предписывает копировать, "no" — переименовывать. Можно добавить breaksymlink или breakhardlink, чтобы всегда переименовывать файлы, которые являются мягкими/жесткими ссылками. Для них всегда будет no.
Копирование сохраняет атрибуты файла: владельца, например; если файл является ссылкой, то ссылкой он и останется, и всё в таком роде. Но копирование может требовать много времени, если файл велик. Кроме того, если файл ссылка, то имя копии будет образовано по имени ссылки, а не самого файла.
Разумно полагаться на auto, но если вы знаете, что делаете, контроль в ваших руках!
Есть еще возможность сохранить копию файла перед тем, как его портить. Это тоже можно назвать "резервной копией", но смысл иной. То, что мы обсуждали выше — страховка на случай сбоев, например, если электричество выключится в момент записи. Вы эту копию вообще не увидите, если всё пройдет успешно и Вим ее удаляет после записи (так по умолчанию).
А вот если вы зададите значение переменной patchmode, то при первой записи в файл будет создана его копия с добавлением суффикса, который вы указали. Он должен начинаться с точки. Например, .bak, .orig или .was.
Это очень полезно при редактировании чужого кода!
Сохраняется копия только один раз, при первой записи. То есть там и правда оригинальная версия файла. Это удобно и это еще одно отличие от резервной копии, которую обсуждали выше.
Куда сохранять — определяет уже упомянутая переменная backupdir, которая не может быть пустой. Обычно там первой идет точка, так что файл окажется в том же каталоге, что и файл.
Технически, в этот файл переименовывается именно созданная резервная копия.
Если файл подпадает под шаблон backupskip, копия не создается.
Ну и суффикс добавляется в конец файла, так что файл *.f90 станет *.f90.orig, то есть ни Вим, ни компилятор Фортрана его как фортрановский уже не опознают.
На мой взгляд, резервные копии работают по умолчанию так, как и надо, и вам следует только знать, что Вим попытается спасти вашу работу при сбоях: ищите бакапы! А вот возможность сохранять оригинал через patchmode — это действительно важно, и надо об этой возможности знать.
удачи, коллеги!