Пример использования макросов в редакторе mcedit

в 11:03, , рубрики: linux, macros, mcedit, midnight commander, метки: , ,

Преамбула

Я, как правило, редактирую исходний код во встроенном в mc (midnight commander) редакторе mcedit (не спрашивайте почему не в vim, так исторически сложилось). И уже довольно давно в mcedit можно пользоваться функцией записи и проигрывания макросов, с которой хотелось бы познакомить тех кто пользуется данным редактором.

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

Дано

Задача была открыть на редактирование файл содержащий проблему в котором по хоткею, т.е. приложив минимум усилий.
Т.е в редакторе был открыт файл со списоком предупреждений, который был сгенерирован утилитой doxygen, это был список содержащий полный путь к проблемному файлу а также номер строки.

Файл с предупреждениями выглядел примерно так (только строк было значительно больше):

/home/smind/dev/mc/lib/vfs/path.c:1046: warning: argument 'element' of command @param is not found in the argument list of vfs_path_serialize(const vfs_path_t *vpath, GError **error)
/home/smind/dev/mc/lib/vfs/path.c:1212: warning: The following parameters of vfs_path_append_new(const vfs_path_t *vpath, const char *first_element,...) are not documented: parameter 'first_element'
/home/smind/dev/mc/lib/vfs/path.c:1246: warning: The following parameters of vfs_path_append_vpath_new(const vfs_path_t *first_vpath,...) are not documented: parameter 'first_vpath'

Решение

В первую очередь, задача была разбита на две подзадачи:
1) выделить нужный участок текста от начала строки до двоеточия, включая номер строки;
2) обработать во внешней программе выделенный фрагмент;

Внешние макросы (external macros)

Другими словами, необходимо написать внешний макрос, который примет строку и откроет нужный файл на нужной строке.

Узнать где mcedit хранит внешние макросы можно коммандой:

smind@darkstar$ mc -F

в результате мы увидим следующий текст

[Пльзовательские данные]
    mcedit macros:  /home/smind/.local/share/mc/mc.macros
    mcedit external macros: /home/smind/.local/share/mc/mcedit/macros.d/macro.*

Далее необходимо написать код внешнего обработчика и сохранить его с именем /home/smind/.local/share/mc/mcedit/macros.d/macro.<ЧИСЛО>.sh
Данное <ЧИСЛО> потребуется далее при написании макроса (в моём случае файл назывался macro.42.sh).

Файл внешнего макроса должен выглядеть примерно так

e       edit file
        mcedit `cat %b`

%b — имя файла содержащего выделенный в редакторе текст.

Макросы редактора (mcedit macros)

Для записи макроса достаточно нажать сочетание ctrl-r после чего дальнейшие нажатия клавишь будут записываться и смогут быть повторены.
Для окончания необходима еще раз нажать ctrl-r и далее нажать хоткей для вызова макроса.

Теперь нужно записать следующий макрос:

Shift-F7 (продолжить поиск)
Ctrl-Right (перейти на слово вправо)
Ctrl-Right (перейти на слово вправо)
Shift-Home (Пометить текст от курсора до начала строки)

… и после окончания записи макроса повесить его на сочетание ctrl-P, после чего необходимо открыть файл храняший макросы /home/smind/.local/share/mc/mc.macros

[editor]
ctrl-T=ExecuteScript:2;
ctrl-F=ExecuteScript:0;
ctrl-A=MarkAll:-1;
ctrl-W=Paste:-1;Down:-1;
ctrl-P=SearchContinue:-1;WordRight:-1;WordRight:-1;MarkToHome:-1;

В строчку, содержащую нужный макрос, необходимо добавить вызов внешнего макроса — ExecuteScript:42;

Должно получиться что то вроде этого:

[editor]
ctrl-T=ExecuteScript:2;
ctrl-F=ExecuteScript:0;
ctrl-A=MarkAll:-1;
ctrl-W=Paste:-1;Down:-1;
ctrl-P=SearchContinue:-1;WordRight:-1;WordRight:-1;MarkToHome:-1;ExecuteScript:42;

Далее просто устанавливаем курсор на любую строку содержащую путь и нажимаем ctrl-p, произойдёт открытие файла по пути под курсором.

FIN

PS: надеюсь количество пользователей испольжующих макросы в mcedit ВНЕЗАПНО возрастёт.
PPS: на сочетание ctrl-F у меня повешено форматирование выделенного текста с помощью утилиты indent (очень удобно)
PPPS: извиняюсь за большое количество повторений слов «Далее» и «После»

Автор: smind

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js