User Tools

Site Tools


vim:vim_использование_макросов

vim использование макросов

Макрос в vim – это функция, позволяющая записать последовательность команд, которые используются для выполнения определенной задачи. Далее, этот макрос можно выполнять много раз, чтобы повторять одну и ту же работу в автоматическом режиме.

Рассмотрим концепцию макросов vim на практическом примере.

Предположим, был получен файл CSV, содержащий список хостов в сети от гипотетической системы мониторинга. Нам нужно преобразовать его в формат <html>/etc/hosts</html>.

Исходный файл:

cat hosts.csv
 
Description,Hostname,IPAddress,FQDN
"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca
"OCP Master Node 2",ocpmaster02,192.168.0.21,ocpmaster02.home.ca
"OCP Master Node 3",ocpmaster03,192.168.0.22,ocpmaster03.home.ca
"OCP Worker Node 1",ocpnode01,192.168.0.30,ocpnode01.home.ca
"OCP Worker Node 2",ocpnode02,192.168.0.31,ocpnode02.home.ca
"OCP Worker Node 3",ocpnode03,192.168.0.32,ocpnode03.home.ca
"Ansible Host 1",ansibleh01,192.168.0.144,ansibleh01.home.ca
"Ansible Host 2",ansibleh02,192.168.0.145,ansibleh02.home.ca

Ожидаемый результат:

192.168.0.20    ocpmaster01.home.ca    ocpmaster01    #OCP Master Node 1
192.168.0.21    ocpmaster02.home.ca    ocpmaster02    #OCP Master Node 2
192.168.0.22    ocpmaster03.home.ca    ocpmaster03    #OCP Master Node 3
192.168.0.30    ocpnode01.home.ca    ocpnode01    #OCP Worker Node 1
192.168.0.31    ocpnode02.home.ca    ocpnode02    #OCP Worker Node 2
192.168.0.32    ocpnode03.home.ca    ocpnode03    #OCP Worker Node 3
192.168.0.144    ansibleh01.home.ca    ansibleh01    #Ansible Host 1
192.168.0.145    ansibleh02.home.ca    ansibleh02    #Ansible Host 2

Чтобы получить ожидаемый результат, необходимо: отредактировать ввод, изменив положение некоторых полей, удалив кавычки и вставив соответственно символы табуляции или комментария <html>#</html>. Воспользуемся макросами vim для решения этой задачи.

Решение задачи

Рабочий процесс макроса Vim состоит из записи команд и нажатий клавиш при внесении изменений, необходимых для решения задачи в первой строке, сохранении последовательности команд в регистре и последующем воспроизведении макроса, чтобы сделать то же самое в остальных строках.

Чтобы записать макрос и сохранить его в регистр, вводим клавишу q, а затем буквы от a до z, которые представляют регистр для сохранения макроса. А затем все команды, которые нужно записать, а затем снова нажимаем клавишу q, чтобы остановить запись.

q<register><commands>q

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

qao<ESC>q

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

Запись макросов в vim - это упражнение по логике и правильному использованию команд vim. Имейте в виду, если вы хотите, чтобы этот макрос повторялся в других строках, даже если входные данные несколько изменяются. Например, лучше использовать команду dw для удаления слова, а не повторять команду x для удаления символов, потому что количество символов в слове может варьироваться от строки к строке.\

Давайте запишем макрос, который преобразует первую строку файла csv в требуемый формат, и сохраним его в регистре h. Начнем с размещения курсора в любом месте первой строки, которую мы хотим изменить в файле:

"OCP Master Node 1",ocpmaster01,192.168.0.20,ocpmaster01.home.ca

Начнем запись макроса, нажав q и h, чтобы сохранить его в регистре h

qh

Во время записи макроса в строке состояния внизу отобразится следующее сообщение:

recording @h

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

0

Это первое поле – описание, которое становится комментарием в конце строки в выводе. Пока мы там находимся, заменим символ кавычек <html>“</html> на символ комментария <html>#</html>, чтобы этого не пришлось делать позже, когда перенесем это поле в конец строки:

r#

Затем удалим следующую кавычку, переместив на нее курсор с помощью команды f, и нажав x чтобы удалить ее

f"x

На текущий момент, первая строка выглядит так:

#OCP Master Node 1,ocpmaster01,192.168.0.20,ocpmaster01.home.ca

Затем переместим курсор на одну позицию вправо с помощью l и удалим все имя хоста до следующей запятой:

ldf,

Не стоит забывать, что когда в Vim удаляется текст, он также копируется. Давайте вставим его в конец строки. Переходим в конец строки – A, вставляем запятую, затем прожимаем <ESC> p, чтобы вставить имя хоста:

A,<ESC>p

Теперь поля расположены почти в желаемом порядке. Переместим комментарий в конец строки. Сделайте это путем перемещения курсора в начало – 0, У и удалим комментарий до следующей запятой:

0df,

Далее, переместим курсор в конец строки с – <html>$</html>, вставьте текст – <html>p</html> и удалим последнюю запятую – <html>x</html>:

$px

Теперь поля находятся в желаемом положении, а строка выглядит так:

192.168.0.20,ocpmaster01.home.ca,ocpmaster01,#OCP Master Node 1

И в завершение, заменим все запятые на символ табуляции с помощью команды s:

:s/,/\t/g<ENTER>

Строка стала соответствовать желаемому результату:

192.168.0.20    ocpmaster01.home.ca     ocpmaster01     #OCP Master Node 1

Завершим макрос, переместив курсор на следующую строку – j, для возможности его повторного использования. Наконец, останавливаем запись – q:

jq

Макрос записан, и готов к использованию.

Просмотр и запуск макросов

Поскольку макросы сохраняются в регистрах vim, то можно просмотреть сохраненные макросы, используя команду <html>:reg</html> для просмотра содержимого всех регистров:

 Все макросы
:reg
 
# Конкретный регистр
:reg h

Используя оба метода, можyj увидеть, что содержимое регистра h соответствует макросу, который был записали ранее. Обратите внимание, что специальные символы, такие как ESC и ENTER, были заменены представлением Vim <html>^[</html> и <html>^M</html> соответственно.

После записи макроса и проверки его содержимого, запустим его, чтобы внести те же изменения в оставшиеся строки.

Чтобы воспроизвести макрос один раз, перемещаем курсор на следующую строку и нажимаем <html>@h</html>, где <html>h</html> представляет регистр, в котором был сохранен макрос.

Обратите внимание, что макрос автоматически перемещает курсор на следующую строку по мере необходимости. Это позволяет повторить его выполнение. Чтобы повторить выполнение макроса вводим <html>@@</html>.

Так же, можно повторить макрос для всех оставшихся строк. Например, чтобы выполнить макрос для пяти оставшихся строк, вводим <html>5@@</html> либо <html>5@h</html>.

Если нужно запустить макрос для всех строк до конца файла, независимо от того, сколько строк существует, используем такой синтаксис:

:%:normal @h

Теперь все строки соответствуют ожидаемому результату. Чтобы завершить изменения, удалим строку заголовка в начале файла.
Nota Bene! Если используется макрос в файле с более чем тысячами строк, обратите внимание на команду set lazyredraw для повышения производительности. Этот параметр запрещает Vim перерисовывать экран для каждой итерации макроса.

vim/vim_использование_макросов.txt · Last modified: 2023/04/06 10:18 (external edit)