我想将F1-F12键绑定为键盘宏。使用Shift- [F1-F12]启动kbd-macro并使用[F1-F12]执行。每个键可以有不同的宏。有没有办法做到这一点?
答案 0 :(得分:2)
尝试这段代码:
(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 , f6 , f7 和 f8 的功能相同
作为 f4 的方式,除了每个记住他们自己的宏。
您使用密钥完成定义,然后使用相同的密钥再次调用它。完全像 f4 。
宏也可以获得名称,例如mcr-f5
,mcr-f6
,...,因此您可以使用 M-x 来调用它们。
有几行代码,所以我把它放在https://github.com/abo-abo/centimacro。 设置只是
(require 'centimacro)
f5 将致电centi-assign
。
以下是一个例子:
<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".
答案 1 :(得分:1)
将宏分配给密钥很简单。只需像往常一样记录,然后输入:
C-X C-K B'/ KBD>
我还建议你不要在一个(预先存在的)绑定时浪费12个有用的绑定“记录一个宏”,所以你可能更愿意适应这种方法而不是追求原始请求。
最后,请注意 F5 - F9 都是为最终用户保留的,但其他功能键不是,并且已经有了有用的绑定(包括用于录制键盘的键)宏,有趣的是,所以我会专注于那些。 (如果你用完了,你总是可以将其中一个或多个作为前缀绑定。)
答案 2 :(得分:0)
我认为你不能像你指定的那样行事,因为你写的任何函数都必须有(start-kbd-macro)作为最后一次调用 - 这就是启动的方式 - kbd-macro工作。这可以防止它在用户完成录制后命名键盘宏。
我能看到做出类似事情的唯一方法就是让shift-F1成为你完成记录要存储在F1中的宏之后使用的关键。
用户必须以通常的方式开始录制kbd宏,但在完成后点击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宏是有问题的......更好的是让它们以正常方式记录宏,并保存它使用此功能)
答案 3 :(得分:0)
这是我用过的解决方案:
录制宏后,使用 C-x C-k n 命名。
然后你可以使用 M-x insert-kbd-macro
并给它你刚定义的宏的名称。这将插入一些定义宏的lisp代码。然后,您可以将生成的lisp代码放在init.el
文件中,然后使用global-set-key
将宏设置为您想要的任何键。
以下是生成的lisp和键绑定的示例(宏只输入单词“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)