如何命名动作序列并在Emacs中的M-x界面中调用它

时间:2013-10-16 03:46:35

标签: emacs customization

我在Emacs 24中使用nrepl作为Clojure IDE。当我想在Clojure项目中编写一些代码时(在启动Emacs之后),我必须重复以下命令:

M-x cd
docs/clojurefiles/conways-game-of-life
M-x nrepl-jack-in
C-x 4 f src/conways_game_of_life/core.clj

我想将所有上述操作保存为命令,并在“M-x”界面中调用它。关注this instruction我记录我的动作并将其保存为〜/ .emacs文件中的“last-kbd-macro”:

F3
M-x cd
docs/clojurefiles/conways-game-of-life
M-x nrepl-jack-in
C-x 4 f src/conways_game_of_life/core.clj
F4
M-x name-last-kbd-macro<RET> start-conway-project
M-x insert-kbd-macro<RET> start-conway-project

现在,以下变量被添加到我的〜/ .emacs文件中:

(setq last-kbd-macro
[?\M-x ?c ?d return ?d ?o ?c ?s ?/ ?c ?l ?o ?j ?u ?r ?e ?f ?i ?l ?e ?s ?/ ?c ?o ?n ?w ?a ?y ?s ?- ?g ?a ?m ?e ?- ?o ?f ?- ?l ?i ?f ?e return ?\M-x ?n ?r ?e ?p ?l ?- ?j ?a ?c ?k ?- ?i ?n return ?\C-x ?4 ?f ?s ?r ?c ?/ ?c ?o ?n ?w ?a ?y ?s ?_ ?g ?a ?m ?e ?_ ?o ?f ?_ ?l ?i ?f ?e ?/ ?c ?o ?r ?e ?. ?c ?l ?j return])

重新启动Emacs后,我可以使用F4来调用此宏。但是,我想要的是定义我自己的命令并在“M-x”中调用它。所以我将上面的定义修改为:

(setq start-conway-project
[?\M-x ?c ?d return ?d ?o ?c ?s ?/ ?c ?l ?o ?j ?u ?r ?e ?f ?i ?l ?e ?s ?/ ?c ?o ?n ?w ?a ?y ?s ?- ?g ?a ?m ?e ?- ?o ?f ?- ?l ?i ?f ?e return ?\M-x ?n ?r ?e ?p ?l ?- ?j ?a ?c ?k ?- ?i ?n return ?\C-x ?4 ?f ?s ?r ?c ?/ ?c ?o ?n ?w ?a ?y ?s ?_ ?g ?a ?m ?e ?_ ?o ?f ?_ ?l ?i ?f ?e ?/ ?c ?o ?r ?e ?. ?c ?l ?j return])

但是当我使用“M-x”并输入“start-conway-project”时,会出现“[no match]”符号,但它不起作用。

什么是“emacs”方式将某些操作定义为命令(宏或其他)并使用“M-x”调用它? 谢谢!

3 个答案:

答案 0 :(得分:1)

以下是关于宏用法的说明。第一段是如何创建然后手动复制到.emacs文件的一步一步 - 至少有三种方法可以调用启动宏,以及相同数量的方法来停止录制宏。第二段是为你做的功能。

但是,我建议创建一个lisp函数而不是使用宏。该宏看起来像fset . . .,然后您可以创建类似于以下内容的键盘快捷键:(global-set-key (kbd "<f5>") 'chad)

;; Record Macro:  C-x (  |  F3  |  M-x kmacro-start-macro
;; Stop Recording:  C-x )  |  F4  |  M-x save-macro
;;   M-x name-last-kbd-macro RET my-silly-macro
;;   M-x insert-kbd-macro RET my-silly-macro RET
;;   The macro will be inserted into the active buffer, which can then be copied to the init.el

(defun save-macro (name)
    "save a macro. Take a name as argument
     and save the last defined macro under
     this name at the end of your .emacs"
     (interactive "SName of the macro :")  ; ask for the name of the macro
     (kmacro-name-last-macro name)         ; use this name for the macro
     (find-file user-init-file)            ; open ~/.emacs or other user init file
     (goto-char (point-max))               ; go to the end of the .emacs
     (newline)                             ; insert a newline
     (insert-kbd-macro name)               ; copy the macro
     (newline)                             ; insert a newline
     (switch-to-buffer nil))               ; return to the initial buffer

答案 1 :(得分:1)

如果你真的这样做了:

  

M-x name-last-kbd-macro RET start-conway-project
  M-x insert-kbd-macro RET start-conway-project

然后你给(应该!)的代码不是

(setq last-kbd-macro ...

但:

(fset 'start-conway-project ...

前者设定变量;后者设置一个函数,您可以使用M-x调用,或者可以绑定键序列:

(global-set-key (kbd "C-c s") 'start-conway-project)

答案 2 :(得分:1)

这是另一种方法:

使用Bookmark+,您可以使用带有前缀参数的命令bmkp-make-function-bookmark来定义执行最后命名的键盘宏的书签。实际上,这会使您的键盘宏持久,并允许您使用普通书签“跳跃”来实现它。

当您使用前缀arg调用bmkp-make-function-bookmark时,系统会提示您输入要创建的书签的名称。除了使用M-x来调用命令外,您还可以使用C-x p c F(所有书签命令都在前缀键C-x p上,该键绑定到键映射bookmark-map)。

(仅供参考,相关命令bmkp-wrap-bookmark-with-last-kbd-macro将最后一个键盘宏的代码添加到书签中。)