Ibufferから選択したバッファーまたはdiredから選択したファイルでキーボードマクロを実行するにはどうすればよいですか?


8

変数名のリファクタリングを行う必要がある場合は、agとmultiple-cursorsを使用します。

しかし、コードブロックの削除/追加/移動を行う必要がある場合は、キーボードマクロを使用します。しかし、各バッファに切り替えて、手動でマクロの実行を開始する必要があります。

Ibufferから開いているバッファー(またはdiredからファイル)を単純に選択し、最後に記録されたキーボードマクロをそれらすべてに対して実行する方法はありますか?

回答:


8

選択したIバッファーバッファーを変更する

キーボードマクロを記録した後、Ibufferに切り替え、

  • を使用して目的のバッファをマークします m
  • ヒットW-バッファーの表示中の評価(通常の評価Eはマクロ呼び出しでは機能しません)
  • (kmacro-end-or-call-macro 1)

3

マクロにバッファ切り替えを含めるだけです。あなたは単一のバッファに制限されていません-キーボードマクロはあなたができることなら何でもできます!

私は先日、SOでこの同じ質問にかなり答えました。emacsのクロスファイルキーボードマクロを参照してください。


開いているすべてのバッファのうち、選択した少数のバッファでのみマクロを実行したい。
Kaushal Modi、2014

実行したいファイルにマークを付け、それらのファイルだけにリストをフィルタリングします。diredとibufferの両方で、マークtを切り替えkたり、マークされたエントリを削除したりできます。その後のg更新では、削除された行が復元されます。
phils 2014

1
私は単にとを使用M-{M-}て、Ibuffer内の次および前のマークされたアイテムにジャンプしてdiredできます。
Kaushal Modi 14

ああ、さらに良い!
phils 2014

1

以下は、複数のファイルでコマンド、マクロ、およびLisp式を評価することを簡単にするコマンドです。前置引数を使用すると、エラーが発生するまで各ファイルのマクロを実行できます。これはすでにスーパーユーザー投稿しましたが、うまく機能しているため、このページにアクセスした人にも役立つと思いました。これをdiredで「E」にバインドするのが好きです。

更新:この関数の古いバージョンはマクロのみをサポートしていました。更新されたものはよりシンプルでより強力であり、(キーシーケンスまたは名前によって)任意のコマンドやLisp式を実行できます。また、メッセージバッファにエラーを記録するように注意しています。

;; Inspired by M-x edit-kbd-macro and https://superuser.com/q/176627.
(defun my-dired-do-execute (keys &optional arg)
  "Execute a command in all marked files.
If an error occurs, execution in other files is not affected.
(Notably, this allows to run keyboard macros until there is an error.)

At the prompt, type any bound key sequence, or `\\[execute-extended-command]'
to choose a command by its name, or `\\[eval-expression]' to enter a Lisp expression.

The prefix ARG, if given, is passed on to the chosen command.
"
  (interactive
   (list (read-key-sequence (substitute-command-keys "Key sequence to execute, \
or \\[eval-expression], or \\[execute-extended-command]: "))
         current-prefix-arg))
  (when keys
    (let ((cmd (if (arrayp keys) (key-binding keys) keys))
          exp)
      (cond ((eq cmd 'execute-extended-command)
             (setq cmd (read-command "Name of command to execute: "))
             (if (string-equal cmd "")
                 (error "No command name given")))
            ((eq cmd 'eval-expression)
             (setq exp (read--expression "Eval in selected files: "))
             (setq cmd nil))
            ((null cmd)
             (error "Key sequence %s is not defined" (key-description keys))))
      (mapc (lambda (filename)
              (save-selected-window
                (find-file-other-window filename)
                (setq current-prefix-arg arg)
                (condition-case-unless-debug err
                    (if cmd
                        (call-interactively cmd)
                      (message "Result in file %s:" filename)
                      (eval-expression exp))
                  (error (message "In file %s: %S" filename err)))))
            (dired-get-marked-files)))))

0

で選択したファイルを変更する dired

以下のソリューションdired+では、Melpaで入手可能なパッケージのインストールが必要です。

  1. まず、キーボードマクロをelisp関数に変換します。これが関連するemacs.SE QnA(キーボードマクロをLisp関数として保存する方法?)です。

    elisp関数を直接使用してすべてのファイルを変更する方法を知っていると、さらに速くなります。diredで選択したすべてのファイルの先頭に「-*-mode:org-*-」を追加するとします。1

    その場合、選択した各ファイルで以下のelisp関数を実行すると機能します。

    (defun my/set-org-mode ()
      (goto-char (point-min))
      (insert "-*- mode: org -*-\n"))

    したがって、今のところ上記の関数を評価してください。後のステップで使用するようになります。

  2. M-x dired上記の関数を実行するファイルを含むディレクトリを開いてください。
  3. mキーを使用して、そのようなファイルをすべてマークします(にバインドさdired-markれていますdired)。
  4. *マジックステップ*C-u @ステップ1(my/set-org-mode)で評価した関数の名前を選択します。@diredp-do-apply-function定義されているにバインドされていdired+.elます。
  5. ブーム!「-*-mode:org-*-」行は、マークされたすべてのファイルの一番上に追加されます。しかし、物事はまだ保存されていません。必要に応じてすべての変更内容を確認してから、変更したC-x s !すべてのファイルを一度に保存できます。

1redditに関するこの質問に触発されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.