Добавление ранее определенного макроса в кольцо макросов в Emacs - PullRequest
3 голосов
/ 04 сентября 2010

Я использовал команды kmacro, такие как kmacro-name-last-macro, для сохранения макросов клавиатуры.Проблема в том, что после того, как я сохранил макрос и даже добавил его в свой файл .emacs, я столкнулся с ошибкой и хочу отредактировать макрос, используя kmacro-step-edit-macro.Если мой названный макрос больше не находится в кольце макросов (по умолчанию kmacro-ring-max равен 8), я не могу использовать какие-либо команды редактирования или кольца макросов для этого макроса.Узнав, что name-last-kbd-macro сохранит форму символа, которую легче редактировать, я с сожалением использую kmacro-name-last-macro и удивляюсь, почему это новое значение по умолчанию.

Есть ли способ добавить ранее определенный макрос вкольцо макросов, чтобы я мог редактировать его с помощью kmacro-step-edit-macro?

1 Ответ

3 голосов
/ 04 сентября 2010

Да, есть способ добавить ранее определенный макрос в кольцо макросов, чтобы вы могли редактировать его с помощью kmacro-step-edit-macro:

Представьте, что вы назвали макрос клавиатуры tata, используя name-last-kbd-macro, и сделали insert-kbd-macro для tata. Например:

(fset 'tata
   [return return ?f ?o ?o return])

Вы можете сохранить это определение макроса в вашем .emacs для дальнейшего использования. В новом сеансе emacs вы можете использовать следующий код lisp для возврата вашего макроса в ваше kmacro-ring:

(kmacro-push-ring (list 'tata 0 "%d"))
(kmacro-pop-ring)

После этого вы можете сделать kmacro-step-edit-macro.

Если вы назвали свой макрос, используя kmacro-name-last-macro вместо name-last-kbd-macro, вызов insert-kbd-macro вставит другое определение для вашего макроса, используя лямбда-функцию вместо вектора или строки (чтобы иметь возможность сохранить текущий счетчик), например:

(fset 'tata
   (lambda (&optional arg) "Keyboard macro." (interactive "p")
   (kmacro-exec-ring-item
      (quote ([return return 102 111 111 return] 0 "%d")) arg)))

В этом случае kmacro-step-edit-macro вызывает ошибку, поскольку это не вектор или строка. Для решения этой проблемы вы можете:

  • либо преобразуйте вашу лямбда-функцию в классическое векторное макроопределение (как, например, верхнее определение tata выше). Обычно такое преобразование всегда возможно.

  • или определите макрос, который вызывает ваш макрос лямбда-функции, например: (fset 'foo [?\M-x ?t ?a ?t ?a return]) И затем вы можете поместить этот макрос foo в кольцо kmacro, как сказано выше. Но в этом случае у вас могут возникнуть побочные эффекты в конце выполнения макроса.

...