Привет, коллеги. Поговорим о режимах. Заметка для новичка, но и опытный вимер может узнать что-то для себя небесполезное.
Вим работает в нескольких режимах, которые пользователь переключает по потребности. Классические, безрежимные редакторы всегда работают в одном режиме: вставки. А у Вима, если сильно упрощать, два режима: нормальный, в котором мы обрабатываем текст, и вставки, в котором мы этот текст вводим.
Теперь подробнее. Когда мы запускаем Вим, мы попадаем в нормальный режим. В нем у (почти) всех клавиш есть какой-то смысл: это команды. У меня есть заметка с картой команд нормального режима.
Среди них найдется вход в режим вставки и другие режимы, поиск, различные перемещения по тексту, запись макросов, выход, копирование и вырезание в регистры и вставка из них, отмена действий, запоминание позиции в тексте и многое другое.
Эти команды надо знать, но не обязательно знать их все. Достаточно начать с нескольких, и потом расширять свой арсенал.
Если несколько упрощать, то роль основного режима - скоростное перемещение по тексту и включение других режимов. Именно это позволяет эффективно работать с текстом.
Второй основной режим - режим вставки. В нем клавиши обозначают сами себя (в основном, есть некоторые сочетания с control и спецклавиши вроде функциональных). Простейший способ войти в режим вставки - команды i или a. А выйти обратно в нормальный режим - по клавише <ESC>.
Поскольку работа с текстом осуществляется в нормальном режиме, нет необходимости в меню и многочисленных горячих клавишах. Они считанные. Поэтому у вас есть обширнейшие возможности для их использования в своих целях.
Другой режим, который можно считать разновидностью вставки - режим замены. Если справа от курсора есть текст, то в режиме замены он замещается новым текстом. Отличие от классических редакторов, в которых такой режим тоже есть, в том, что при удалении нового текста клавишей <BS> восстанавливается старый текст.
Пример. Если у вас в режиме вставки набрано
Вася любит Машу
курсор поставлен на М и в режиме вставки вы наберете "Любу и ", то получите
Вася любит Любу и Машу
что совсем неудивительно. В режиме замены получится
Вася любит Любу и
что тоже понятно. Если вы теперь нажмете несколько раз клавишу Backspace, то получите исходную фразу. Но только если вы не выходили из режима!
Из режима вставки в режим замены (и обратно) мы попадаем как обычно: клавишей <INS>. А из нормального режима войти в режим вставки можно через R. Выход тоже через <ESC>.
Вариантом режима замены является режим виртуальной замены, в котором можно поместить курсор даже туда, где нет текста. Скажем, на несколько символов правее конца строки. Вход в него через gR, выход через <ESC>.
Отдельно выделяется "временный нормальный режим", когда вы нажимаете <C-O> в режиме вставки и получаете возможность выполнить команду нормального режима. После ее выполнения возвращаетесь в режим вставки.
Есть режимы командной строки. Собственно командная строка вызывается из нормального режима командой : (двоеточие). В командной строке (внизу) можно вводить команды. В частности, именно они позволяют сохранять файлы (:w или :saveas), читать файлы (:r или :tabnew), выходить из Вим (:q), читать справку (:help), производить замену текста (:s) и включать/выключать те или иные настройки (:set). И многое другое.
Строго говоря, есть ещё режим ex, в котором только команды командной строки. В общем-то, не нужен, это осталось с былых времен. Войти в него можно через Q или gQ. Последняя команда сохраняет средства редактирования командной строки, то есть это просто способ выполнять команды одну за другой, экономя на двоеточиях. Выход из режима через команду :visual.
Из командной строки можно сделать с текстом всё. Но кое-что удобнее делать из нормального режима. Переопределяя клавиши, вы можете часть команд вызывать из нормального режима, настраивая редактор под себя. Например, сохранять клавишей F2. Но это ваш выбор и ваше решение.
Выйти из режима командной строки, помимо выполнения команды, можно через <ESC>, как всегда.
Отдельно идет поиск. Это тоже строка вроде командной (но с отдельной историей) и там нужно ввести регулярное выражение. Вим будет искать текст по нему. В простейшем случае вы просто вводите то, что хотите найти. Включается командами нормального режима / или ?. Разница в направлении поиска: вниз или вверх по тексту. Если выставить флаг hlsearch, найденное будет подсвечено (убирает подсветку команда :hoh), а если выставлен флаг incsearch, то поиск будет вестись по мере ввода выражения.
К режимам командной строки относится ещё строка выражения, о которой был отдельный материал. Технически это ещё одна командная строка, но у нее своя история. Там можно вычислять выражения и вставлять их значения в текст. Есть и функция для ввода чего угодно с командной строки (с отдельной историей), о которой тоже был материал. Но это уже гроссмейстерские трюки.
В Вим можно выделять текст, чтобы потом с ним что-то делать. Это режим выделения, или визуальный режим. В нём работают команды перемещения по тексту - они меняют само выделение - и есть свои команды перемещения (o и O), которые выделение не меняют, а позволяют осмотреться. Прочие команды нормального режима применяются к выделению или к выделенным строкам, в зависимости от команды. Так можно удалить (вырезать) какой-то текст, скопировать, поменять регистр букв, зашифровать, отформатировать, сделать отступы и т.п.
Есть выделение прямоугольников текста.
Включается режим из нормального командами v (посимвольное выделение), V (построчное) и <C-V> (прямоугольник). Отменяется, помимо выполнения команды, той же <ESC>.
Имеется и малоизвестный режим классического выделения текста, о котором был отдельный материал. Если нажать любую клавишу, вводящую символ, то выделенный текст исчезает и включается режим вставки. Ну и вводится нажатый символ. Это напоминает выделение в обычных редакторах. Кому-то может быть удобно, но чаще это для разного рода шаблонов. Там может быть подсказка, что писать, выделенная классически: она исчезнет, когда начнете писать.
Есть режим вклейки. Он стоит особняком, это разновидность режима вставки. В этом режиме отключены все привязки и настройки автоматического форматирования, а сделано это для того, чтобы они не срабатывали при вставке текста из системного буфера. Включается выставлением флага paste.
Помимо режима вклейки, есть и другие такие "режимы", включаемые выставлением флагов: режим вечной вставки, режим read-only, режим "справа налево" и какие-то ещё. Перечислять все смысла, наверное, не имеет: они все под конкретные задачи созданы.
Наконец, есть ещё состояния, когда редактор чего-то ждет, и формально это отдельный режим. Например, многие команды работают по движению; они называются операторами. Вы даете команду и после нее указываете, с каким текстом она будет работать. Например, "удали в регистр весь текст до конца строки" выглядит d$. Здесь d - оператор, а $ - команда движения, перемещающая курсор на конец строки. После того, как нажата клавиша команды-оператора, Вим ждет команду движения. Это отдельный режим и в нем даже могут быть свои привязки (см. omap).
Еще Вим иногда задает вопросы или выводит предупреждения. Такой режим можно включить, дав команду замены с подтверждением. Каждое найденное вхождение Вим будет заменять после переспроса. В этих режимах очень мало доступных команд, обычно всё сводится к "да/нет/уходим" или набору команд движения.
Отдельным режимом можно считать и терминал.
Для разных режимов можно задавать разные привязки. Разве что режимы вставки и замены в этом смысле неразличимы и в режиме вклейки все привязки выключены. Строго говоря, можно задавать разные привязки для нормального режима, режима вставки, командной строки, визуального режима, режима классического выделения и режима ожидания движения. То есть одна и та же команда, например, <F2>, может делать разные вещи в разных режимах.
Но надо смотреть, для каких режимов создает привязку команда. Так, map создает привязку сразу для нормального, обоих "выделительных" и операторного. Но есть отдельно nmap, xmap, smap, omap и полный набор unmap к ним. Так что вы можете настроить Вим так, как это вам надо.
Последнее. Есть флаг showmode, который по умолчанию выставлен: вы этом случае Вим внизу отображает, в каком режиме (кроме нормального) находится. Это полезно.
Немного философии. Представим себе, что мы работаем с текстом по-старинке. У нас есть пишущая машинка на столике у окна, есть кресло, рядом с которым стоит чернильница - читать и править текст, рядом шкафы с книгами, словарями и справочниками, неподалеку арифмометр. Этот кабинет - это Вим. Вы можете сесть за стол и печатать целый день, но можете работать и иначе - как потребуется.
Классический редактор - это стоящая на стопке словарей машинка, и читать текст приходится не вынимая из нее листа. Так же, не вынимая, приходится его и править, зато есть рукоятка сбоку, позволяющая с удобством вытащить из-под машинки словарь.
Я вообще не понимаю, почему многорежимный подход не оказался единственным. Как еще-то?! Мы же не только набиваем текст - мы с ним работаем.
Удачи, коллеги.