45

私は約 1 年前に Vim から移行した後、 illegal -modeを使用しています。私は多くのカスタマイズを行いましたが、vim スタイルのキーボード マクロを保存する方法をまだ考え出していません。

Vim とまったく同じキーを使用して、悪モードで定義して実行できます。

  • qaマクロの記録を開始するための手紙。
  • q録音を停止します。
  • @aマクロを実行するための手紙。

これらのいくつかをファイルに保存してセッション間で使用したいのinit.elですが、オンラインでこれへの参照を見つけることができず、正しい構文も見つかりませんでした。

これらの悪モードのキーボード マクロをファイルに保存するにはどうすればよいですか? 代わりにネイティブの Emacs キーボード マクロを使用する必要がある理由はあり@aますか? キーを介してこれらを実行する方法はありますか?

4

2 に答える 2

57

Evil-mode マクロは特別なものではありません。通常の Emacs マクロであり、同じ方法で保存しますが、evil レジスタに入れるには特別な作業を行う必要があります。

例を見てみましょう:

バッファで、 を実行しますqfifoobarESCqfこれにより、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 に配置すると、mymacroからコマンドにアクセスできるようになりますM-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)

このアドバイスにより、マクロにまたはpが含まれていても、悪意のあるコマンドでマクロをレジスタに貼り付けることができます。'return'backspace

于 2021-09-02T14:50:11.023 に答える