开发者

Adding a previously defined macro to the macro ring in Emacs

I've been using kmacro commands such as kmacro-name-last-macro to save keyboard macros. The problem is that after I have saved a macro and even added it to my .emacs file, I come across an error and want to edit the macro using kmacro-step-edit-macro. If my named macro is no longer in the macro ring (the default kmacro-ring-max is 8) I can't use any of the editing or macro ring commands on that macro. After learning that name-last-kbd-macro will save the symbol form 开发者_JS百科which is easier to edit, I regret using kmacro-name-last-macro and wonder why it is the new default.

Is there are way to add a previously defined macro to the macro ring so I can edit it with kmacro-step-edit-macro?


Yes, there is a way to add a previously defined macro to the macro ring so you can edit it with kmacro-step-edit-macro :

Imagine you have named a keyboard macro tata using name-last-kbd-macro, and done a insert-kbd-macro for tata. For example :

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

You can store this macro definition into your .emacs for later use. On a new emacs session, you can use the following lisp code to put back your macro into your kmacro-ring :

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

After that, you can do a kmacro-step-edit-macro on it.

If you have named your macro using kmacro-name-last-macro instead of name-last-kbd-macro, the call to insert-kbd-macro will insert a different definition for your macro, using a lambda function instead of a vector or a string (to be able to store the current counter), for example :

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

In this case, kmacro-step-edit-macro raises an error as this is not a vector or a string. To solve this problem you can :

  • either transform your lambda function to a classic vector macro definition (like, for example, the top definition of tata above). It is normally always possible to do this kind of transformation.

  • or define a macro that calls your lambda function macro, for example : (fset 'foo [?\M-x ?t ?a ?t ?a return]) And then you can place this foo macro into the kmacro ring as said before. But in this case, you could have some side-effects at the end of the macro execution.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜