我在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”调用它? 谢谢!
答案 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
将最后一个键盘宏的代码添加到书签中。)