Neovim — конфигурация редактора: swap, backup и undo файлы
Обновлено 23.02.2024
Приветствую!
Сегодня вторая заметка про конфигурацию крутого консольного редактор Neovim. Речь пойдёт про сохранение содержимого файлов в случае аварийных ситуаций.
Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram .
В прошлый раз мы с вами выполнили начальную настройку редактора. Если вы пропустили, то прошу к прочтению: Neovim — конфигурация редактора: базовая настройка.
Сегодня же мы настроим работу с swap, backup и undo файлами в Neovim. Узнаем что это такое, и как они могут спасти наши пятые точки файлы от потери драгоценного содержимого)
Принцип работы SWAP, BACKUP и UNDO файлов
Настройки редактора, показанные в данной статье я подглядел в одной статье на Habr про Vim: История Vim и руководство по его эффективному использованию. Объяснить принцип работы, лучше чем у автора статьи у меня не получиться, поэтому я просто буду приводить некоторые цитаты. И так, какую же защиту нам может предложить Vim/Neovim?
В зависимости от пользовательских настроек, Vim может защитить вас от четырех возможных причин потери данных:
Habr.com
- Сбой во время редактирования (между сохранениями). Vim может защитить от этого, периодически сохраняя вносимые изменения в файле подкачки.
- Защита от редактирования одного и того же файла двумя экземплярами Vim, защита от перезаписи изменений, внесенных через один или несколько экземпляров. Это тоже делается через файл подкачки.
- Сбой во время самого процесса сохранения после изменения конечного файла, но до полной записи нового содержимого. Vim может защитить вас от этого с помощью функции «writebackup». Для этого он создает в процессе сохранения новый файл, которым впоследствии заменяет оригинал, если все прошло гладко. Способ замены определяется настройкой «backupcopy».
- Сохранение нового содержимого файла при условии восстановления оригинала. Vim позволяет сохранить резервную копию файла после внесения изменений.
Перейдем непосредственно к настройке вышесказанного.
Конфигурация Neovim
Открываем конфиг на редактирование:
nvim ~/.config/nvim/init.vim
И в конец файла добавляем следующее:
" #############################
" ###### SWAP AND BACKUP ######
" #############################
" Create swap, undo, backup and sessions directories if they don't exist
if !isdirectory($HOME. "/.local/state/nvim/swap")
call mkdir($HOME. "/.local/state/nvim/swap", "p")
endif
if !isdirectory($HOME. "/.local/state/nvim/undo")
call mkdir($HOME. "/.local/state/nvim/undo", "p")
endif
if !isdirectory($HOME. "/.local/state/nvim/backup")
call mkdir($HOME. "/.local/state/nvim/backup", "p")
endif
if !isdirectory($HOME. "/.local/state/nvim/sessions")
call mkdir($HOME. "/.local/state/nvim/sessions", "p")
endif
set swapfile " Protect changes between writes, def values: 200 keystrokes / 4 seconds
set directory^=~/.local/state/nvim/swap// " Set directory for swap files
set writebackup " Protect against crash-during-write
set nobackup " Do not persist backup after successful write
set backupcopy=auto " Use rename-and-write-new method whenever safe
set backupdir^=~/.local/state/nvim/backup// " Set directory for backup files
set undofile " Persist the undo tree for each file
set undodir^=~/.local/state/nvim/undo// " Set directory for undo tree files
Если что, мой обновляемый конфиг есть на GitHub.
Сохраняем изменения. Для их применения необходимо перезайти в Neovim:
:wq
nvim ~/.config/nvim/init.vim
Теперь давайте дадим чуть более подробное описание параметров и на русском языке)
Параметр | Описание |
---|---|
if !isdirectory($HOME. "/.local/state/nvim/swap") call mkdir($HOME. "/.local/state/nvim/swap", "p") endif | Создает каталог для Swap-файлов, если он не существует, используя флаг “p” для создания необходимых родительских каталогов. |
if !isdirectory($HOME. "/.local/state/nvim/undo") call mkdir($HOME. "/.local/state/nvim/undo", "p") endif | Аналогичная проверка и создание каталога для для Undo-файлов. |
if !isdirectory($HOME. "/.local/state/nvim/backup") call mkdir($HOME. "/.local/state/nvim/backup", "p") endif | Аналогичная проверка и создание каталога для для файлов резервных копий. |
if !isdirectory($HOME. "/.local/state/nvim/sessions") call mkdir($HOME. "/.local/state/nvim/sessions", "p") endif | Аналогичная проверка и создание каталога для файлов сессий. Про сессии мы говорили в водной статье, каталог создаём, чтобы все системные файлы находились в одном месте. |
set swapfile | Включает использование временных файлов – swap. Периодическое сохранения состояния по вводу: каждые 200 нажатий клавиш и времени: каждые 4 секунды. |
set directory^=~/.local/state/nvim/swap// | Задает пользовательский каталог к списку системных для хранения swap файлов. Синтаксис ^= для :set добавляет имя указанного каталога в начало списка, поэтому Neovim сначала проверит этот каталог. // в конце имени каталога указывает Nevovim использовать абсолютный путь к файлу для создания swap, чтобы не было конфликтов между файлами с одинаковым именем из разных каталогов. |
set writebackup | Включают резервное копирование для незавершенной записи. |
set nobackup | Указывает Neovim не сохранять файлы бэкапа (создаваемые параметром выше) после успешного окончания операции (см. подробнее в цитате из статьи, приведенной до конфига). Если не установить данный параметр, то Neovim будет делать резервную копию каждого редактируемого файла, в указанной выше директории. Для меня это излишне) |
set backupcopy=auto | Автоматически выбирает стратегию создания (копирование или переименование) резервных копий. Другие варианты: yes , no или breakhardlink . auto – является предпочтительным. |
set backupdir^=~/.local/state/nvim/backup// | Задает каталог для файлов резервных копий. |
set undofile | Включает использование файлов для хранения истории изменения редактируемых файлов (undo, redo), для возможности выполнения отката даже после их закрытия. |
set undodir^=~/.local/state/nvim/undo// | Задает каталог для файлов истории изменений (undo, redo). |
Дабы не исказить читателю понимание механизма работы свап и бэкап файлов своей субъективностью (или ленью (: ), приведу еще несколько комментариев автора из вышеупомянутой статьи:
Также наш Vim сохраняет историю откатов для каждого файла, так что вы можете восстановить нужную версию даже после выхода из режима редактирования. Хотя подобная функция может и показаться избыточной на фоне уже имеющегося у нас файла подкачки, история откатов является дополнительным рубежом защиты во время записи файла.
Когда мы говорим об откатах, то стоит помнить о том, что Vim поддерживает полное древо истории редактирования файлов. Это означает, что вы можете внести изменение, откатить его, а потом повторить те же изменения вновь, и все это будет тремя разными точками восстановления. Время и объем внесенных изменений можно проверить с помощью команды :undolist, но именно древо вытащить из нее проблематично. С помощью этой команды вы можете перемещаться между конкретными изменениями или разными версиями в зависимости от времени: прыгать с шагом в 5 минут, или опираться на количество сохраненных файлов. При этом на мой взгляд, навигация по каталогу откатов с помощью плагина — хороший вариант, но undotree — вариант железобетонный.
Включение перечисленных настроек резервного копирования и восстановления файлов может принести вам некоторое душевное спокойствие. Раньше я методично сохранял все файлы вручную после внесения блока изменений или если отходил от компьютера. Потом я переучился: старался оставлять документы несохраненными по несколько часов кряду. В итоге это заставило меня досконально изучить, как работает файл подкачки.
Ну и несколько финальных оговорок: следите за всеми файлами резервного восстановления, они могут накапливаться в папке .vim и со временем начнут отжирать солидный объем дискового пространства. Также вам может потребоваться использование установки nowritebackup, если вы работаете с огромным по объему файлом, а дисковое пространство у вас ограничено. Об этом моменте стоит помнить, потому что Vim попытается сделать полную копию вашего файла, что приведет к очевидным последствиям. По умолчанию параметр backupskip отключает резервное копирование файла во временном системном каталоге.
Habr.com
Небольшая демонстрация
Попробуем спровоцировать Neovim на выполнение своих компетенций в области безопасности наших файлов)
Swap файлы
Для примера, в одном окне Neovim откроём наш файл конфигурации, а в другом окне также попытаемся открыть этот файл.
nvim ~/.config/nvim/init.vim
Во втором окне получаем предупреждение:
Neovim задетектил наличие swap’а для открываемого файла, что указывает на две ситуации: этот файл был закрыт аварийно, либо в данный момент он используется в другой сессии. Нам предлагают на выбор несколько вариантов:
- Открыть только для чтения – нажатием
O
; - Редактировать в любом случае – нажатием
E
; - Восстановить последнее сохранённое состояние нажатием
R
; - Выйти из редактора – нажатием
Q
; - Прервать операцию – нажатием
A
.
Вернемся в соседнее окно с открытым файлом. В конец файла добавим строку-комментарий (начинается с двойной кавычки "
) и не сохраняя файл завершим работы редактора аварийно, например простым закрытием окна терминала:
Вновь открываем:
nvim ~/.config/nvim/init.vim
И после появления предупреждения о свап файле нажимаем R
для восстановления, затем Enter
:
Содержимое файла восстановлено, хотя мы файл не сохраняли:
Обратите внимание, что на данном моменте у нас в редакторе отобразится содержимое swap файла, а не фактическое содержимое самого файла. Для корректного завершения восстановления файл необходимо сохранить. Сохраняем и выходим из редактора командой:
:wq
Теперь вновь открываем файл на редактирование
nvim ~/.config/nvim/init.vim
и.. мы вновь видим тоже самое сообщение. Дело в том, что swap файлы не удаляются автоматически, даже после восстановления. Если честно, я до сих пор не нашел корректного способа (не считая костыли) выполнять такую операцию)
Для удаления swap файла можно нажать D
во время появления предупреждения, после чего мы перейдем в режим редактирования файла. Или можно не удалять и нажать E
, а в командном режиме выполнить:
:e
Затем на вновь появившемся меню нажать D
. Да, согласен, к этому нужно привыкнуть, но польза от swap файла велика, поэтому я смирился и вам рекомендую)
Для ручного вызова восстановления из swap файла во время редактирования введите:
:recover
" или
:r
Если swap файлов было создано несколько, редактор предложит вам выбрать подходящий.
Backup файлы
При данной конфигурации сложно выполнить демонстрацию работы бэкап файлов. Ведь они сохраняются лишь когда запись на диск не завершилась успешно. Поэтому просто знайте, что вы в безопасности)
Но если вы включите постоянное создание бэкап файлов параметром set backup
, то в указанной в конфигурации директории будут появляться резервные файлы с суффиксом ~
для каждого открытого вами файла. Это не всегда практично, особенно если часто работать с большими файлами.
Undo tree
При включенном параметре сохранения истории изменений в редакторе, возможно выполнить пресловутые “Ctrl+z” и “Ctrl+y” нажатием клавиш u
(undo) и Ctrl+r
(redo) даже после его закрытия. Это, как было сказано выше, еще один слой защиты содержимого)
Выводы
вот так вот
До этой части статей редко, кто дочитывает, но вы молодец)