РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ VIM - Брам Мооленаар

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

26.1    Повторное выделение в Визуальном режиме
26.2    Сложение и вычитание
26.3    Внесение изменений в нескольких файлах
26.4    Использование Vim из сценария оболочки

Следующая глава: Шаблоны и команды поиска
Предыдущая глава: Редактирование форматированного текста
Содержание: Руководство пользователя Vim


26.1 Повторное выделение в Визуальном режиме

Визуальный режим может быть очень полезен для внесения изменений в любой последовательности строк. Выделенный текст, над которым будут производиться операции, у вас всегда на виду. Однако, для выделения требуется ввод команд с клавиатуры. Команда "gv" позволяет автоматически выделять раннее выделенную область заново. Это позволяет быстро выполнять над тем же самым текстом другие операции.

Предположим, у вас имеется несколько строк, в которых вам требуется изменить "2001" на "2002" и "2000" на "2001":

Финансовые результаты 2001 года оказались ~
лучше, чем в 2000. Прибыль возросла на 50%, ~
несмотря на то, что в 2001 году осадков ~
выпало больше, чем в 2000 г. ~
            2000         2001 ~
прибыль        45,403          66,234 ~

Для начала, изменим "2001" на "2002". Выберите необходимые строки в Визуальном режиме и введите команду:

:s/2001/2002/g

Теперь, чтобы выбрать выделенный раннее текст, используйте команду "gv". Независимо от того, где находится курсор в данный момент, в Визуальном режиме будет выделен тот же самый фрагмент текста. Затем используйте команду ":s/2000/2001/g" для внесения второго исправления.

Эту операцию можно повторить несколько раз.


26.2 Сложение и вычитание

При изменении нескольких чисел часто имеется определённое смещение, на которое увеличиваются или уменьшаются числа, которые требуется изменить. В предыдущем примере мы увеличивали значение года на единицу. Вместо ввода команды для каждого года в тексте, можно использовать команду CTRL-A.

Например, введём шаблон для поиска года:

/19[0-9][0-9]\|20[0-9][0-9]

Теперь нажмём CTRL-A. Значение года будет увеличено на единицу:

Финансовые результаты 2002 года оказались ~
лучше, чем в 2000. Прибыль возросла на 50%, ~
несмотря на то, что в 2001 году осадков ~
выпало больше, чем в 2000 г. ~
         2000         2001 ~
прибыль        45,403          66,234 ~

Теперь перейдём к следующему году по команде "n" и нажмём "." для повторения последней команды CTRL-A ("." немного быстрее набирать). Команды "n" и "." можно повторять, пока в тексте не будут изменены все года.

Совет: включите опцию 'hlsearch', чтобы видеть перед собой соответствия в тексте, которые будут изменены.

Добавление другого числа, отличного от единицы, осуществляется вводом числовой приставки перед командой CTRL-A. Предположим, у нас есть список:

1.  номер четыре ~
2.  номер пять ~
3.  номер шесть ~

Подведите курсор к "1." и введите:

    3 CTRL-A

"1." меняется на "4.". И снова, можно пользоваться "." для повторения этого действия на других числах.

Ещё один пример:

006    что-то ~
007    что-то ~

Использование CTRL-A на этих числах приведёт к следующему результату:

007    что-то ~
010    что-то ~

Как это? 7 плюс один будет 10? Дело в том, что Vim воспринял "007" как восьмеричное число, поскольку число начинается с цифры ноль. Такое соглашение часто используется в программах на языке C. Если вы не хотите, чтобы ваши числа, начинающиеся с нуля, воспринимались как восьмеричные, используйте следующую настройку:

:set nrformats-=octal

Команда CTRL-X выполняет вычитание похожим образом.


26.3 Внесение изменений в нескольких файлах

Допустим, у вас есть переменная "x_cnt" и вы хотите изменить её имя на "x_counter". Проблема в том, что эта переменная используется в нескольких файлах C. Покажем, как внести изменения во все необходимые файлы.

Поместите все требуемые файлы в список аргументов:

:args *.c

Теперь, все файлы C присутствуют в списке аргументов и Vim открыл для редактирования первый файл. Чтобы выполнить команду замены на всех файлах в списке аргументов, введите команду:

:argdo %s/\<x_cnt\>/x_counter/ge | update

Команда ":argdo" имеет аргумент, который представляет собой другую команду. Эта команда будет выполнена на всех файлах в списке аргументов.

Команда замены, которую мы передали в качестве аргумента команде ":argdo" будет работать на всех строках. Она отыщет все появления слова "x_cnt" в тексте при помощи шаблона "\<x_cnt\>". Благодаря "\<" и "\>" в шаблоне, команда найдёт только слово "x_cnt", и оставит в покое слова вроде "px_cnt" или "x_cnt2".

Флаги команды замены включают "g" для замены всех "x_cnt" на строке, а также "e" для того, чтобы избежать появления сообщения об ошибке в том случае, если "x_cnt" в файле не найдено. Без флага "e" команда ":argdo" прекратит выполнение на первом же файле, где не будет обнаружено слово "x_cnt".

"|" служит для разделения двух команд. Команда "update" запишет файл на диск только в том случае, если в нём есть изменения. Если в каком-либо файле не было замен "x_cnt" на "x_counter", то файл лишний раз сохраняться не будет.

Имеется также команда ":windo", которая выполняет команду, указанную в аргументе, на всех открытых окнах, а также ":bufdo", которая выполняется на всех буферах. Будьте осторожны с этой командой, поскольку у вас может находиться в списке буферов гораздо больше файлов, чем вы себе представляете. Пользуйтесь для просмотра списка буферов командой ":buffers" (или ":ls").


26.4 Использование Vim из сценария оболочки

Предположим, у вас есть много файлов, в которых вам требуется заменить строку "-person-" на "Jones" и отправить результат на печать. Как это выполнить, не прибегая к ручному выполнению повторяющихся операций? Напишите сценарий системной оболочки, который возьмёт всю работу на себя!

Vim прекрасно справляется с задачами экранного редактирования текста с использованием команд Обычного режима. В то же время, для пакетной обработки команды Обычного режима не очень подходят; их сложно поместить в командный файл, который можно запускать по мере необходимости. Для этой цели лучше всего подходит режим Ex. Режим Ex предоставляет интерфейс командной строки для работы с редактором, и эти команды легко можно поместить в командный файл сценария оболочки. ("Команда Ex это просто другое название для команды, вводимой в командной строке, :-команды).

Для выполнения поставленной задачи вам потребуется ввести следующие команды Ex:

%s/-person-/Jones/g
write tempfile
quit

Поместите эти команды в файл "change.vim". Теперь, для запуска редактора в пакетном режиме, используйте сценарий оболочки:

for file in *.txt; do
  vim -e -s $file < change.vim
  lpr -r tempfile
done

Цикл for-done это конструкция командного языка оболочки sh, позволяющая в данном случае выполнять две команды между строками for и done с одновременным изменением значения переменной $file.

Вторая строка сценария запускает Vim в режиме Ex (аргумент -e) для каждого файла $file и применяет к нему команды, прочитанные из файла "change.vim". Аргумент -s заставляет Vim работать молча, иными словами, не выводить :prompt или какие-либо другие сообщения.

Команда "lpr -r tempfile" печатает получившийся в результате обработки Vim файл "tempfile" и удаляет его (на операцию удаления указывает аргумент -r).

ЧТЕНИЕ СО СТАНДАРТНОГО ВВОДА

Vim умеет читать текст со стандартного ввода. Поскольку обычно на стандартный ввод Vim подаются команды, то необходимо сказать редактору, что это будет именно текст. Для этого, вместо имени файла Vim передаётся аргумент "-":

ls | vim -

Это позволяет вам редактировать вывод команды "ls", без необходимости предварительного сохранения текста в файл.

Если вы используете для чтения текста стандартный ввод, то можно также воспользоваться аргументом "-S" для запуска сценария Vim:

producer | vim -S change.vim -
СЦЕНАРИИ КОМАНД ОБЫЧНОГО РЕЖИМА

Использовать команды Обычного режима в сценарии можно следующим образом:

vim -s script file.txt ...

Замечание: Значение "-s" зависит от того, используется ли оно совместно с ключом "-e" или без него. В данном случае "-s" указывает на необходимость чтения команд Обычного режима из указанного файла сценария. При использовании совместно с "-e" этот ключ заставляет Vim выполнять операции молча, имя файла сценария после "-s" при этом не указывается.

Команды сценария выполняются так, как вы их набрали. Не забывайте, что перенос строки будет интерпретироваться как нажатие <Enter>, что в Обычном режиме перемещает курсор к следующей строке.

Чтобы написать сценарий, вам нужно открыть файл и набрать необходимые команды. Возможно, вы столкнётесь с трудностями, поскольку от вас потребуется хорошо представить, какой будет результат выполнения введённых вами команд. Другой способ создания сценария -- записать требуемую последовательность команд при их выполнении вручную. Для этого запустите Vim с ключом "-w":

vim -w script file.txt ...

Vim сохранит все нажатые кнопки в файл "script". Если вы допустите небольшую ошибку, то сможете отредактировать файл сценария позднее.

Аргумент "-w" добавляет информацию о нажатых кнопках в существующий сценарий. Это полезно, если вы записываете необходимый сценарий по частям. Если же вам нужно начать запись сценария с самого начала, то используйте для этой цели ключ "-W". Содержимое существующего файла при этом будет перезаписано новыми командами.


Следующая глава: Шаблоны и команды поиска
Авторские права: см. Авторские права