Есть в Виме такой режим: 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
Подпишитесь на канал и не забудьте поставить лайк! Удачи, коллеги.