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

Function 如何在Emacs中将F1-F12键绑定为键盘宏?,function,emacs,macros,key,Function,Emacs,Macros,Key,我想将F1-F12键绑定为键盘宏。使用Shift-[F1-F12]启动kbd宏并使用[F1-F12]执行它。每个键可以有不同的宏。有什么方法可以做到这一点吗?我不认为您可以按照您指定的那样做,因为您编写的任何函数都必须具有(start kbd macro)作为其中的最后一个调用,这就是start kbd macro的工作方式。这将防止在用户完成录制后命名键盘宏 我能看到的唯一类似的方法是在录制完要存储在F1中的宏后使用shift-F1键 用户必须以通常的方式开始录制kbd宏,但在完成后按shif

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

我不认为您可以按照您指定的那样做,因为您编写的任何函数都必须具有(start kbd macro)作为其中的最后一个调用,这就是start kbd macro的工作方式。这将防止在用户完成录制后命名键盘宏

我能看到的唯一类似的方法是在录制完要存储在F1中的宏后使用shift-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-kb

我还建议您不要在“录制宏”上浪费12个有用的绑定,而一个(预先存在的)绑定就可以了,因此您可能更愿意采用这种方法,而不是追求最初的请求

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

尝试以下代码:

(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来调用它们

UPD:宏可以相互引用并绑定到任何键 代码不止几行,所以我把它放在了。 设置刚刚好

(require 'centimacro)
f5将调用
centi assign

  • 它会提示您下一次绑定的位置,因此您可以按f6, 比如说
  • 宏现在正在录制,按f6将停止录制并指定 将新宏设置为f6
  • 现在,您可以将在f6中定义的内容用于其他宏,比如f7,但也可以是C-e,它不限于功能键
  • 下面是一个例子:

    <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". 
    
    foo;;现在插入“foo”。
    酒吧;;现在插入“foobar”。
    --      ;; 现在插入“foo foobar foo”。
    天啊;;现在插入“omg”,
    ;;      - “omgbar”,
    ;;      - “omgbar omg omg”。
    
    以下是我使用过的解决方案:

    录制宏后,请使用C-xC-kn将其命名

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

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


    您的意思是想在按shift-F1时录制键盘宏,该宏保存到F1中,并在按F1时执行?是的。每个功能键都有自己的kbd宏。当然,当您指定12时,您迟早会忘记它们各自的功能。使用
    命名last kbd宏
    。然后可以使用
    M-x
    调用它。使用smex它是无痛的。谢谢你。我可能会用两三个。所以我不会忘记。命名、保存和使用宏名执行都需要花费一些时间。我想在功能键中缓存kbd宏。我承认这个标题有些夸张。非常感谢。这几乎解决了我的问题。顺便问一下,在定义kbd宏时我可以使用kbd宏吗?当我定义f6 kbd宏时,我可以使用预定义的f5 kbd宏吗?我不明白为什么只要没有循环依赖项就不可能。我明天会尝试更新代码,使其正常工作。谢谢。我不知道这个命令。它非常有用而且简单。
    (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)