我想将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开始宏定义,但现在f5、f6784一样,除了每个都记得自己的宏。用键完成定义,然后用同一个键再次调用它。与f4完全一样。宏还获得名称,例如mcr-f5
、mcr-f6
。。。,因此您可以使用M-x来调用它们。
UPD:宏可以相互引用并绑定到任何键
代码不止几行,所以我把它放在https://github.com/abo-abo/centimacro.设置只是
(require 'centimacro)
f5将调用centi-assign
。
- 它会提示您下一次绑定的位置,因此您可以按f6,例如
- 宏现在正在录制,按下f6将停止并分配新的宏到f6
- 现在,您可以将在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)