45

大约一年前从 Vim 搬过来后,我正在使用evil-mode 。我做了一些自定义,但还没有弄清楚如何保存 vim 风格的键盘宏。

我可以在邪恶模式下定义和运行它们,使用与 Vim 中完全相同的键。

  • qa开始录制宏的字母。
  • q停止录制。
  • @a运行宏的字母。

我想将其中一些保存到我的init.el文件中以在会话之间使用,但我无法在网上找到对此的任何参考,也没有找到正确的语法。

如何将这些邪恶模式的键盘宏保存到文件中?有什么原因我应该使用本机 Emacs 键盘宏,有没有办法可以通过@a键运行这些宏?

4

2 回答 2

57

Evil-mode 宏并不特殊,它们只是普通的 Emacs 宏,你用同样的方法保存它们,但是你需要做一些特殊的工作才能将它们放入 evil 寄存器。

让我们来看一个例子:

在缓冲区中,执行qfifoobarESCq. 这会将宏保存到f将 foobar 插入缓冲区的寄存器中。

现在运行M-xname-last-kbd-macroRETmymacroRET

转到您的init.el文件并执行M-xinsert-kbd-macroRETmymacroRET.

这会将您的宏转储到fset调用中。

(fset 'mymacro [?i ?f ?o ?o ?b ?a ?r escape])

如果你把它放在你的 init.el 中,你就可以mymacroM-x.

但是,我们将它保存到寄存器f中,并且我们希望它在每次启动时都存在。您需要从上面的代码中提取宏向量并将其保存到您的寄存器中,init.el如下所示:

;; make sure this is done after evil-mode has been loaded
(evil-set-register ?f [?i ?f ?o ?o ?b ?a ?r escape])

现在您可以从@!

请参阅有关将宏命名和插入为文本的文档

于 2014-04-02T18:45:11.047 回答
2

我遇到了这个问题,并在另一个问题中写了一个evil-paste-after命令建议:

(defun evil-paste-kbd-macro-advice (&rest argv)
  "make evil paste kbd-macro if register content is a macro.
this function check whether content is a macro by:
 1. equal to `last-kbd-macro'
 2. is a vector but not string
 3. contain unprintable character"
  (if (and (>= (length argv) 2)
           (second argv))
      (let* ((register (second argv))
             (register-pair (assoc register register-alist))
             (content (if register-pair (cdr register-pair))))
        (if (and content
                 (or (eq last-kbd-macro content)
                     (vectorp content)
                     (string-match "[^\t[:print:]\n\r]" content)))
            (let ((last-kbd-macro content))
              (forward-line)
              (beginning-of-line)
              (insert-kbd-macro '##)
              (forward-line -2)
              (search-forward "setq last-kbd-macro")
              (replace-match "execute-kbd-macro")
              t)))))
(advice-add 'evil-paste-after :before-until
            'evil-paste-kbd-macro-advice)

这个建议使 evilp命令能够将宏粘贴到寄存器中,即使宏包含'returnor 'backspace

于 2021-09-02T14:50:11.023 回答