LINUX.ORG.RU

Макросы в emacs


0

0

Пытаюсь немного автоматизировать работу в GDB с помощью макросов. Самый простой случай -- есть макрос, пишущий si и переводящий строку (go-si), и есть второй, вызывающий первый 10 раз (10si). Первая проблема вот в чем -- при вызове 10si макрос сначала пишет 10 раз si, и только потом начинает их выполнять. Соответственно если выполнить C-u 100 C-x e, т.е. 1000 раз выполнить stepi, то сначала идет дикий лаг секунд на 20 с полной загрузкой процессора, и только потом процесс начинает идти. Почему макросы не выполняются по шагам, а делают какой-то анфолдинг с буферизацией?

Сначала развернутся все макросы, после произойдёт выполнение того кода, в который они развернулись. Кажись, так...

one_more_hokum ★★★
()
Ответ на: комментарий от one_more_hokum

Как-то это не очень правильно. Хотя и быстрее, если он там как-то макрос сжимает.

У меня есть еще один вопрос. Есть макрос, выглядящий вот так: (fset 'cp_addr "p/x exit_addr\C-m\C-p\C-e\C-@\C-[b\C-[w\C-[>\C-y"), который выводит значение значение exit_addr, переходит на конец выведенной строки, копирует последнее слово, то есть сам адрес, потом переходит на последнюю строку (приглашение гдб) и вставляет этот адрес. При записи макроса все работает, но при его выполнении макрос копирует слово на строку выше, т.е. addr. Насколько я понимаю, это происходит из-за того, что после нажатия энтера он не ждет вывода гдб, а сразу поднимается обратно на строку команды. Можно емакс как-то заставить подождать вывода?

flagist0
() автор топика

Э-э-э, я не очень понял, а причем (и зачем) тут макросы? Или имеются в виду клавиатурные макросы? Тебе функция нужна, которая выполнит нужное число раз gud-stepi.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Да, имелись в виду клавиатурные макросы. Макрос со степами я привел в связи с вопросом о буферизации (?), хотя и от него была небольшая польза. А нужен был именно второй макрос. Здесь я привел его кусочек, который вызывал вопросы. В полном виде он должен был довольно здорово уменьшить количество клавотыков, при этом его создание заняло, как и полагается макросу, секунд 10. А лисп я практически не знаю :(

flagist0
() автор топика

Там же stepi можно делать N раз, просто указывая префиксный аргумент?
Это и в 23, и в ЦВС должно работать.

Sphinx ★★☆☆
()
Ответ на: комментарий от flagist0

Мне кажется, что применение клавиатурных макросов в режиме, производном от comint-mode, неуместно. При обычном редактировании -- это да, а тут интерактивный режим в внешним процессом. На мой взгляд, это не годится. А почему не используешь gdb ui и т. д. (setq gdb-many-windows t), затем M-x gdb? Есть какой-то особый смысл колупаться в интерактивном режиме, или тебе что-то особенное нужно?

Решить твою задачку можно, наверное, но через лиспописание. То есть надо будет ловить момент, когда gdb выполнит команду и выдаст новое приглашение и туда вставлять уже всякие адреса.

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.