Преамбула
Я, как правило, редактирую исходний код во встроенном в 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