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

Рубрика "Секреты Вим". Макросы, привязки или скрипты?

Привет, коллеги. Давайте проясним философские моменты средств автоматизации действий: макросов, привязок и скриптов.

Что такое макрос в Вим? Это записанные в регистр клавиши, которые вы нажимаете. Регистр - это место, куда можно копировать и вырезать текст. Они помечены буквами английского алфавита: от a до z.

Вы можете и вручную написать последовательность команд и вырезать ее из буфера в регистр. Но Вим может сделать это за вас по образцу, причем справится с системными кодами клавиш вроде Control и Escape.

Смысл макроса: "покажи, что надо делать, и попроси Вим повторить". Это одноразовая автоматизация работы. Сейчас покажу пример, но сначала ликбез для тех, кто не знаком с темой: запись макроса начинает клавиша q, после которой надо указать регистр. Например, qq. Повторное нажатие q останавливает запись. Проиграть макрос позволяет @q. А @@ позволяет повторить последний проигранный макрос. Можно использовать повторитель: 42@@, то есть макрос можно выполнить многократно. Можно применить трюк: команда

:normal @a

позволит выполнить макрос на заданных строках.

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

Я записываю маркер sur в регистр w, а потом включаю запись макроса: qq. И преобразую файл в таблицу:

  • удаляю всё, кроме строк с маркером: :v/<C-W>w/d. Здесь ctrl+W нажимаю как есть, это вставка содержимого регистра w.
  • Удаляю время: :%s/^.\{-}://. Обратите внимание на ленивый квантификатор: мне не надо, чтобы в строке нашлось ещё двоеточие и всё удалилось до него.
  • Перехожу наверх и копирую первую строку: ggyyp.
  • Перехожу на первую строку и удаляю всё, кроме имён: :1,1s/=\s*[0-9.]\+//g.
  • Удаляю имена из остальных строк: :%s/\w\+\s*=\s*//g.
  • Сохраняю файл: :w! <C-R>w<CR>. Опять клавиши ctrl-w и ввод нажимаются физически.
  • Завершаю запись макроса: q.

Копирую в регистр w новое имя и повторяю процедуру: @q.

Может оказаться, что мне нужно будет делать это регулярно. Тогда я запишу те же команды в файлик и буду выполнять его как функцию (командой call), скрипт (командой source), или сделаю привязку к горячей клавише.

В принципе, можно взять содержимое регистра q и просто вставить его как код привязки: пишем :map Q <C-W>q

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

А вот скрипт, который делает то же самое и который можно вызвать командой :source.

-2

Можно не использовать execute там, где не подставляются значения переменных. То есть он нужен только в первой и последней строке цикла. Но я поставил везде.

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

Можно использовать source!. Эта команда выполняет скрипт не построчно, а посимвольно, как если бы мы вводили команды вручную. И выполняет команды как в нормальном режиме. Это похоже на макросы, только при записи макроса мы видим, что происходит, а здесь надо в уме всё держать; но опять-таки, после тренировки на макросе это несложно.

Можно и как функцию это оформить, даже с параметром, чтобы создавать табличку по запросу. Тогда ее можно вызвать через call.

Можно внутри функции извлечь текущую строку через getline('.'), вытащить из нее маркер и создать таблицу по нему. Тогда надо вызывать функцию на той строке, на которой нужный маркер.

Да что хотите можно.

А макросы - это одноразовое средство: показал Виму, что надо делать, он и повторил. Только будьте осторожны: если вы нажали пять раз влево, то и Вим нажмет пять раз. Если надо было больше или меньше - это не его забота. Если вам надо перейти на конец слова, скажем - используйте соответствующие команды движения!

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

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022

Наука
7 млн интересуются