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

Рубрика "Секреты Вим". Текстовые объекты

Всем привет! Обсудим серию команд для выделения текстовых объектов: слов, предложений, абзацев, блоков кода, содержимого скобок и кавычек. Команды эти работают в визуальном режиме или после оператора (удаление, копирование и т.п.), выполняя роль движения. Все такие команды начинаются с a или i. В первом случае граница объекта входит, во втором — нет. Например, a( выделяет содержимое скобок вместе с ними, а i( выделяет содержимое, оставляя скобки. Поэтому da( удалит скобки со всем, что внутри, а di( очистит скобки. Команды с a назовем замкнутыми, с i — открытыми. Команды могут принимать число-повторитель. Запомнить удобно так: i Означает in, в. А a означает артикль a. То есть di( надо читать "delete in ()", а daw — как "delete a word". aw, iw, aW, iW: выделяют слово. Первая пара считает словом последовательность словных символов (букв-цифр, если упрощенно), вторая — последовательность непробельных символов. Замкнутые команды забирают пробелы вокруг слова, открытые — нет. Запятые и т.п.

Всем привет! Обсудим серию команд для выделения текстовых объектов: слов, предложений, абзацев, блоков кода, содержимого скобок и кавычек. Команды эти работают в визуальном режиме или после оператора (удаление, копирование и т.п.), выполняя роль движения.

Текстовый объект, а что?
Текстовый объект, а что?

Все такие команды начинаются с a или i. В первом случае граница объекта входит, во втором — нет. Например, a( выделяет содержимое скобок вместе с ними, а i( выделяет содержимое, оставляя скобки. Поэтому da( удалит скобки со всем, что внутри, а di( очистит скобки. Команды с a назовем замкнутыми, с i — открытыми.

Команды могут принимать число-повторитель.

Запомнить удобно так: i Означает in, в. А a означает артикль a. То есть di( надо читать "delete in ()", а daw — как "delete a word".

aw, iw, aW, iW: выделяют слово. Первая пара считает словом последовательность словных символов (букв-цифр, если упрощенно), вторая — последовательность непробельных символов. Замкнутые команды забирают пробелы вокруг слова, открытые — нет. Запятые и т.п. команда aw не трогает.

as, is: выделяют предложение, a

ap, ip: выделяют абзац (абзацы отделяются пустой строкой).

a[, a], i[, i]: выделяют содержимое квадратных скобок. Находят парные скобки слева и справа от курсора. Какую скобку использовать — не важно.

a(, a), ab, i(, i), ib: выделяют содержимое круглых скобок. Скобку можно любую, b означает block и может быть вместо скобки. Находят парные скобки слева и справа от курсора.

a{, a}, aB, i{, i}, iB: аналогично для фигурных скобок.

a<, a>, i<, i>: то же для уголковых скобок.

at, it: выделяют текст между HTML-тегами. С XML тоже работает.

a", a', a`, i", i', i`: выделяют строку в кавычках. Для каждого типа кавычек команда своя! Работают только в пределах строки. Переменная quoteescape позволяет задать символ, экранирующий кавычку (тогда она не считается). По умолчанию там \ — скорее всего, этого вы и ожидаете.

Отличий от движения два. Во-первых, сами по себе эти команды не используются, двигать курсор с их помощью нельзя. Во-вторых, команда движения после d, например, удаляет все от курсора до цели движения. А эти команды удаляют только объект, забирая текст и слева, и справа от курсора, если нужно.

Еще есть команды gn, gN, которые повторяют поиск вниз/вверх и выделяют найденное. Их тоже можно применять с командами-операторами вместо движений, например, dgn найдет ниже по тексту и удалит то, что вы уже искали.

Если привыкнуть, то эти все команды очень удобны! Часто надо удалить или очистить скобки, и если удалить позволяет %, то очистить не столь просто. Строки тоже полезно, особенно если они длинные. Если язык вроде Си или Перла, с блоками в {}, то очень полезны команды a{ и т.п.

А работа с предложениями и абзацами незаменима при редактировании текста, особенно в ТеХе.

Помимо удаления d и копирования y, к операторам еще относятся "удали и перейди в режим вставки" c, смена регистра ~, gu, gU, пропускание через внешний фильтр (команду bash) !, форматирование отступов =, >, <, перенос строк gq, шифрование ROT13 g?, создание фолда-складки zf.

Так очень легко создать фолд из тела функции на Си: zfi{

Или перевести в нижний регистр строку в кавычках: gui"

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

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

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