Vim как выйти из режима вставки
Перейти к содержимому

Vim как выйти из режима вставки

  • автор:

Как выйти из Vim

Как выйти из Vim главное изображение

Если вы чувствуете себя немного расстроенным по причине незнания того, как выходить из Vim, то, скажу я, зря. Вы такой не один. Согласно Stack Overflow, около миллиона разработчиков искали выход из него.

Как выйти из Vim Я впервые столкнулась с такой проблемой, когда проходила на Хекслете курс по Git и случайно забыла написать комментарий к коммиту. Меня выкинуло на непонятную страницу, с которой я не могла выйти. Не знаю почему, но команду выхода не удалось найти на первых ссылках результата поисковика, поэтому, надеюсь, что кому-то будет полезно =)

  1. Нажмите ESC один раз (иногда дважды);
  2. Убедитесь, что вы используете метод ввода на английском языке;
  3. Следующий шаг зависит от текущего статуса и ваших ожиданий:
    • Если вы не вносили никаких изменений, введите :q и нажмите Enter/return. Вы также можете заметить что :q на самом деле является сокращенной версией команды :quit.
    • Если вы внесли какие-то изменения и хотели бы их сохранить , введите :wq и нажмите Enter/return В этом случае нам нужно будет использовать :wq, что означает «write and quit». Вы можете найти это в документации :wq.
    • Если вы внесли какие-то изменения и предпочитаете отменить их, введите :q! и нажмите Enter/return

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

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

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

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

И, когда мне становится грустно, с какой очевидной ошибкой я столкнулась, то всегда вспоминаю фразу из статьи:

Если вы чувствуете себя немного расстроенным по причине незнания того, как выходить из Vim, то, скажу я, зря. Вы такой не один. Согласно Stack Overflow около миллиона разработчиков искали выход из него.

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

Как выйти из Vim

Как выйти из Vim? Как закрыть Vim? Как сохранить и выйти Vim? Подобные вопросы задают множество новичков, которые только начинают пользоваться редактором Vim. Это один из лучших редакторов, работающих в терминале. Он известен благодаря своей огромной функциональности.

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

Как выйти из Vim

Если вы уже интересовались статьями о Vim, то, наверное, знаете, что существует несколько способов закрыть Vim. Вот самые популярные из них:

Нажмите клавишу Esc, это важно, потому что вам необходимо выйти из режима вставки, прежде чем вводить команды выхода. Далее можете вести одну из следующих команд:

  • :q — двоеточие — это тоже часть команды, она просто закроет редактор;
  • :q — если файл не был сохранен, то с помощью этой команды вы можете выйти без сохранения;
  • :wq — позволяет сохранить и выйти Vim.

После ввода любой из команд нужно нажать Enter. Обратите внимание, что при нажатии Esc и ввода символа «:» курсор ввода переместится вниз окна.

Другие способы выйти из Vim

Как правило, вам будет достаточно помнить три приведенные выше команды чтобы правильно выйти из Vim в большинстве ситуаций. Но существует еще несколько способов:

  • Esc + �� — сохранить и выйти;
  • Esc + :qa — закрыть все открытые файлы;
  • Esc + Shift ZZ — сохранить и выйти Vim;
  • Esc + Shift ZQ — выйти без сохранения Vim.

Этого будет полностью достаточно чтобы выбрать именно то, что нужно и более удобно. Для меня проще всего первый способ. Также, возможно, вам понравиться сочетание :wq. Для сохранения используется команда :w, поэтому Write — сохранить, а Quit — выйти. Очень просто запомнить.

Факты о выходе из Vim

Если вы чувствуете себя неловко, потому что не знаете как выйти из Vim, не расстраивайтесь. Вы не одиноки, согласно статистике StackOverflov более миллиона разработчиков со всего мира не знают как выйти из редактора vim.

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

Это немного удивительно, потому что если вы запустите Vim без параметров, то увидите информацию о том, как его закрыть прямо на заставке:

Но здесь такая очевидная вещь, как выход, делается не очевидным способом. Забавно, что мы привыкли к стандартным сочетаниям клавиш — Ctrl+S и Ctrl+X и теряемся, когда не находим их в программах.

Выводы

Vim — это лучший текстовый редактор. Если вы разберетесь со всеми его функциями, то уже не сможете найти ему замену. Системные администраторы тратят очень много времени на работу в командной строке, овладение Vim будет очень полезно для них. Надеюсь, информация из этой статьи была полезной для вас.

Про Vim » Режим вставки

В предыдущем посте про горячие клавиши был сделан вывод о том, что лучше не трогать родные горячие клавиши и сочетания с модификатором CTRL и освоить их как есть, а все пользовательские команды и управление плагинами оставить на сочетания с клавишей лидером. Их туда можно напихать можно сколько угодно. Мнемонически это выгодно тем, что базовые сочетания будут работать везде и вы знаете, что сочетания с лидером могу работать каждый раз немного по-разному, особенно если вы активно используете конфигурации под определенные типы файлов ( :filetype on ). В каком-то случае LSP (Language Server Protocol) нужен, в каком-то нет, где-то DAP (Debug Adapter Protocol) работает, где-то в нем нет смысла, для большинства типов файлов омни автодополнение включено, для SQL скриптов лучше вызывать его вручную и так далее.

Однако всё это хозяйство работает пока не включен режим вставки. В режиме вставки остается очень ограниченный перечень плюшек, работающих с нажатым CTRL . Большинство пользователей при этом дружно сходятся во мнении, что в данном случае нужно беспрекословно следовать той самой философии «модального» режима, а именно: режим вставки — только для вставки. То есть встали на нужное место, нажали один из вариантов входа в режим вставки, кстати их там вагон и маленькая тележка, набрали нужный кусочек текста, и тут же вернулись в нормальный режим. «Нормальный» он именно поэтому — другие режимы считаются «ненормальными». Так вот, к этой философии привыкнуть после пары десятков лет с WYSWIG с разбегу, прямо скажем, сложновато.

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

Должны ли быть здесь паузы после каждого предложения или абзаца?

Надо ли выходить в нормальный режим, когда мысль закончена?

Когда считать мысль законченной? Словом, не так тут всё просто. Надо ли при этом выходить в нормальный режим, когда тут же замечаешь опечатку, пропущенную запятую, неправильный регистр? Всё-таки кажется логичнее тут же на месте вернуться на пару слов назад, исправить, и продолжить редактирование без переключения в голове способа передвижения. Может это сложно только в начале, и я просто сам еще не привык это делать на уровне условного рефлекса, но что-то мне подсказывает, что средний человек, всё-таки сталкивается с похожей проблемой. Конечно, если согласиться с тем, что я сам некий средний товарищ. Сколько длится этот переходный период? Месяц? Год? До тех пор пока человек не плюнет на всё это?

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

Motions

Мне почему-то не сразу попало в поле зрения сочетание , которое как-раз реализует эту промежуточную парадигму, когда режим вставки более «нормален», чем нормальный режим. Сочетание в режиме вставки позволяет кастануть ровно одно заклинание из нормального режима и продолжить. Например, вы забыли запятую три слова назад: что бы вернуться и вставить запятую каноничным способом вам надо выйти из режима вставки, вернуться на три слова назад «нормальным» способом, войти в режим вставки в конец строки — 3bhi, (или, скажем, \’3Fi,\’A , как бы сделал я). Либо, считая режим вставки «приоритетным» в данный момент, можно поступить более интуитивно: 3F,$ . На первый взгляд, движений потребовалось почти одинаковое количество, однако, мне по крайней мере, кажется, что последний способ чуть более быстрый, при этом чуть менее мысленно сложный — вы в каждый момент времени всё-таки в одном режиме работы. Либо же, для такого случая, я все-же пока чаще пользуюсь стрелками.

Вот честно не знаю насколько использование стрелок в режиме редактирования православно с точки зрения замысла Vim. Вроде как исконно Vim задумывался именно для клавиатур без стрелок передвижения курсора. Есть масса высказываний на тему, что для начинающего пользователя вообще лучше выключить стрелки (да и прочие кнопки справа от Enter) на уровне системы. Так сказать, что бы максимально погрузиться в новую (старую) философию. Но, лично мне, вся эта история с ноутбучными и минималистскими клавиатурами не очень близка. (Далека скорее. Может когда-нибудь. ). И раз эти кнопки есть, то я не вижу разумных причин ими не пользоваться.

В режиме вставки прекрасно со своей функцией справляются сочетания CTRL со стрелками, да и просто сами стрелки. Тем более что я часто не попадаю по количеству слов в заданный пробел, а еще чаще нужно остановиться по-середине слова что бы исправить опечатку, причем последнего слова. Куда же тут без стрелок? Выходить в нормальны режим делать hhhhh , cl . A довольно утомительно, не считаете? Отпишитесь пожалуйста если знаете способ лучше, действительно очень интересно. То же самое можно сказать про HOME , END . Надо понимать, что речь тут именно про редактирование обыкновенных текстов: статеек, документации, может быть даже длинных запросов и блоков кода, которые можно записать разом. Разумеется, когда при написании программ нужно активно лазить не столько по строке сколько вверх-вниз по коду, то тут удобнее выходить в нормальный режим. И то, знаете, не всегда.

Пример классический: надо что-то вертикальное (список полей) расположить в строку, или наоборот сперва разложить список на строки, и, не знаю, добавить по запятой спереди или сзади. И важно, что элементов в списке не двадцать девять, а, скажем, три. Не прибегать же каждый раз к регуляркам или к макросам? Есть еще, конечно, блочный режим ( . I . ), о котором мне сразу напомнят более продвинутые товарищи, но, я к нему никак пока не могу привыкнуть, потому что, наверное, нужен он не так часто. Но вот с точки зрения, опять же, того что бы не терять мысль во время набора кода, не отвлекаясь на дополнительные сущности, мне иногда проще вот так быстренько пробежаться курсором и вставить эти злосчастные запятые. Если я вижу, что на такой топорный способ уйдет значительно больше времени, чем сказать себе: «подождите, тут же можно применить макрос» или «все строки повторяются с одного и того же символа», или «все числа выровнены в один вертикальный блок», то да, можно даже слазить в интернет, и посмотреть как же там было делать инкремент.

Тем более, что стрелки работают так как надо без каких бы то ни было предварительных ласк. Кроме случаев, когда они конфликтуют с эмулятором терминала или системы. Например, с tmux пришлось немного повозиться: дать ему в .tmux.conf

set-window-option -g xterm-keys on

А так же добавить немного черной магии в .vimrc :

" tmux compatibility if !has('gui_running') && &term =~ '^\%(screen\|tmux\)' let &t_8f let &t_8b endif if &term =~ '^screen' " tmux will send xterm-style keys when its xterm-keys option is on execute "set =\e[1;*A" execute "set =\e[1;*B" execute "set =\e[1;*C" execute "set =\e[1;*D" endif

Что конкретно это означает, к сожалению, я вам сказать не могу, но это работает.

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

Soft wrap

Короче, это случай с вводом строк длиннее чем количество символов по горизонтали. Опять же, этот случай имеет свою определенную нишу, а именно, набор текста на естественном языке, как, например, этот. По умолчанию, как-будто, считается, что Vim не совсем предназначен для такого сценария использования. Да, есть у нас в распоряжении :set wrap linebreak , но он работает в режиме вставки, мягко сказать, не совсем так как от него ожидаешь. То есть длинная строка это всё-таки всё еще одна длинная строка, но просто отображается как несколько. И это как-будто бы даже логично, но, увы, перемещение по такой строке вызывает другие логические вопросы. Хочется всё-же вверх вниз двигаться по ней так, как она состояла бы из нескольких отдельных строк.

Есть радикальное решение. Использовать жесткие переносы: :set texwidth=80 . Однако, понятно, что с этим появляются другие проблемы. Такой текст нельзя скопировать уже в какой-то другой редактор без переводов строки. Не понятно при этом 80 ли? Может где-то этого мало, может наоборот. Что вы будете делать, когда окну в данный момент доступно меньше столбцов? Если наоборот вам почти всегда доступно 120 и более? Если вы не пишите ничего кроме коротеньких программ на условном питоне, то в принципе это может быть решением. Почти во всех других случаях, когда ваш язык программирования более многословен, когда это SQL запросы, когда нужна развернутая документация, то такой выход скорее полумера.

Допускаю, что можно сделать так, что при выделении или копировании или по какому-то специальному сигналу, типа gq , можно как-то повлиять на ситуацию, но выглядит это, как по мне, так скорее как костыль. Так что мой выбор — перенос мягкий.

С мягким переносом обозначенные проблемы исчезают, но появляются свои. Параграф естественного текста это фактически одна строка. А параграфы бывают длинные (теоретически бесконечные). Перемещаться по нему вверх вниз в режиме вставки у меня не получается никак. Уж сколько я искал, всё сводится к одному: выйти в нормальный режим, а там уже вариантов множество. Один из них — сделать парочку переназначений.

" move between soft wrapped lines nnoremap j v:count ? 'j' : 'gj' nnoremap k v:count ? 'k' : 'gk' nnoremap  v:count ? 'j' : 'gj' nnoremap  v:count ? 'k' : 'gk'

Выглядит хитрее стандартного назначения, но тут на самом деле использованы лямбды. В данном случае делает доступной в правой части выражения переменную v , к которой можно применить методы, и, как здесь, обычный тернарный оператор. В Lua такое заклинание выглядит чуть более понятно:

-- soft wrap remap local expr_opts = < noremap = true, expr = true, silent = true >vim.keymap.set(< "n", "v" >, "j", "v:count == 0 ? 'gj' : 'j'", expr_opts) vim.keymap.set(< "n", "v" >, "k", "v:count == 0 ? 'gk' : 'k'", expr_opts) vim.keymap.set(< "n", "v" >, "", "v:count == 0 ? 'gj' : 'j'", expr_opts) vim.keymap.set(< "n", "v" >, "", "v:count == 0 ? 'gk' : 'k'", expr_opts)

Где за передачу параметра отвечает expr=true . И, да, я наверное, в следующий раз объясню зачем мне делать конфигурацию одновременно на Vim и NeoVim. И файлы выложить тогда же — в этот раз опять не получается собраться.

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

Есть, говорят, плагины, которые, снова, частично, но хоть как-то облегчают жизнь. Например, как вот этот easymotion/vim-easymotion. Он у меня установлен, но, честно сказать, пока я им не пользуюсь совсем, хотя и чувствую — зря. Опять же, он работает в нормальном режиме, но используя тактику с тем же сочетанием в режиме вставки, думаю можно добиться определенной степени ловкости, что бы не замечать боль связанную с невозможностью перемещения стрелками по перенесенному параграфу вверх вниз.

Registers

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

nnoremap :set invpaste paste? set pastetoggle=

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

Еще один бонус использования регистров так как это задумано в Vim это то, что сочетание работает и в других режимах кроме нормального — в командном, в терминальном. Нет сомнений и в том существует профит связанный с тем, что их, этих регистров, мало того что несколько встроенных, можно самостоятельно привязать их к буквам. Правда, я пока не достиг того уровня дзена, когда я помню что у меня лежит кроме как в системном (+) и в родном («) регистрах. Существуют способы и плагины сделать работу с регистрами более интуитивной и наглядной, но мне пока хватает стандартной :reg .

Кстати, может у вас есть способ наоборот использовать регистры Vim за его пределами? Сторонний софт, который бы давал возможность вставлять регистры во внешние программы?

Это, пожалуй, всё что я хотел сегодня сказать конкретно про режим вставки. Есть еще пару нюансов связанных с режимом вставки. В частности, работа с автодополнением (или как правильно по-русски это называется, подскажите) и с проверкой правописания, но этих моментов правильнее будет коснуться в связанных выпусках рубрики. А в следующий раз, я хочу продвинуться от эдакой предварительной подготовки почвы, сказать еще пару заключительных вещей на общие темы и перейти уже к какой-то программистской специфике и уже к более конкретным плагинам и ноу-хау.

Как выйти из 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_ , :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 .

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

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

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

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

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

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

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

ZZ и ZQ считаются командами нормального режима, а 😡 и :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 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.

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

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

Заключение

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

Добавить комментарий

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