如何在Emacs中绑定F1-F12键作为键盘宏



我想将F1-F12键绑定为键盘宏。用Shift-[F1-F12]启动kbd宏,并用[F1-F12执行它。每个键可以有不同的宏。有办法做到这一点吗?

试试这段代码:

(mapc (lambda(x) (global-set-key x 'auto-name-macro))
'([f5] [f6] [f7] [f8]))
(defun auto-name-macro (arg)
(interactive "p")
(if defining-kbd-macro
(progn
(kmacro-end-or-call-macro arg)
(fset
(intern (format "mcr-%s" last-command-event))
last-kbd-macro))
(execute-kbd-macro
(intern
(format "mcr-%s" last-command-event)))))

与以前一样,您使用f3开始宏定义,但现在f5f6784一样,除了每个都记得自己的宏。用键完成定义,然后用同一个键再次调用它。与f4完全一样。宏还获得名称,例如mcr-f5mcr-f6。。。,因此您可以使用M-x来调用它们。

UPD:宏可以相互引用并绑定到任何键

代码不止几行,所以我把它放在https://github.com/abo-abo/centimacro.设置只是

(require 'centimacro)

f5将调用centi-assign

  1. 它会提示您下一次绑定的位置,因此您可以按f6,例如
  2. 宏现在正在录制,按下f6将停止并分配新的宏到f6
  3. 现在,您可以将在f6中定义的内容用于其他宏,例如f7

这里有一个例子:

<f5><f6>foo<f6>                 ;; Now <f6> inserts "foo".
<f5><f7><f6>bar<f7>             ;; Now <f7> inserts "foobar".
<f5><f8><f6>-<f7>-<f6><f8>      ;; Now <f8> inserts "foo-foobar-foo".
<f5><f6>omg<f6>                 ;; Now <f6> inserts "omg",
;;     <f7> - "omgbar",
;;     <f8> - "omgbar-omg-omg". 

将宏分配给键很简单。只需像往常一样记录,然后键入:

C-x C-k 2

我还建议您不要在"记录宏"上浪费12个有用的绑定,而一个(预先存在的)绑定就可以了,所以您可能更喜欢适应这种方法,而不是追求原始请求。

最后,请注意,F5-F9都是为最终用户保留的,但其他功能键不是,并且已经有了有用的绑定(有趣的是,包括录制键盘宏的键),所以我将重点关注这些。(如果你用完了,你总是可以将其中一个或多个作为前缀绑定。)

我不认为您可以按照指定的方式执行此操作,因为您为帮助执行此操作而编写的任何函数都必须将(start-kbdmacro)作为其中的最后一个调用-这就是start-kbd宏的工作方式。这样可以防止它在用户完成录制后命名键盘宏

我能看到的唯一类似的方法是将shift-F1作为您在完成录制要存储在F1中的宏后使用的键。

用户必须以通常的方式开始录制kbd宏,但在完成后点击shift F1。然后,你可以很容易地在shift F1上放置一个函数,将宏重命名为绑定到F1的函数。

代码应该是这样的:

(defun assign-macro-to-f1 () (interactive)
(name-last-kbd-macro 'f1-kbd-macro)  
(global-set-key[(f1)] (execute-kbd-macro `f1-kbd-macro))
)  
(global-set-key [(shift f1)] `assign-macro-to-f1) 

(注意-我也尝试过在shift-f1函数中结束kbd宏,但在函数中乱用kbd宏似乎是有问题的……最好让他们以正常方式记录宏,并用这个函数保存它)

以下是我使用过的解决方案:

录制完宏后,使用C-xC-k2对其进行命名。

然后,您可以使用M-xinsert-kbd-macro,并为其指定您刚刚定义的宏的名称。这将插入一些定义宏的lisp代码。然后,您可以将生成的lisp代码放在init.el文件中,然后放一个global-set-key,将宏设置为所需的任意键。

以下是生成的lisp和keybinding的示例(宏只输入单词"test"):

(fset 'test-macro
(lambda (&optional arg) "Keyboard macro." (interactive "p") 
(kmacro-exec-ring-item (quote ([116 101 115 116 41 backspace] 0 "%d")) arg)))
(global-set-key '[(f5)] 'test-macro)

最新更新