Советы пользователям

Documentation
Login

Title: Vim editor

Author:: Vitus Wagner

Введение

Когда-то давно меня спросили, чем мне не нравится текстовый редактор notepad. На что я ответил, что в нём нужно каждую буковку руками набирать.

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

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

Ещё одним крайне ценным для меня свойством vim является то, что он не забыл своего происхождения из тех времён, когда компьютеры были большими, а каналы связи медленными.

Swap-файл

Vim это единственный редактор из доживших до наших дней, который рассчитан на то, что питание компьютера может пропасть или процесс редактора в может быть убит сигналом то ли от OOMKiller-а то ли при разрыве соединения с удалённым компьютером. Поэтому при работе vim постоянно записывает действия пользователя в так называемый swap-файл (обычно имя своп-файла создаётся из имени редактируемого файла путём добавления расширения .swp и точки в начале).

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

Если вы уверены, что это не запущенный в другом окне процесс редактирования, а последствия падения, то надо запустить процесс восстановления. И скорее всего все изменения сделанные перед падением будут на месте.

Нормальный режим - это нормально

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

Но вы так не делайте. Большую часть времени при работе над текстом все равно занимает не набор его, а редактирование. А перемещение по тексту, удаление, поиск и форматирование удобнее делать из нормального режима.

Нормальный режим vim отличается тем что все буквенные клавиши (кроме тех кто переключает в другие режимы) выполняют какие-нибудь команды, а не попадают в текст в виде букв. То есть если более других редакторов для перемещения вам доступны только клавиши цифровой клавиатуры (или дублирующие их клавиши остающиеся клавишами перемещения даже при включённом NumLock) либо комбинации с клавишами-модификаторами Control и Command, то в vim-е к вашим услугам вся клавиатура.

Более того заметная часть операций изменения текста может сопровождаться операцией перемещения. Если вам надо удалить фрагмент, вы нажимаете d и команду перемещения — на один символ, на слово, в конец абзаца, да хоть до конца текста, и удалится именно этот фрагмент. Аналогично дело обстоит с копированием текста в регистр.

Хочу обратить ваше внимание на команды перемещения с поиском. В vim-е есть две команды перемещения с поиском одного символа - f и t (А если надо назад по тексту — соответствующие большие буквы). Отличаются они тем что f<символ> помещает курсор на указанный символ, а t<символ> - перед ним. Соответственно, если у вас в тексте есть строка в кавычках, и вы хотите её заменить то последовательность действий такая: f" (нашли открывающую кавычку) l (сместились на следующий символ) ct" изменить (удалить и перейти в режим вставки) все до следующей кавычки, но не включая её.

Почти все команды нормального режима могут сопровождаться числовым модификатором. Например h перемещает на один символ вправо, а 10h — на 10 символов.

Кто такой

Читая хелп по разнообразным плагинам vim вы достаточно часто будете встречать обозначения клавиш в виде строки в угловых скобках. Как правило, слова в угловых скобках говорят сами за себя. Если написано что данная команда повешена на или на , вы знаете что надо нажимать на клавиатуре, чтобы её выполнить. А вот что такое или ? Оказывается в vim есть парочка внутренних переменных, куда можно записать код клавиши, которая будет использоваться в этом качестве. Если вы туда ничего не написали, то vim в качестве будет воспринимать обратный слэш.

Пойди туда, знаю куда

Перемещения по структурным элементам текста

Перемещения по блокам языков программирования

Тэги и навигация по вызовам функций

Marks, jumplist и changelist

Регистры

Большая часть программ в современных графических средах умеет пользоваться системным буфером обмена, куда можно вырезать кусок текста, а потом вставить его в другое место (или даже совсем другой файл). Vim, собранный с графическим интерфейсом тоже так умеет. Но кроме системного буфера у него есть ещё четыре десятка своих, называемых регистрами.

Любая операция удаления в нормальном режиме помещает удалённый текст в один из регистров. При этом, если регистр не был указан, то
операция yank помещает текст в регистр 0, а операция delete - в регистр 1. При вставке автоматически используется тот из этих регистров, который менялся последним. Так что если вы забрали в буфер ценный текст, а потом что-то удалили, чтобы освободить место для вставки этого, то текст в буфере не пропал. Вам всего лишь надо перед командой p указать из какого именно регистра вы хотите вставить. "0p. Остальные цифровые регистры от 2 до 9 представляют собой стэк куда выталкиваются данные из регистра 1 при последующих удалениях.

Так что вам обычно доступны для вставки обратно результаты девяти предыдущих удалений.

В 26 регистров, обозначаемых латинскими буквами, текст попадает только если вы это явно попросите. При этом unnamed register начинает указывать на этот буквенный регистр.

Регистр . содержит текст, введенный в ходе последней сессии режима вставки. См команду . в следующей главе. Регистр : - последняя выполненная командная строка.

Регистры % и # содержат имена текущего и альтернативного редактируемого файла.

Регистр * соответствует буферу обмена GUI-системы, а + - primary selection в X window.

Ещё у vim есть возможность включить запись все выполняемых действий (нажимаемых клавиш) в регистр с помощью команды q<имя-регистра>. Остановить запись можно просто q. И, соответственно выполнить регистр с помощью @<имя регистра>.

Вставить содержимое регистра в командную строку можно посредством Ctrl-R<имя регистра>

Когда программа пишет текст за вас

Autoindent

Completion

Аббревиатуры

Команда .

Поиск с заменой

Вставка в текст вывода внешней команды

Подстановки в командную строку

filename-modifiers

help filename-modifiers

Пишем грамотно

Встроенный spellcheck

LanguageTool

Асинхронный linting кода

Как не видеть лишнего

Режим quickfix

Фолдинг

vimdiff

Vim и управление версиями

fugitive

Шифрование

Редактор как оконная среда

Окна, вкладки и буфера

Терминальные буфера

Отладка в vim

packadd termdebug

Полезные плагины

matchit

localvimrc

voom

xmledit

dbext

tabular

calendar