Найти тему
Блокнот математика

Рубрика "Секреты Вим". Движения и операторы

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

Значительная часть команд является командами движения, или просто движениями. Они перемещают курсор и стоят особняком; например, они не повторяются командой "." (точка).

http://nobhmao.ru/dlya-patsientov/employees/Files/zoz.jpg
http://nobhmao.ru/dlya-patsientov/employees/Files/zoz.jpg

В любом редакторе есть несколько команд движения, и в Вим в режиме вставки они тоже есть: это стрелки (←↑↓→ ), Home и End, они же с Ctrl и Shift, это PgUp/PgDn и, может быть, что-то ещё.

В Вим это всё есть и в нормальном режиме, но это даже не начало. Команд движения намного больше и они очень разнообразны. Именно потому, что задач движения много: на слово, на абзац, на блок кода. Сводить всё к смещению на символ/строку можно, но это как сводить сложение с прибавлению единицы.

Причем необязательно все команды знать: достаточно знать несколько, и осваивать новые по ходу дела.

Это как с языком: не обязательно владеть им на уровне С2, достаточно уметь объясниться; главное, всё время учиться, осваивая новые слова и конструкции, читая книги и просматривая видео или фильмы.

Эффективно перемещаться по тексту можно только тогда, когда редактор что-то знает о вашем тексте: слова, предложения, абзацы, параграфы, блоки кода, функции, модули и так далее. Всё это в Виме есть, а если у вас что-то своё - можно сделать свои команды движения.

Перед командой движения можно употребить число-повторитель. Почти всегда, исключение - команда 0 (переход в начало строки). В большинстве случаев команда повторяется данное число раз, но только когда это уместно: так, $ (переход в конец строки) работает с повторителем, но переходит на конец (n-1)-ой строки после текущей. Перейти в конец два и более раз всё равно бессмысленно.

Есть команды движения по строке, дополняющие стрелки влево (←) и вправо (→) и Home/End. Помимо "стрелок" h и l, есть 0 (начало строки), $ (конец строки), ^ (первый ненулевой символ) и много других, см. Справку. Команда | прыгает на указанный повторителем символ (по номеру в строке). Можно прыгнуть и на указанный после команды символ: для этого есть команды t, T, f, F. Заглавные версии прыгают влево, строчные вправо, f захватывает символ, t нет (то есть, курсор прыгнет на символ или остановится перед ним). Команды ; и , позволяют повторить поиск символа в том же или противоположном направлении.

Есть команды вертикального движения: стрелки ↑↓, их дубли j и k. Команда G (переходит на указанную строку по номеру или на последнюю строку файла), gg (аналог 1G), % (только с повторителем, который трактуется как процент файла от начала: команда 50% отмотает половину файла), go (прыгает на указанный байт в файле, по умолчанию первый; для многобайтных кодировок байт и символ - не одно и то же, но может быть полезно).

Есть команды движения по словам, предложениям, абзацам, блокам кода, текстовым объектам. Вы можете создавать свои команды движения или использовать плагины, в которых новые определены или старые переопределены. Например, MatchIt, который идёт в поставке.

Под словом можно понимать разные вещи: это может быть нечто из словных символов, например "one,two" - это два слова (на самом деле, три, так как точка тоже слово, но это уже тонкости); а может быть нечто, обрамленное пробелами (так, " 42.666 " считается одним словом). На самом деле классификация тоньше. Но так или иначе, а Вим различает слово и СЛОВО, и имеет два набора команд движения. В их числе w (на слово вперед), B (на СЛОВО назад), e (на конец слова) и так далее.

Движением можно считать и поиск, хотя поиск имеет свои особенности, например, его можно повторять командами n и N.

Минимумом я считаю движения G, gg, 0, $, ^, стрелки, tfTF, % (поиск парных скобок) и поиск, в том числе особые команды * и #.

Теперь обсудим операторы. Движения можно использовать сами по себе, для перемещения курсора. Но очень полезны они для операторов: команд, работающих по движению.

Их есть довольно много, и можно создавать свои. Оператор - это команда изменения текста (или копирования текста в буфер), которая ждет движение и работает с текстом от текущей позиции курсора до финальной позиции курсора.

То есть вы велите Виму сделать с текстом что-то, и указываете, докуда это надо делать: до конца строки, или до конца файла, или до точки, или пять слов после курсора, или до конца текущего слова, или на три строки вниз.

Например, вы хотите поменять регистр символов до конца строки: g~$

Здесь g~ - оператор, а $ - движение. Когда вы уже ввели оператор, но не ввели движение, вы попадаете в особый режим "ожидание оператора", в котором можно делать привязки, переопределяя поведение.

Еще пример: dG - удалить (в регистр!) всё до конца файла.

Предопределенные операторы такие:

  • c - удаляет текст в регистр и выключает ежим вставки, change.
  • d - то же, но без режима вставки (delete). Удалить текст, не помещая его в регистр, нельзя; можно отправить в регистр "черная дыра" _ ("_d$ например: "в регистр _ удалить до конца строки").
  • y - копирует текст в регистр.
  • g~ - меняет регистр символов. ~ тоже может быть оператором, если выставлена опция tildeop, а если нет, то ~ меняет регистр символа под курсором или нескольких символов, сколько указано повторителем.
  • gu и gU меняют регистр на нижний/верхний.
  • ! - пропускает текст через внешний фильтр (программу извне Вим). Забирает все строки, по которым прошло движение.
  • = - расставляет отступы (тоже построчно)
  • > и < - увеличивает или уменьшает отступ.
  • g? - кодирование шифром ROT13 (сдвиг на 13 позиций по алфавиту: повторное преобразование отменяет предыдущее, применимо только к латинице без диакритики).
  • zf - создает фолд (если метод ручной или по маркерам).
  • g@ - вызывает функцию; см. создание своих операторов.

Такой "операторный" стиль работы традиционен для Вим. И удобен, если хорошо владеть командами. d3W - удалить три слова. yf. - скопировать текст от курсора до точки. f.2ldf. - скакнуть на точку (конец предложения), сместиться на два символа вправо (начало следующего) и удалить всё предложение (до точки включительно). gg=G - перейти в начало файла и расставить отступы до конца файла. d5j - удалить в регистр пять строк ниже текущей. y% - скопировать скобки. gu{ - перевести содержимое скобок в нижний регистр. И так далее.

Режим выделения удачно дополняет операторный стиль. Вы можете сначала выделить текст, в том числе и движением, а потом применить к нему оператор, который в этом случае движения не ждет.

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

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022

Наука
7 млн интересуются