2013-01-12 30 views
6

Có cách nào để thực hiện lệnh emacs trên nhiều bộ đệm mà không cần phải chọn chúng riêng lẻ và thực hiện nó trên mỗi bộ đệm riêng lẻ.Thực hiện một lệnh cụ thể trên nhiều bộ đệm emacs

Tôi thường mở nhiều tệp phù hợp với một regex cụ thể, ví dụ: ~/*.py và muốn bật chế độ cụ thể, giả sử hs-minor-mode hoặc glasses-mode trên mỗi chế độ hoặc giả sử thực hiện C-c @ C-M-h trên mỗi chế độ. Hiện tại tôi phải chọn từng người trong số họ và thực hiện riêng lẻ. Vì vậy, có một hack hoặc một vòng lặp để tự động hóa các nhiệm vụ.

Cho phép nói rằng tôi đánh dấu bộ đệm từ danh sách bộ đệm và sau đó chạy lệnh cho tất cả những người được đánh dấu.

tôi đã cố gắng this nhưng sau khi thực hiện các lệnh trong eval-expression tôi hoàn toàn mất quyền truy cập vào minibuffer của tôi, có nghĩa là bất cứ khi nào tôi gõ M-x minibuffer trở này

không thể truy cập các lỗi emacs minibuffer "Quy trình đơn Chế độ doesn' t hỗ trợ Chế độ Hideshow Nhỏ "

và tôi bị buộc phải thực sự giết toàn bộ quá trình emacs vì C-x C-s không hoạt động là tác vụ kết thúc.

PS: Tôi không có kinh nghiệm trong elisp

Trả lời

10

Bạn có thể sử dụng chế độ ibuffer cho điều này (Nó là một phần của sự phân bố Emacs mặc định).

(global-set-key "\C-x\C-b" 'ibuffer) ;; make ibuffer the default 

Trong *Ibuffer* bạn có thể đánh dấu các bộ đệm cần thiết với m và sau đó thực hiện một hình thức trong mỗi E.

Nói chung, ibuffer linh hoạt hơn nhiều so với danh sách bộ đệm thông thường và tôi nghĩ ibuffer thực sự là danh sách đệm mặc định trong Emacs.

Nếu bạn làm điều này thường xuyên, bạn có thể muốn chuyển sang những phương thức đặc biệt vào mỗi khi bạn vào chế độ python bằng cách gắn chúng vào chế độ móc:

(add-hook 'python-mode-hook 'hs-minor-mode) 
(add-hook 'python-mode-hook 'glasses-mode) 
+0

Tôi đồng ý, có lẽ móc là cách tốt nhất để thực hiện. Nếu bạn không muốn chúng, sẽ dễ tắt chế độ cho một số bộ đệm riêng lẻ! – PascalVKooten

2

Tôi không biết ibuffer có tính năng ! Dù sao, đối với những người quen thuộc hơn với dired, đây là một lệnh làm như vậy. Chọn các tệp theo hướng dẫn với m hoặc bất kỳ phương pháp mạnh mẽ nào khác. Sau đó, hãy thực hiện, M-xdired-do-command và viết biểu mẫu hoặc lệnh giống như trong M-x.

(defun dired-do-command (command) 
    "Run COMMAND on marked files. Any files not already open will be opened. 
After this command has been run, any buffers it's modified will remain 
open and unsaved." 
    (interactive 
    (list 
    (let ((print-level nil) 
      (minibuffer-history-position 0) 
      (minibuffer-history-sexp-flag (1+ (minibuffer-depth)))) 
     (unwind-protect 
      (read-from-minibuffer 
      "Command: " (prin1-to-string (nth 0 command-history)) 
      read-expression-map t 
      (cons 'command-history 0)) 

     ;; If command was added to command-history as a 
     ;; string, get rid of that. We want only 
     ;; evaluable expressions there. 
     (if (stringp (car command-history)) 
      (setq command-history (cdr command-history))))))) 
    (dolist (filename (dired-get-marked-files)) 
    (with-current-buffer (find-file-noselect filename) 
     (if (symbolp command) 
      (call-interactively command) 
     (eval command))))) 
Các vấn đề liên quan