【问题标题】:How to bind F1-F12 key as keyboard macro in Emacs?如何在 Emacs 中将 F1-F12 键绑定为键盘宏?
【发布时间】:2014-02-03 19:32:38
【问题描述】:

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

【问题讨论】:

  • 你的意思是要在按shift-F1的时候录制一个键盘宏,存入F1,按F1的时候执行?
  • 是的。而且每个功能键都有自己的kbd-macro。
  • 当然,当您分配 12 时,您迟早会忘记他们每个人所做的事情。使用name-last-kbd-macro。然后您可以使用M-x 调用它。使用smex 无痛。
  • 感谢 abo-abo。大概我会用两三个。所以我不会忘记。对我来说,使用宏名命名、保存、执行将需要一些时间。我想在功能键中缓存 kbd-macro。我承认这个标题言过其实。

标签: function emacs macros key


【解决方案1】:

试试这段代码:

(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 开始宏定义,但现在 f5f6f7f8功能相同 f4 的方式,除了每个都记住自己的宏。 您使用键完成定义,然后使用相同的键再次调用它。与 f4 完全一样。 宏也有名字,例如mcr-f5, mcr-f6, ...,所以你可以用 M-x 来调用它们。

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

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

(require 'centimacro)

f5 将调用centi-assign

  1. 它会提示您下一个绑定的位置,因此您按下 f6, 例如。
  2. 宏现在正在录制,按 f6 将停止它并分配 f6 的新宏。
  3. 现在您可以将您在 f6 中定义的内容用于其他宏,例如 f7,但也可以是 Ce,不限于功能键。

这是一个例子:

<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". 

【讨论】:

  • 非常感谢。它几乎解决了我的问题。顺便说一句,我可以在定义 kbd-macro 期间使用 kbd-macro 吗?在定义 f6 kbd-macro 时,可以使用预定义的 f5 kbd-macro 吗?
  • 我不明白为什么只要没有循环依赖就不可能。我明天会尝试更新代码以使其正常工作。
【解决方案2】:

将宏分配给键是微不足道的。照常记录,然后输入:

C-xC-kb

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

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

【讨论】:

  • 谢谢。我不知道命令。它非常有用且简单。
【解决方案3】:

我不认为您可以完全按照您的指定执行此操作,因为您编写的任何帮助解决此问题的函数都必须将 (start-kbd-macro) 作为最后一次调用 - 这就是 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 宏是有问题的......最好让他们以正常方式记录宏,并保存它有这个功能)

【讨论】:

    【解决方案4】:

    这是我使用过的解决方案:

    录制宏后,使用 C-xC-kn 命名。

    然后你可以使用 M-xinsert-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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      相关资源
      最近更新 更多