Bagaimana saya bisa menjalankan makro keyboard di buffer yang dipilih dari Ibuffer atau file yang dipilih dari dired?

8

Jika saya harus melakukan beberapa refactoring nama variabel, saya menggunakan ag dan multi-kursor .

Tetapi ketika saya harus melakukan beberapa penghapusan / penambahan / pemindahan blok kode, saya menggunakan makro keyboard. Tapi saya perlu beralih ke setiap buffer dan memulai menjalankan makro secara manual.

Apakah ada cara untuk hanya memilih buffer terbuka dari Ibuffer (atau file dari dired) dan menjalankan makro keyboard yang terakhir direkam pada semuanya?

Kaushal Modi
sumber

Jawaban:

8

Ubah buffer Buffer yang dipilih

Setelah merekam makro keyboard, beralih ke Ibuffer dan,

  • Tandai buffer yang diinginkan menggunakan m
  • Hit W- Eval saat melihat buffer (eval polos ETIDAK bekerja untuk panggilan makro)
  • (kmacro-end-or-call-macro 1)
Kaushal Modi
sumber
3

Anda cukup menyertakan buffer-switching di makro. Anda tidak terbatas pada satu buffer - makro keyboard dapat melakukan apa pun yang dapat Anda lakukan!

Saya menjawab cukup banyak pertanyaan yang sama hari ini di SO, jadi lihat makro keyboard file emacs .

phils
sumber
Saya ingin menjalankan makro hanya dalam beberapa buffer terpilih dari semua buffer terbuka.
Kaushal Modi
Jadi tandai file yang ingin Anda jalankan dan filter daftar hanya file-file itu. Baik dired maupun ibuffer dapat Anda gunakan untuk mengganti ttanda dan kmenghapus entri yang ditandai. Selanjutnya guntuk menyegarkan akan mengembalikan garis yang dihapus.
phils
1
Saya cukup menggunakan M-{dan M-}untuk melompat ke item ditandai berikutnya dan sebelumnya di Ibuffer dan dired.
Kaushal Modi
Ah, bahkan lebih baik!
phils
1

Berikut adalah perintah yang membuat mengeksekusi perintah, makro, dan mengevaluasi ekspresi Lisp dalam banyak file menjadi no-brainer. Perhatikan bahwa argumen awalan memungkinkan untuk mengeksekusi makro untuk setiap file sampai terjadi kesalahan. Saya sudah memposting ini di superuser tetapi berfungsi dengan baik sehingga saya pikir orang-orang yang datang ke halaman ini juga dapat menemukannya berguna. Saya suka mengikat ini ke 'E' di dired.

Pembaruan: versi lama fungsi ini hanya mendukung makro. Yang diperbarui lebih sederhana dan lebih kuat, memungkinkan untuk mengeksekusi perintah sewenang-wenang (berdasarkan urutan atau nama kunci) serta ekspresi Lisp. Sekarang juga berhati-hati untuk mencatat kesalahan dalam buffer Pesan .

;; 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
sumber
0

Memodifikasi file yang dipilih di dired

Solusi di bawah ini membutuhkan instalasi dired+paket, yang tersedia di Melpa.

  1. Pertama-tama, ubah makro keyboard Anda menjadi fungsi elisp. Inilah emacs.SE QnA terkait (Bagaimana cara menyimpan makro keyboard sebagai fungsi Lisp?).

    Ini bahkan lebih cepat jika Anda tahu bagaimana Anda ingin memodifikasi semua file menggunakan fungsi elisp secara langsung. Katakanlah Anda ingin menambahkan "- * - mode: org - * -" di awal semua file yang dipilih dalam dired. 1

    Dalam hal ini, menjalankan fungsi elisp di bawah ini di setiap file yang dipilih akan bekerja.

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

    Jadi evaluasi saja fungsi di atas untuk saat ini; itu akan digunakan pada langkah selanjutnya di bawah ini.

  2. Lakukan M-x direddan buka direktori yang berisi file-file tempat Anda ingin menjalankan fungsi di atas.
  3. Tandai semua file tersebut menggunakan mkunci (terikat ke dired-markdalam dired).
  4. * Langkah ajaib * : Lakukan C-u @dan pilih nama fungsi yang Anda evaluasi di Langkah 1 ( my/set-org-mode). @terikat diredp-do-apply-functionyang didefinisikan dalam dired+.el.
  5. Ledakan! Baris "- * - mode: org - * -" akan ditambahkan di bagian atas semua file yang ditandai. Tetapi hal-hal belum diselamatkan. Anda dapat meninjau semua yang diubah jika Anda mau dan kemudian tekan C-x s !untuk menyimpan semua file yang dimodifikasi dalam sekali jalan.

1 : Terinspirasi dari pertanyaan ini di reddit .

Kaushal Modi
sumber