Как выйти из Vim: руководство по сохранению файлов и командам выхода

Перевод статьи «How to Exit Vim – Vim Save and Quit Command Tutorial».

Я пользуюсь Vim с тех самых пор, как стал учиться программированию. Во всех других редакторах и IDE я сразу же ставлю плагин Vim.

Конечно, я знаю, что работа с Vim с непривычки может быть трудна. В этой статье мы рассмотрим некоторые основные концепции, касающиеся работы с этим редактором, и одну из базовых тем: как выйти из Vim.

Я также буду указывать команды, с помощью которых можно открыть документацию редактора по той или иной теме. Для просмотра справки нужно сначала нажать ESC, затем запустить предложенную команду, например, :h vim-modes, и нажать Enter.

TL;DR – Как выйти из Vim

  1. Нажмите ESC один раз (иногда — два).
  2. Убедитесь, что у вас включена английская раскладка.
  3. Далее все зависит от вашей текущей ситуации и намерений:
  • Если вы не вносили никаких изменений в файл, введите :q и нажмите Enter/return
  • Если вы внесли изменения и хотите их сохранить, введите :wq и нажмите Enter/return
  • Если вы внесли изменения, но не хотите их сохранять, введите :q! и нажмите Enter/return

Ну а если вы хотите разобраться во всем этом подробнее, читайте дальше!

Что из себя представляют режимы Vim?

В Vim есть семь базовых режимов и семь дополнительных, которые считаются вариациями базовых. Если хотите узнать об этом подробнее, можете зайти в Vim и запустить :h vim-modes, чтобы почитать документацию.

К счастью, чтобы приступить к работе с редактором, все 14 режимов знать не обязательно. Но о трех знать все же следует. Это нормальный режим, режим вставки и режим командной строки.

Что такое нормальный режим Vim?

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

Скажем, если мы хотим почитать документацию по режимам (vim-modes), прежде чем вводить команду :h vim-modes, нам сперва нужно убедиться, что мы в настоящий момент находимся в нормальном режиме. Самый каноничный способ входа в нормальный режим — нажатие клавиши ESC. Даже если вы уже в нормальном режиме, нажатие ESC вас из него не выбросит, не переживайте.

Документация по режимам: :h Normal, :h mode-switching.

Что такое режим вставки?

Мы используем режим вставки для редактирования текущего файла (в Vim он обычно рассматривается как buffer). По умолчанию при открытии файла мы попадаем в нормальный режим. Если нужно внести изменения в файл, сначала нужно переключиться в режим вставки.

Самый обиходный способ для переключения — пребывая в нормальном режиме, поставить курсор в то место, где хотите редактировать, и нажать i.

Но есть и другие способы войти в режим вставки. Кроме i, можно нажать o, O, a, A, I и др.

Почитать подробнее можно в документации: :h Insert, :h i_<Esc>, :h o, :h O, :h a, :h A, :h I.

Что такое режим командной строки?

Режим командной строки обычно временный, он используется для запуска «Ex-команд» (не путать с командами в нормальном режиме!).

Любопытный факт: название Vim образовано от «Vi Improved» («улучшенный Vi»). Сам этот редактор создан на базе редактора vi. А вот vi создан на основе текстового редактора ex. И vi, и ex были созданы Биллом Джоем.

Еще один любопытный факт для пользователей macOS: в системах macOS есть только Vim, а команда vi — ссылка на vim.

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

Для возврата в нормальный режим нужно нажать клавишу ESC.

Подробнее читайте в документации: :h Command-line, :h cmdline-lines.

Как выйти из Vim

Для выхода из редактора Vim используется команда quit («выход»). Если вы заглянете в документацию :h quit, вы заметите, что перед quit стоит двоеточие. Это означает, что quit используется в режиме командной строки.

Чтобы войти в режим командной строки, сперва нужно убедиться, что вы находитесь в нормальном режиме, а затем просто набрать двоеточие. Теперь, перейдя в режим командной строки, можно просто набрать quit и нажать Enter или return.

Вероятно, вы также заметили в документации команду :q. Это сокращенная версия команды :quit. То есть выйти можно и выполнив :q.

Однако, стоит заметить, что если вы внесли какие-либо изменения в файл, такой метод выхода не сработает.

В таком случае нужно использовать команду :wq, которая означает «записать и выйти» («write and quit»).

Соответствующую документацию можно почитать, выполнив команду :h :wq.

Есть еще одна команда для выхода — :x. Она практически аналогична :wq. Согласно документации (:h :x), команда работает, «как :wq, но выполняет запись, только если в файле что-то изменилось».

Разница в том, что :wq сохраняет файл в любом случае, хоть меняли вы что-то в этом файле, хоть нет. А команда :x не будет сохранять файл, если изменений не было. Суть здесь в изменении времени модификации файла. При выполнении команды :wq время модификации точно изменится, а при выполнении :x — только если на самом деле были внесены какие-го правки.

Бывает, что нам вовсе не нужно сохранять сделанные изменения. Для этих случаев есть команда :q!. Восклицательный знак как бы превращает команду выхода в команду принудительного выхода.

Имейте в виду, что при вводе этой команды вы потеряете все внесенные изменения и у вас практически не будет шансов их восстановить.

Проблемы выхода из Vim и как их решать

Что, если я не хочу переходить в режим командной строки?

Можно нажать ZZ или ZQ, находясь в нормальном режиме. ZZ — то же самое, что :x, а ZQ — то же, что :q!.

ZZ и ZQ считаются командами нормального режима, а :x и :q! — Ex-командами.

Что, если :wq не сработает?

Вот это, кстати, вполне возможно, если вы открыли файл, который имеете право только читать, или если у файла нет имени.

Имейте в виду, что если файл доступен только для чтения, Vim не запрещает вам открыть его и работать с ним. Единственное — у вас не получится сохранить изменения и выйти при помощи :wq и даже :wq!.

Вы можете распрощаться со всеми своими изменениями и просто выйти из файла, выполнив :q!, а затем зайти снова (предварительно введя sudo) и заново внести все нужные правки.

Также можно сохранить этот файл в директории, где у вас есть права записи, например, в своей домашней или даже в /tmp. После этого можно будет переместить этот файл в ту директорию, где у вас не было прав записи.

Чтобы это все проделать, выполните команду :w ~/my-backup-file. Файл сохранится в домашней директории. Затем при помощи команды mv переместите файл в нужное место.

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

Есть еще одно решение. Можно запустить команду :w !sudo tee %.

Здесь !sudo означает запуск команды sudo в вашей оболочке.

Например, команда :ls выведет список всех буфферов (открытых файлов) в Vim, а вот :!ls запустит команду ls из оболочки и отобразит результат.

tee копирует из стандартного ввода (stdin) в стандартный вывод (stdout).

% означает имя текущего файла.

Таким образом, мы можем использовать команду sudo из оболочки, скопировать содержимое текущего файла из Vim (в модифицированном виде) и перенаправить модифицированный контент в тот же файл (он указан путем использования %).

~                                                                                              
:w !sudo tee %
[sudo] password for stibbons:       
TL;DR – Как выйти из Vim
    1. Нажмите ESC один раз (иногда - два).
    2. Убедитесь, что у вас включена английская раскладка.
    3. Далее все зависит от вашей текущей ситуации и намерений:
        ◦ Если вы не вносили никаких изменений в файл, введите :q и нажмите Enter/return
        ◦ Если вы внесли изменения и хотите их сохранить, введите :wq и нажмите Enter/return
        ◦ Если вы внесли изменения, но не хотите их сохранять, введите :q! и нажмите Enter/return

W12: Warning: File "exit.txt" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

Вы увидите предупреждение, как в примере выше. Оно выводится, потому что содержимое файла было обновлено в оболочке, без участия самого Vim. Поэтому Vim рассматривает это изменение как внешнее и предупреждает вас о нем.

Вы можете просто нажать Enter, потому что это внешнее изменение вы сделали намеренно.

Также вы можете заметить, что над предупреждением показывается содержимое измененного файла. Это нормально. Если не хотите это видеть, можете дополнить команду перенаправлением stdout в null :w !sudo tee% >/dev/null.

Что, если я заблудился и мне нужно немедленно выйти?

Если вы попытаетесь привычно нажать control + c, Vim покажет сообщение:

Type  :qa!  and press <Enter> to abandon all changes and exit Vim 

Но вы можете это обойти, нажав Ctrl + Alt + Delete в Windows или Force Quit… в macOS.

Когда вы в следующий раз откроете этот файл, вы, по идее, увидите это (я использую файл foo.txt в качестве примера):

Found a swap file by the name ".foo.txt.swp"
          owned by: stibbons   dated: Fri Jun 25 00:42:16 2021
         [cannot be read]
While opening file "foo.txt"
             dated: Fri Jun 25 00:38:00 2021

(1) Another program may be editing the same file.  If this is the
case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r foo.txt"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".foo.txt.swp"
    to avoid this message.

Без паники! Это нормально. Vim пытается помочь вам восстановить ценные изменения, которые вы, возможно, потеряли.

Проверив текущую директорию, вы найдете в ней скрытый файл с расширением .swp. Это swap-файл. Документацию можно посмотреть, введя команду :h swap-file.

swap-файл

Если нажать R для восстановления, мы увидим следующее:

Нажав Enter, вы увидите, что сделанные ранее изменения вернулись. После завершения процесса восстановления вы можете просто удалить файл .swp, чтобы сообщение об ошибке больше не выводилось.

Заключение

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

[customscript]techrocks_custom_after_post_html[/customscript]

[customscript]techrocks_custom_script[/customscript]

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх