Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Что можно в режиме вставки

Как всем нам хорошо известно, в Вим есть режимы вставки и замены, в которых большинство клавиш означают ввод того символа, который на них изображен. Можно настроить соответствие кодировок, чтобы не переключать раскладку: тогда системная раскладка всегда английская, но вы можете включить langmap через <C-^>, оно же обычно <C-6>, и писать по-русски. А есть клавиши и сочетания клавиш с особым значением; у некоторых оно очевидно, у других нет, но может быть полезно. Вот их и обсудим. <ESC>: выход в обычный режим. Аналогом является <C-[>, что может быть полезно: например, если клавиша ESC сломалась от нагрузки. <C-C> тоже выходит в обычный режим, только не отрабатывается событие InsertLeave и еще по мелочи отличия есть. <C-@> и <C-A> обладают магическим действием: вставляют текст, который был только что вставлен/набран. При этом <C-@> выходит из режима вставки, а <C-A> — нет. Пример: вы входите в режим вставки, нажав o, затем набираете integer, dimension()::, переходите на следующую строку

Как всем нам хорошо известно, в Вим есть режимы вставки и замены, в которых большинство клавиш означают ввод того символа, который на них изображен. Можно настроить соответствие кодировок, чтобы не переключать раскладку: тогда системная раскладка всегда английская, но вы можете включить langmap через <C-^>, оно же обычно <C-6>, и писать по-русски. А есть клавиши и сочетания клавиш с особым значением; у некоторых оно очевидно, у других нет, но может быть полезно. Вот их и обсудим.

<ESC>: выход в обычный режим. Аналогом является <C-[>, что может быть полезно: например, если клавиша ESC сломалась от нагрузки. <C-C> тоже выходит в обычный режим, только не отрабатывается событие InsertLeave и еще по мелочи отличия есть.

<C-@> и <C-A> обладают магическим действием: вставляют текст, который был только что вставлен/набран. При этом <C-@> выходит из режима вставки, а <C-A> — нет. Пример: вы входите в режим вставки, нажав o, затем набираете integer, dimension()::, переходите на следующую строку и нажимаете <C-A>.

<BS> удаляет символ слева от курсора. Ожидаемо. Поведением управляет переменная backspace, в которой через запятую могут присутствовать варианты indent, eol, start. Лучше все три и указать. Это позволяет, соответственно: удалять автоматические отступы, переходить на предыдущую строку (объединяя строки) и выходить за начало режима вставки. Последнее более чем естественно, но при редактировании деликатных вещей может быть полезно защититься от случайного удаления того, что удалять нельзя. Синонимом является <C-H> на тот случай, если вы <BS> переопределили. Ну, вдруг. Я для ТеХа, например, переопределил.

Клавиша <Del> действует аналогично, удаляя символ справа. На нее влияет наличие варианта eol в backspace: в этом случае она удаляет конец строки, сливая строки в одну.

<C-W> удаляет слово перед курсором, являясь "пословной" версией <BS> и в остальном на нее похожей. Слово в смысле w, то есть последовательность или только "словных" символов, или только непробельных. То есть, во фразе "эй, ты" три слова.

<C-U> тоже волшебная: удаляет введенный текст слева от курсора, опции backspace учитываются. Если текст не вводился и backspace непуста, удаляется всё в текущей строке слева от курсора.

Клавиша <Tab> вставляет символ табуляции. Если задана переменная expandtab, то вставляется соответствующее число пробелов. При этом всё равно можно вставить сам символ: посредством <C-V><Tab> или <C-Q><Tab>. У клавиши табуляции есть синоним: <C-I>.

<C-K> включает ввод диграфа. Про них есть отдельный материал, а если коротко, то это способ вставки юникодного символа через пару легко запоминаемых, например 00 это знак ∞, p* это π, а <- это ←. Я часто пользуюсь ими при подготовке своих заметок. Особенно часто это — тире (M-). В арсенале греческий алфавит, арабский, иврит, японские азбуки, псевдографика, математические значки (верхние и нижние индексы, цифры, интеграл, корень) и многое другое. Попробуйте команду :digraphs и ознакомьтесь с полным списком. Можно и свои диграфы определять, если знаете юникод-номер символа.

<C-V> нужна для ввода символов как есть. Это полезно, чтобы обойти привязки, а также чтобы вставить код спецклавиш, таких, как ESC, <C-^>, <F6> и т.п. Либо после можно ввести число: код символа, и так можно ввести вообще все, что угодно (кроме символа конца строки, номер 10 — это техническое ограничение). Код может быть десятичный, восьмеричный или шестнадцатеричный. Если просто число, то оно десятичное. Если перед ним буква o или O, то восьмеричное. Если x или X, то шестнадцатеричное. Во всех случаях код до 255=o377=xFF. Если первый символ u, то шестнадцатеричный, но до двух байт (до FFFF). Наконец, если U, то байт четыре, максимальное значение 7FFFFFFF=2147483647. Не то, чтобы это каждый день было надо, конечно... Синонимом <C-V> является <C-Q>.

Клавиша ввода <CR> и ее синонимы <C-J> и <C-M> вставляют символ конца строки. Зачем нужны синонимы? Ну, если клавиша сломалась, что бывало.

<C-R> вставляет содержимое регистра. Отличие от вставки посредством p в том, что текст как будто печатается, вводится посимвольно.

Если заданы переменные для форматирования (textwdith, autoindent, formatoptions), то они применяются, в отличие от вставки через p. Впрочем, привязки и сокращения не обрабатываются и так и так.

Помимо буквенных регистров, которые в вашем распоряжении, есть еще системные, которые могут быть полезны. Безымянный регистр, которым мы пользуемся чаще всего, это " (двойная кавычка). Имя файла %. Имя другого файла (если их больше двух, смысла не столь много, а если ровно два, то полезно) # . Последнее выражение поиска и последняя команда: / и : (двоеточие). Последний введенный текст . (точка). Последний удаленный текст не длиннее одной строки - (минус).

Ну и для хакеров: регистр-выражение =. После нажатия на клавишу =, Вим предложит ввести выражение. Например, <C-R>=42/7 или <C-R>="\<Up>". Удобно бывает, но требует мастерства (за исключением простых случаев вроде вычислений). Есть варианты, которые нужны редко и я их не буду описывать. См. help i_ctrl-R.

<C-T> и <C-D> вставляют/удаляют один отступ, задаваемый shiftwidth.

Магия: если ввести 0, вот прямо символ 0, и потом нажать <C-D>, то ноль исчезнет, а весь отступ будет удален (а текст останется). Так же работает и символ ^, но отступ на следующей строке сохранится.

<C-E> и <C-Y> вводят символ, которые ниже/выше курсора — на следующей/предыдущей строке. Редкий случай вертикального взаимодействия.

<C-]> позволяет раскрыть сокращение, не вводя еще один символ.

<Ins> переключает режим вставки на замену и обратно.

<C-N> и <C-P> включают автодополнения по ключевому слову, ниже или выше по тексту. <C-X> позволяет выбрать метод автодополнения. Кроме того, можно пролистать экран вверх-вниз на строку, нажав после <C-X> сочетание <C-E> или <C-Y>.

Клавиши, прерывающие режим вставки

Интересно, что есть и такие. Они прерывают режим, делают что-то и опять включают. Они приближают режим вставки Вим к обычному безрежимному редактору. Это стрелки, клавиши Home/End и PgUp/PgDown, левая клавиша мыши и ее колесико, которые работают, в итоге, интуитивно. Надо только помнить, что действие до стрелки, скажем, и после — это два разных действия.

Можно добавить варианты этих клавиш с ctrl и shift: стрелки влево/вправо смещаются на слово (в смысле w, разницы между <C-Left> и <S-Left> никакой).

<C-Home>, <C-End> переходят на первую/последнюю строку.

Из неочевидных команд: <C-O> даёт ввести команду обычного режима и вернуться. Например, так можно сохранить текст, провести поиск или скопировать фрагмент в буфер.

Она полезна не сама по себе, в конце концов несложно и нажать ESC, сделать что хотелось и войти снова в режим вставки, а для привязок. Например,

inoremap ;a <C-O>ma
inoremap ;A <C-O>`a

создадут привязки: ;a поставит закладку, а ;A перейдет на нее. Сочетание ;a нужно редко, но его все равно можно ввести, если понадобится.

Удачи, коллеги!

Оглавление рубрики

Путеводитель по каналу