Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Автосохранение файла

Привет, коллеги. Нынче часто файлы сами сохраняются. В облачных сервисах, да и локально тоже. Вим тоже так может. Речь тут может идти о двух вещах: о частом сохранении на случай, если что-то случится и всё пропадет или о простом удобстве: если я закрываю файл, то он должен быть сохранен, и нечего спрашивать! Начнем с резервных копий, которые подробно уже обсуждали. Вим может сохранять копию на случай сбоев (вырубили электричество, пропала связь с удаленным кластером, завис намертво компьютер, мало ли) И может сохранять исходную версию файла, чтобы можно было вернуться к ней, если напортили. Для второго, то есть для сохранения при выходе из файла есть две опции: autowrite и autowriteall. Выставьте вторую, и при закрытии файла или при переходе в другой файл (например, командой :next при работе с ошибками компиляции) текущий будет сохраняться. Первая опция охватывает немного меньше команд, см. Справку. Здесь надо отметить различие в поведении. Обычно, когда вы выходите по :q или ZZ, Вим

Привет, коллеги. Нынче часто файлы сами сохраняются. В облачных сервисах, да и локально тоже. Вим тоже так может.

Речь тут может идти о двух вещах: о частом сохранении на случай, если что-то случится и всё пропадет или о простом удобстве: если я закрываю файл, то он должен быть сохранен, и нечего спрашивать!

Кто знает, что это? Школьники такое разве что в музее античной техники видели. А символом сохранения стали.
Кто знает, что это? Школьники такое разве что в музее античной техники видели. А символом сохранения стали.

Начнем с резервных копий, которые подробно уже обсуждали. Вим может сохранять копию на случай сбоев (вырубили электричество, пропала связь с удаленным кластером, завис намертво компьютер, мало ли) И может сохранять исходную версию файла, чтобы можно было вернуться к ней, если напортили.

Для второго, то есть для сохранения при выходе из файла есть две опции: autowrite и autowriteall. Выставьте вторую, и при закрытии файла или при переходе в другой файл (например, командой :next при работе с ошибками компиляции) текущий будет сохраняться. Первая опция охватывает немного меньше команд, см. Справку.

Здесь надо отметить различие в поведении. Обычно, когда вы выходите по :q или ZZ, Вим закрывает сохраненный файл либо выдает ошибку

E37: Изменения не сохранены

А при выходе по :q! или ZQ изменения, если есть, тихо игнорируются. При выставленной опции autowriteall файл закрывается в любом случае: по :q сохраненным, по :q! несохраненным.

Заметьте еще, что обычно, если вы закрыли файл, вы потеряли историю его изменений, поэтому открыть и отменить сделанные правки нельзя. Но можно выставить флаг undofile и Вим будет вести хронику ваших правок. Тогда можно закрыть файл с сохранением, спохватиться, открыть и отменить наделанные правки.

Теперь конкретно: как научить Вим сохранять файл, над которым вы работаете, автоматически и часто? Используем автокоманды!

Можно обрабатывать событие TextChangedI, которое соответствует изменению текста в режиме вставки:

autocmd TextChangedI * :w

Я очень не рекомендую так делать! Тормозит, и нагрузка на диск слишком высока. Разве что каждый символ дается вам огромным трудом, вводите вы их редко, а сбои слишком часты, чтобы их игнорировать.

Можно вести подсчет символов и сохранять, например, каждые двести, например. Как это делается, показано в предыдущей заметке. Тогда вы больше двухсот символов не потеряете.

Но есть много других событий. Например, выход из режима вставки:

autocmd InsertLeave * :w

Особенно это полезно при работе с уже набранным текстом или кодом. Нашел, что нужно поменять, вошел в режим вставки; сделал изменения, вышел - файл сохранился.

Если вы не вылезаете из режима вставки, есть событие CursorHoldI, срабатывающее, если курсор не двигался некоторое время, указанное в опции updatetime в миллисекундах (по умолчанию 400). Причем оно срабатывает один раз, а потом не срабатывает, пока курсор не шевельнется. Идеально подходит для сохранения файла после страстного набора фрагмента текста, как раз когда вы замерли подумать или дать отдых дымящимся пальцам.

Можете заодно реагировать на события TextChanged и CursorHold, которые для нормального режима. Мало ли что вы удалили, вставили или изменили иным способом без печатания!

Еще можно обрабатывать событие BufLeave, расширяя область действия опции autosaveall: файл будет сохраняться, когда вы его покидаете.

Удачи, коллеги!

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022