Làm cách nào tôi có thể chạy macro bàn phím trong bộ đệm đã chọn từ Ibuffer hoặc các tệp được chọn từ thư mục?


8

Nếu tôi phải thực hiện một số phép tái cấu trúc tên biến, tôi sử dụng ag và nhiều con trỏ .

Nhưng khi tôi phải thực hiện một số loại bỏ / thêm / di chuyển khối mã, tôi sử dụng macro bàn phím. Nhưng tôi cần chuyển sang từng bộ đệm và khởi chạy macro đó bằng tay.

Có cách nào để chọn bộ đệm mở từ Ibuffer (hoặc tệp từ thư mục) và thực hiện macro bàn phím được ghi cuối cùng trên tất cả chúng không?

Câu trả lời:


8

Sửa đổi bộ đệm Ibuffer đã chọn

Sau khi ghi macro bàn phím, chuyển sang Ibuffer và,

  • Đánh dấu bộ đệm mong muốn bằng cách sử dụng m
  • Lượt truy cập W- Eval trong khi xem bộ đệm (Eval đơn giản EKHÔNG hoạt động cho các cuộc gọi macro)
  • (kmacro-end-or-call-macro 1)

3

Bạn chỉ cần bao gồm chuyển đổi bộ đệm trong macro. Bạn không bị giới hạn trong một bộ đệm - macro bàn phím có thể làm bất cứ điều gì bạn có thể làm!

Tôi đã trả lời khá nhiều câu hỏi tương tự vào ngày khác trên SO, vì vậy hãy tham khảo macro bàn phím tập tin chéo của emacs .


Tôi muốn chạy macro chỉ trong một vài bộ đệm đã chọn của tất cả các bộ đệm mở.
Kaushal Modi

Vì vậy, đánh dấu các tệp bạn muốn chạy nó và lọc danh sách thành các tệp đó. Trong cả dired và ibuffer, bạn có thể sử dụng tđể chuyển các dấu và kđể xóa các mục được đánh dấu. Một tiếp theo gđể làm mới sẽ khôi phục các dòng bị loại bỏ.
phils

1
Tôi chỉ có thể sử dụng M-{M-}chuyển sang các mục được đánh dấu tiếp theo và trước đó trong Ibuffer và chuyển hướng.
Kaushal Modi

Ah, thậm chí còn tốt hơn!
phils

1

Đây là một lệnh làm cho việc thực thi các lệnh, macro và đánh giá các biểu thức Lisp trong nhiều tệp không có trí tuệ. Lưu ý rằng đối số tiền tố cho phép thực thi macro cho mỗi tệp cho đến khi xảy ra lỗi. Tôi đã đăng bài này lên superuser nhưng nó hoạt động tốt đến mức tôi nghĩ mọi người đến trang này cũng có thể thấy nó hữu ích. Tôi muốn liên kết điều này với 'E' trong dired.

Cập nhật: phiên bản cũ của chức năng này chỉ hỗ trợ các macro. Cái được cập nhật vừa đơn giản, vừa mạnh mẽ hơn, cho phép thực thi các lệnh tùy ý (theo chuỗi hoặc tên khóa) cũng như các biểu thức Lisp. Bây giờ cũng cẩn thận để ghi lại bất kỳ lỗi nào trong bộ đệm Tin nhắn .

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

Sửa đổi các tập tin được chọn trong dired

Giải pháp dưới đây cần cài đặt dired+gói, có sẵn trên Melpa.

  1. Trước hết, chuyển đổi macro bàn phím của bạn thành một chức năng elisp. Đây là một emacs có liên quan.SE QnA (Làm cách nào để lưu macro bàn phím dưới dạng chức năng Lisp?).

    Nó thậm chí còn nhanh hơn nếu bạn biết cách bạn muốn sửa đổi tất cả các tệp bằng cách sử dụng một chức năng elisp trực tiếp. Giả sử bạn muốn thêm "- * - mode: org - * -" vào đầu tất cả các tệp đã chọn trong thư mục. 1

    Trong trường hợp đó, chạy chức năng elisp dưới đây trong mỗi tệp được chọn sẽ hoạt động.

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

    Vì vậy, bây giờ chỉ cần đánh giá các chức năng trên; nó sẽ được sử dụng ở bước sau

  2. Làm M-x diredvà mở thư mục chứa các tệp mà bạn muốn chạy chức năng trên.
  3. Đánh dấu tất cả các tệp như vậy bằng cách sử dụng mkhóa (ràng buộc dired-marktrong dired).
  4. * bước ma thuật * : Làm C-u @và chọn tên của hàm bạn đã đánh giá trong Bước 1 ( my/set-org-mode). @bị ràng buộc với diredp-do-apply-functionđược định nghĩa trong dired+.el.
  5. Bùng nổ! Dòng "- * - mode: org - * -" sẽ được thêm vào đầu tất cả các tệp được đánh dấu. Nhưng mọi thứ vẫn chưa được cứu. Bạn có thể xem lại tất cả những gì đã thay đổi nếu bạn muốn và sau đó nhấn C-x s !để lưu tất cả các tệp đã sửa đổi trong một lần.

1 : Lấy cảm hứng từ câu hỏi này trên reddit .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.