Привет, коллеги. Давайте проясним философские моменты средств автоматизации действий: макросов, привязок и скриптов.
Что такое макрос в Вим? Это записанные в регистр клавиши, которые вы нажимаете. Регистр - это место, куда можно копировать и вырезать текст. Они помечены буквами английского алфавита: от 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.
Можно не использовать execute там, где не подставляются значения переменных. То есть он нужен только в первой и последней строке цикла. Но я поставил везде.
После того, как вы потренировались на макросе, записать те же команды в скрипт труда не составит.
Можно использовать source!. Эта команда выполняет скрипт не построчно, а посимвольно, как если бы мы вводили команды вручную. И выполняет команды как в нормальном режиме. Это похоже на макросы, только при записи макроса мы видим, что происходит, а здесь надо в уме всё держать; но опять-таки, после тренировки на макросе это несложно.
Можно и как функцию это оформить, даже с параметром, чтобы создавать табличку по запросу. Тогда ее можно вызвать через call.
Можно внутри функции извлечь текущую строку через getline('.'), вытащить из нее маркер и создать таблицу по нему. Тогда надо вызывать функцию на той строке, на которой нужный маркер.
Да что хотите можно.
А макросы - это одноразовое средство: показал Виму, что надо делать, он и повторил. Только будьте осторожны: если вы нажали пять раз влево, то и Вим нажмет пять раз. Если надо было больше или меньше - это не его забота. Если вам надо перейти на конец слова, скажем - используйте соответствующие команды движения!
Удачи, коллеги.