Если вы поклонник Vim, вы, вероятно, знаете о :q , :wq, :qa!и как таковых. Между тем, вы, вероятно, не знаете больше, не так ли?

Предисловие

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

:q, :conf q, :q!, :cq, :2cq!, :cq! 2, :wq, :wq!, :wq /tmp/tmp.NH31JOv96N, 
:wq ++ff=dos /tmp/tmp.NH31JOv96N, 
:10wq! ++enc=laten1 init.el, 
:x, :x!, :xi, :xit, :exit, :exi, :exi!
ZZ, ZQ
:qa, :qa!, :conf qa, :quita, :wqa, :wqa!, :xa, :conf wqa, :conf xa

Итак, почему в Vim так много разных команд для выхода?

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

Нужны ли нам все разные команды для выхода из Vim?

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

Какие типичные варианты использования привели к выходу из Vim стольких различных команд?

Вот некоторые примеры:

  • Открывается только один файл и никаких модификаций
  • Открыт только один файл, имеет модификацию, еще не сохранен
  • Только один файл открыт, имеет модификацию, сохранен
  • Открыто несколько файлов, и ни вкладки, ни файлы не изменены
  • Открыто несколько файлов, а вкладок нет, несколько файлов изменены и не сохранены
  • Открыто несколько файлов, и на разных вкладках файлы не изменены
  • Открыто несколько файлов, и в разных вкладках несколько файлов изменены и не сохранены
  • ……
  • Я хочу получить подтверждение перед выходом из Vim.
  • Я хочу сохранить текущий буфер в другой файл.
  • Я хочу сохранить текущий буфер в другой файл с другой кодировкой.
  • Я хочу сохранить текущий буфер в другой файл с другим переводом строки.
  • Я хочу сохранить часть текущего буфера в новый файл.
  • ……

Этот список может быть очень длинным.

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

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

Нужно ли нам знать все команды для выхода из Vim? Нет. Не все варианты использования, с которыми мы можем столкнуться. Нам нужно знать, как это сделать только тогда, когда нам нужно это сделать. Большинству из нас не нужно быть экспертами в Vim. Мы используем его только для собственного бизнеса. Это инструмент, редактор. Не так ли?

Итак, какова цель этой статьи?

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

Случаи использования

О: Я уже начинаю редактировать git commit с помощью Vim, но я не хочу продолжать этот git commit, что мне делать?

Поверьте мне. Это очень типичный вариант использования.

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

Примечание: если ввести :q!, то фиксация продолжится.

Итак, как выйти из Vim и изящно остановить процесс фиксации git?

Используйте команду :cq!2 для выхода из Vim с кодом ошибки 2, что приведет к тому, что git прервет процесс фиксации.

После этого вы увидите следующие сообщения от git:

hint: Waiting for your editor to close the file... error: There was a problem with the editor 'vim'.
Please supply the message using either -m or -F option.

B: У меня много открытых файлов. Некоторые из них доступны только для чтения. Я хочу сохранить все измененные файлы и выйти из Vim.

По крайней мере, у нас есть два разных способа сделать это: :wqa! и :xa! .

Что произойдет, если мы используем :wqa и :xa, у которых нет окончания !? Просто Vim не завершит работу, если в файлы, доступные только для чтения, будут внесены какие-либо изменения.

Приведенное ниже сообщение об ошибке может быть напечатано при использовании :wqa или :xa при изменении файлов, доступных только для чтения.

E45: 'readonly' option is set (add ! to override)

C: Я хочу автоматически удалять все файлы без имени при выходе из Vim.

В варианте использования B, если какие-либо буферы не имеют имени файла, будет напечатано сообщение об ошибке, а процесс выхода заблокирован.

📓 Это происходит только тогда, когда буфер без имени файла имеет модификации.

E141: No file name for buffer 1

Если нас не волнуют эти файлы без имени файла, то как мы можем выйти из Vim без ошибки?

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

" Function to check if a buffer is unnamed
function! IsBufferUnnamed(bufnr)
    return empty(bufname(a:bufnr))
endfunction

" Function to remove unnamed buffers from the buffer list 
" if they are in the buffer list
function! RemoveUnnamedBuffers()
    let buf_list = filter(range(1, bufnr('$')), 'IsBufferUnnamed(v:val)')

    for bufnr in buf_list
        if buflisted(bufnr)
            silent execute 'bwipeout! ' . bufnr
        endif
    endfor
endfunction

" Remove unnamed buffers, forcely save other buffers, and then exit Vim
function! RemoveUnnamedBuffersAndExit()
    call RemoveUnnamedBuffers()
    execute 'xa!'
endfunction

" Map to ,vv
:nnoremap ,vv :call RemoveUnnamedBuffersAndExit()<CR>