Как все мы, я надеюсь, знаем, в Вим есть режимы. Много режимов, но основные — это нормальный режим, в котором можно редактировать текст, и режим вставки, в котором можно его вводить. Режим вставки включается командой i, а возврат в нормальный режим по <ESC>. А как еще можно включить вставку? И что это дает?
Синоним команды i — клавиша Insert. Ею можно войти в режим вставки, а оттуда она переключает на режим замены (и обратно).
Команда-сестричка a начинает режим вставки справа от символа, на котором курсор. А i — слева. Если вы хотите продолжить набирать текст, то логичнее как раз a.
Мнемоника этих команд: i=insert, вставка; a=append, добавление.
Заглавные версии: A начинает режим вставки на конце строки, это аналог $a. А команда I начинает вставку перед первым непробельным символом строки. Это как ^i.
Если вы хотите начать ввод текста в начале строки, без разницы, есть там отступы или нет, то такая команда тоже имеется: gI. Аналог 0i одной командой.
А что же делает gi? Это магическая команда: она начинает режим вставки там, где был закончен предыдущий. Это очень удобно, на самом деле: вы закончили ввод текста, переместились куда-то, скопировали и вставили что-то, и решили продолжить писать с того же места. Часто бывает.
Тут есть один нюанс. Фактически используется спецметка, и при удалении или добавлении строк позиция в тексте корректируется: вы попадете туда, куда хотели. Но вот удаление/вставка символов не отслеживается, так что если вы решили удалить слово на этой же строке и продолжить редактирование, оно начнется не с того места! Поэкспериметируйте. Вообще, эта команда хороша для продолжения набора текста после паузы на поиск, на посмотреть что там выше уже написано, или скопировать что-то в буфер, в общем, паузы для пассивного созерцания.
Команды ga и gA, увы, отсутствуют. Точнее, ga существует, но не относится к режиму вставки: она сообщает код символа под курсором. А gA в вашем распоряжении, можете что-нибудь на нее навесить.
Еще есть команды o и O, создающие новую строку под/над текущей и включающие режим вставки. Это удобно, на самом деле, потому что обычно и надо что-то начать печатать с новой строки.
Мнемоника: o=open, открыть (новую строку).
Есть команды семейств s и c. Начнем со второго.
Команда c удаляет текст, указанный движением, и включает режим вставки. Например, ci( удалит все между скобок, и вводите что-то иное. Удаление происходит в регистр, и можно его явно указать ("qcG, например, удалит все до конца файла в регистр q, и включит режим вставки). Команда cc удаляет сразу всю строку, а C — всё до конца строки. Все команды могут принимать повторитель. Только 2c повторит движение (например, 2cw удалит два слова), a 2cc удалит две строки, как и 2C (только эта команда текущую строку удалит не всю, оставив начало).
Команда s удалит один символ под курсором, и включит режим вставки. Может принять повторитель. Бывает полезно, если нужно адресно заменить 5 символов, скажем, и нет желания использовать выделение. Вариант S является аналогом cc. Можно переопределить эту команду, это даже официальный совет.
Вот, например, вариант (откуда-то из Сети):
nnoremap s "_d
Мы переопределяем команду s, чтобы она удаляла что скажут (после нужно движение) в регистр "черная дыра" _, без перезаписи безымянного регистра. А то часто бывает, что скопировали что-то в буфер и не можем удалить лишний пробел, так как пропадет то, что в буфере. Не насовсем пропадет, но неудобно. А так очень удобно.
Но смотрите сами! Кому-то нравится s.
На выделении s и c полностью синонимичны.
Мнемоника: c=change. Так, ci[ прямо читается "change in brackets". А s=substitute, заменить.
Отметим вход в режим замены: R. Либо можно перейти в него из режима вставки клавишей Insert. В режим виртуальной замены, в котором текст слева/справа и сверху/снизу не двигается при замене, включается только gR. Подробнее об этом здесь.
Еще есть команды ex (командной строки Вим).
Это :a, или :append, которая позволяет ввести строки и вставляет их после текущей (или можно указать диапазон, после которого их следует поместить). Если добавить восклицательный знак, то будет временно отключен режим autoindent.
Полностью аналогична :i, или :insert, которая помещает строки перед текущей или перед указанным диапазоном. В обоих случаях строки вводятся прямо там, в командной строке, и Вим будет ожидать новую строку после нажатия на клавишу ввода. Сигналом "всё, хватит" является строка из одной точки. Но можно и <ESC> пару раз нажать, тоже сработает.
Команда :star (или :startisert) аналогична i или, с восклицательным знаком, A. Парная команда :stopinsert выглядит нелепо, так как чтобы добраться до командной строки, нужно выйти из режима вставки. Но в автокомандах может пригодиться.
Существуют также :startreplace и :startgreplace, включающие режим замены или виртуальной замены (как R или gR), а с восклицательным знаком начинает их в конце строки (как $R или $gR).
Отметим из въедливости, что есть команда :normal, которая позволяет выполнить из командной строки любую команду нормального режима. Так что можно, в автокомандах, скриптах или привязках, использовать весь описанный выше арсенал.
Удачи, коллеги!