Как стать автором
Обновить

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

Время на прочтение 3 мин
Количество просмотров 7.9K

Преамбула


Я, как правило, редактирую исходний код во встроенном в 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: извиняюсь за большое количество повторений слов «Далее» и «После»
Теги:
Хабы:
+11
Комментарии 13
Комментарии Комментарии 13

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн