Wie kann ich ein Tastaturmakro in ausgewählten Puffern von Ibuffer oder ausgewählten Dateien von dired ausführen?

8

Wenn ich ein Refactoring von Variablennamen durchführen muss, verwende ich ag und mehrere Cursor .

Aber wenn ich Codeblöcke entfernen / hinzufügen / verschieben muss, verwende ich Tastaturmakros. Aber ich muss zu jedem Puffer wechseln und diesen Makro-Lauf manuell starten.

Gibt es eine Möglichkeit, einfach die geöffneten Puffer von Ibuffer (oder Dateien von dired) auszuwählen und das zuletzt aufgezeichnete Tastaturmakro für alle auszuführen?

Kaushal Modi
quelle

Antworten:

8

Ändern Sie ausgewählte Ibuffer-Puffer

Wechseln Sie nach der Aufnahme des Tastaturmakros zu Ibuffer und,

  • Markieren Sie die gewünschten Puffer mit m
  • Hit W- Eval beim Anzeigen des Puffers (Die einfache Auswertung Efunktioniert NICHT für Makroaufrufe)
  • (kmacro-end-or-call-macro 1)
Kaushal Modi
quelle
3

Sie fügen einfach die Pufferumschaltung in das Makro ein. Sie sind nicht auf einen einzelnen Puffer beschränkt - ein Tastaturmakro kann alles, was Sie können!

Ich habe neulich auf SO so ziemlich dieselbe Frage beantwortet, siehe Emacs dateiübergreifendes Tastaturmakro .

Phils
quelle
Ich möchte das Makro nur in wenigen ausgewählten Puffern aller offenen Puffer ausführen.
Kaushal Modi
Markieren Sie also die Dateien, auf denen Sie es ausführen möchten, und filtern Sie die Liste nur nach diesen Dateien. Sowohl in dired als auch in ibuffer können Sie tMarkierungen umschalten und kdie markierten Einträge entfernen. Bei einer anschließenden gAktualisierung werden die entfernten Zeilen wiederhergestellt.
Phils
1
Ich kann einfach verwenden M-{und M-}zu den nächsten und vorherigen markierten Elementen in Ibuffer und dired springen.
Kaushal Modi
Ah, noch besser!
Phils
1

Hier ist ein Befehl, mit dem das Ausführen von Befehlen, Makros und das Auswerten von Lisp-Ausdrücken in mehreren Dateien zum Kinderspiel wird. Beachten Sie, dass mit dem Präfixargument für jede Datei ein Makro ausgeführt werden kann, bis ein Fehler auftritt. Ich habe dies bereits im Superuser gepostet, aber es funktioniert so gut, dass ich dachte, die Leute, die auf diese Seite kommen, könnten es auch nützlich finden. Ich mag es, dies in dired an 'E' zu binden.

Update: Die alte Version dieser Funktion unterstützt nur Makros. Das aktualisierte ist sowohl einfacher als auch leistungsfähiger und ermöglicht die Ausführung beliebiger Befehle (nach Tastenfolge oder Name) sowie von Lisp-Ausdrücken. Es wird jetzt auch darauf geachtet, Fehler im Nachrichtenpuffer zu protokollieren .

;; 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)))))
spheniscus
quelle
0

Ausgewählte Dateien in ändern dired

Die folgende Lösung erfordert die Installation des dired+Pakets, das auf Melpa verfügbar ist.

  1. Konvertieren Sie zunächst Ihr Tastaturmakro in eine Elisp-Funktion. Hier ist eine verwandte emacs.SE QnA (Wie speichere ich ein Tastaturmakro als Lisp-Funktion?).

    Es ist noch schneller, wenn Sie wissen, wie Sie alle Dateien mithilfe einer Elisp-Funktion direkt ändern möchten. Angenommen, Sie möchten "- * - mode: org - * -" am Anfang aller ausgewählten Dateien in dired hinzufügen. 1

    In diesem Fall würde das Ausführen der folgenden Elisp-Funktion in jeder der ausgewählten Dateien funktionieren.

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

    Bewerten Sie also zunächst die obige Funktion. Es wird in einem späteren Schritt weiter unten verwendet.

  2. Haben M-x diredund öffnen Sie das Verzeichnis mit den Dateien , in denen Sie die obige Funktion ausgeführt werden soll.
  3. Markieren Sie alle diese Dateien mit dem mSchlüssel (an dired-markin gebunden dired).
  4. * magischer Schritt * : Wählen C-u @Sie den Namen der Funktion aus, die Sie in Schritt 1 ( my/set-org-mode) bewertet haben . @ist gebunden an diredp-do-apply-functiondie in definiert ist dired+.el.
  5. Boom! Die Zeile "- * - mode: org - * -" wird oben in allen markierten Dateien hinzugefügt. Aber die Dinge sind noch nicht gerettet. Sie können überprüfen, was sich alles geändert hat, wenn Sie möchten, und dann auf klicken C-x s !, um alle geänderten Dateien auf einmal zu speichern.

1 : Inspiriert von dieser Frage auf reddit .

Kaushal Modi
quelle