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

Рубрика "Секреты Вим". Диапазоны строк

Есть в Виме такой режим командной строки: для поиска с заменой и других :-команд. Многие команды принимают диапазон строк: познакомимся же с ними поближе...

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

https://i.ytimg.com/vi/zROOIleVB3M/maxresdefault.jpg
https://i.ytimg.com/vi/zROOIleVB3M/maxresdefault.jpg

Есть в Виме такой режим: ex, или режим командной строки. Включается двоеточием; полагаю, все в курсе.

Когда-то ex и был редактором текста, и ведь люди что-то ухитрялись делать, и нравилось им...

Ныне это просто командная строка Вим. Там живет оператор замены :s, о котором мы уже говорили. Там живут глобальные фильтры строк, о которых еще поговорим. Там же и сортировка, и команды выхода, и многие другие команды.

Так вот, многие команды требуют или допускают указание диапазона строк, к которым команда применяется.

Работа со строками естественна при редактировании файлов данных и программного кода. Но и при работе с текстом это полезно, особенно если предложение занимает одной строку или абзац занимает одну строку. Напоминаю, как сворачивать длинные строки и как по строке перемещаться. Если лень идти по ссылке, то :set wrap включает сворачивание строк, чтобы за экран не уезжали (:set nowrap выключает, а :set wrap! переключает), а переход вертикально между частями свернутой строки позволяют осуществлять команды g↓ и g↑.

Мы будем использовать для примера замену :s и сортировку :sort. Первая по умолчанию (без диапазона) применяется к текущей строке, вторая — ко всему тексту.

Можно указать диапазон строк (подчеркнут) просто номерами через запятую:

:7,11s/42/666/

Номера строк можно увидеть, если выставить флажок: set number. Убрать, как обычно: set nonumber.

Последняя строка обозначается $, а текущая— точкой (.).

Так, :.,$sort сортирует строки от текущей до конца, а :1,.sort — от начала до текущей. Диапазон 1,$ соответствует всему тексту, и у него есть синоним %. Так, %s/Jane/Julia/g сделает замену во всем тексте.

Есть и относительные диапазоны, по смещению относительно текущей. Все довольно интуитивно: -2,+2s/a/b/ осуществит замену на двух строках выше текущей и двух — ниже, и на текущей тоже. Относительные номера строк можно увидеть, если выставить флажок set relativenumber. Тогда текущая строка имеет либо свой номер (если нумерация set number включена), либо нуль (если нет), а строки выше и ниже снабжены номерами относительно текущей. Удобно, если используете много относительных команд вроде "от этой строки на 5 вниз".

Вместо номеров можно указать 'x — это строка, на которой закладка x, а также можно указать строку шаблоном поиска в //.

Например, /subroutine/,/end\s*subroutine/s/42/666/g — заменить все 42 на 666 в теле подпрограммы.

Это нечасто бывает нужно — легче выделить строки при помощи V и применить к выделению команду. Но иногда полезно.

Наконец, если вместо запятой диапазон разделен точкой-с-запятой (;), то курсор идет на первую строку диапазона. Например, /42/,+1 относится к первой строке после текущей, в которой есть 42, и строке ниже текущей; а вот /42/;+1 — это строка, где есть 42 (после текущей) и еще одна после нее.

Чтобы начинать поиск не с текущей строки, а с другой, можно указать еще один номер перед поиском. Например, так:

2/Jane/;+1 — искать слово Jane со второй строки файла и взять найденную строку и следующую за ней.

Что можно делать с диапазонами? Диапазоны можно:

  • удалять: .,+7d — удалить 8 строк начиная с текущей; d — оператор удаления.
  • перемещать: .,/666/m$ — выбранные строки перенести в конец, то есть после последней; можно переносить после нулевой, сиречь перед первой. m — оператор перемещения, и после него стоит адрес: номер строки, после которой это все сложить. Адрес может быть и относительным, например, .+2 или $-3
  • копировать: /chapter 1/,/first/,/last/t0 — искать, начиная со строки, содержащей chapter 1, строки с данными словами, и все, что между ними — скопировать в начало файла. Особенно удобно удалять, копировать и перемещать отфильтрованные по :g строки (но о фильтре g в другой раз!)
  • записать в файл: 1,12w сюда.txt

Подпишитесь на канал и не забудьте поставить лайк! Удачи, коллеги.

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

Навигатор по каналу