Найти тему
Блокнот математика

Рубрика "Секреты Вим". Подтверждение действий

Привет, коллеги. Обычно перед совершением опасных действий программы либо предупреждают об опасности и запрашивают подтверждение, либо просто отказываются их делать. В последнем случае обычно можно настоять на своем. Исключением из этого правила являются утилиты UNIX, которые делают что велено: принцип "You asked for it - you got it". Впрочем, не всегда: rmdir откажется удалять непустой каталог, а под рутом защищенный от записи файл можно удалить, но подтвердив намерения.

Вим выбирает обычно второй путь. Так, если файл не сохранен и вы даете команду выхода (:q), то Вим откажется выходить, выдав предупреждающее сообщение. Но можно все равно выйти, дав команду :q!. Аналогична ситуация с записью нового файла, если файл с таким именем уже имеется. Опять-таки восклицательный знак означает "прошу меня простить великодушно, однако я настаиваю".

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

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

:confirm w file.txt
:confirm q
:confirm qa

Первая команда создаст указанный файл и запишет текст в него; а если файл существует, то запросит указаний. Вторая закроет файл, если он сохранен; а если нет, то опять-таки задаст вопрос. Третья закроет всё и выйдет из Вим, если нет несохраненных изменений; а если есть, то будет задавать вопросы, пока всё не выяснит.

Это удобно для привязок и меню. Все-таки :q! довольно опасно, а без него и не выйдешь без сохранения. Опытному пользователю меню на выход и ни к чему, а вот если вы хотите новичку облегчить жизнь...

То выставьте опцию confirm:

:set confirm

И все команды, в которых уместно спрашивать, будут спрашивать. Так, как будто они все выполняются через :confirm.

Мне не очень нравится этот режим, потому что в домашнем ноуте, например, Вим русифицирован, и отвечать иногда надо Д(а), Н(ет) и О(т)мена, что требует переключения на русскую раскладку. Но мне это и не надо, мне и :q ввести несложно.

В заключение упомяну команду browse. Она не работает в консоли, только в оконной версии. Но там она открывает окно для выбора файла, который пойдет аргументом к указанной команде. Например,

:browse saveas

Но если хочется, мы и в консоли можем сделать себе такие удобства! Вот например:

:command! Save :execute 'w' input("File: ", "", "file")

Мы создаем команду :Save, которая будет записывать текст в новый файл, имя которого будет предварительно запрошено. Функция input берет от одного до трех аргументов: подсказку обязательно (может быть пустая строка), вариант по умолчанию опционально, и способ автодополнения (мы указали, что вводиться будет имя файла, так что пусть Вим автодополняет его). Можно вместо команды повесить это на клавишу: замените :command на :map, а Save на желаемую клавишу (например, <F2>). Только в конце еще добавьте <CR>, чтобы указанная команда пошла на выполнение.

Привязка может быть в составе меню - тогда вообще всё "как везде".

Аналогично можно сделать свои save и saveas. Для открытия файла логично открывать файловый менеджер, в котором можно всё вообще: и открыть файл в Виме, и скопировать-удалить-переименовать, и создать новый (кстати), и даже запустить на внешней программе или выполнить как исполняемый. Если что, то файловый менеджер открывается очень просто:

:tabnew .

Можно любую команду чтения, только вместо файла передать каталог. Можно даже на сетевом устройстве.

Есть еще функция confirm(), но о ней уже в другой раз.

Всё в ваших руках! Как обычно.

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