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

时间:2014-01-15 10:59:32

标签: function emacs macros key

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

4 个答案:

答案 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-f5mcr-f6,...,因此您可以使用 M-x 来调用它们。

UPD:宏可以引用彼此并绑定到任何键

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

(require 'centimacro)

f5 将致电centi-assign

  1. 它会提示您下一个装订的位置,所以按 f6 , 例如。
  2. 宏正在录制,按 f6 将停止并指定 新的宏到 f6
  3. 现在你可以使用你在 f6 中定义的其他宏,比如 f7 ,但它可能是 Ce ,它不限于功能键。
  4. 以下是一个例子:

    <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)