Đóng tất cả các bộ đệm chuyển hướng


23

Đôi khi danh sách bộ đệm của tôi có hơn 10 cửa sổ được điều hướng và cuối cùng tôi sử dụng buffer-menuđể đánh dấu thủ công và tiêu diệt tất cả chúng. Có cách nào nhanh hơn để đóng tất cả các cửa sổ đã mở?


Tôi đã chấp nhận câu trả lời mà hầu hết trực tiếp trả lời câu hỏi. Tuy nhiên, kể từ đó, tôi đã bắt đầu áp dụng một ounce phòng ngừa thay thế: emacs.stackexchange.com/a/1041/93
nispio

Câu trả lời:


32

Bạn có thể làm như sau:

M-x ibuffer

* / để đánh dấu bộ đệm trong chế độ dired.

D để xóa chúng.


1
Tôi chưa bao giờ nghe nói về ibuffer trước đây. Tôi chắc chắn sẽ được ánh xạ C-x C-btới ibuffer.
nispio

Bạn cũng có thể nhấn t( dired-toggle-marks) để đánh dấu tất cả (nếu không được đánh dấu trước đó).
caisah

@caisah dired-toggle-markslà tên của lệnh dired . Nhấn tcũng sẽ chuyển tất cả các dấu trong ibuffer, nhưng các bộ đệm không được chuyển hướng thường vượt trội hơn các bộ đệm được chuyển hướng, do đó, việc bật tắt thường không có ý nghĩa trong bối cảnh này.
nispio

@nispio Bạn nói đúng. Tôi không biết tại sao, nhưng tôi đã nghĩ rằng tất cả các bộ đệm đều được chuyển hướng ...
caisah

1
Lưu ý: điều này không hoạt động chính xác khi không có bộ đệm được chuyển hướng, bởi vì D sẽ không áp dụng cho bộ đệm được chuyển hướng, nhưng cho bộ đệm đầu tiên trong danh sách.
daniel kullmann

10

Thay vì thêm một chức năng khác để tiêu diệt tất cả các diredbộ đệm, tôi khuyên bạn nên tận dụng các nhóm bộ lọc ibuffer, nó cho phép bạn nhóm bộ đệm theo nhiều điều kiện.

Dưới đây là một ví dụ để đặt các nhóm bộ lọc:

(setq-default ibuffer-saved-filter-groups
              `(("Default"
                 ;; I create a group call Dired, which contains all buffer in dired-mode
                 ("Dired" (mode . dired-mode))
                 ("Temporary" (name . "\*.*\*"))
                 )))

Sau đó C-x C-bmở ibuffercửa sổ, bạn có thể thấy một cái gì đó như thế này:

ví dụ 1

Di chuyển con trỏ đến [ Dired ](với M-p, M-n), sau đó nhấn dđể đánh dấu là xóa

ví dụ2

sau đó nhấn xđể thực thi.

Tôi thích cách này vì tôi không cần phải suy nghĩ về cách tôi nên liên kết khóa của mình với chức năng mới và bộ đệm của tôi được tổ chức tốt hơn.


Các nhóm bộ lọc không hiển thị cho tôi khi tôi khởi chạy lần đầu tiên ibuffersau khi đánh giá mã của bạn. Tôi đã phải đánh / R(ràng buộc ibuffer-switch-to-saved-filter-groups) để có được các nhóm.
itjeyd

(ibuffer-switch-to-saved-filter-groups "Default")Bạn có thể thêm dòng mã này vào móc ibuffer, nên thay đổi tên nhóm bộ lọc nếu khôngDefault
Rangi Lin

1
Vâng, đó là những gì tôi đã làm. Không biết về các nhóm bộ lọc trước khi đọc câu trả lời của bạn, cảm ơn vì đã đề cập đến chúng;)
itjeyd

10

Bạn có nhiều bộ đệm Dired bởi vì bạn muốn tất cả chúng tại một thời điểm? IOW, bạn có muốn tạo mỗi người trong số họ như một bộ đệm riêng biệt không?

Nếu không, giải pháp rất đơn giản: bảo Dired sử dụng lại bộ đệm Dired hiện có khi bạn nhấn RETmột tên thư mục để mở nó trong Dired.

Đây là cách để làm điều đó:

  1. Tải thư viện Dired + ( dired+.el):

    (require 'dired+)
    
  2. Nói với Dired để sử dụng lại bộ đệm Dired:

    (diredp-toggle-find-file-reuse-dir 1)
    

Hiệu quả là khi bạn nhấn RET(hoặc nhấp chuột) vào một thư mục trong Dired, find-alternate-fileđược sử dụng, do đó, bộ đệm Dired ban đầu được thay thế (xóa) bởi cái mới.

Bạn có thể chuyển đổi hành vi này bất cứ lúc nào, sử dụng C-M-R(aka C-M-S-r) trong Dired.


Đây là giải pháp tôi đã giải quyết bây giờ. Tôi không bao giờ muốn 20 bộ đệm Dired mở ở vị trí đầu tiên. Cảm ơn vì đã gợi ý (và tạo ra nó.)
nispio

Các liên kết đã chết, nhận được 404: (
Zelphir Kaltstahl

1
@Zelphir: Cảm ơn bạn đã ủng hộ. Nên ổn bây giờ. (Wiki Emacs đã thay đổi URL nói chung, vì vậy các bài đăng cũ như thế này đã bị hỏng liên kết.)
vẽ


5

Bạn cũng có thể sử dụng helm-mini:

  • Chạy đi M-x helm-mini.
  • Nhập vào dấu nhắc: *Di(một phần từ cho Dired, không cần nhập thêm). Khi bạn gõ, bộ đệm được thu hẹp dần dần. Bây giờ, chỉ Diredcòn lại bộ đệm. Nhấn M-ađể đánh dấu tất cả.
  • Nhấn TABđể chuyển sang menu hành động và nhấn Kđể chọn hành động Kill buffer(s).
  • Nhấn RETđể thực hiện hành động.

Điều tốt helm-minilà nó có thể thay thế Emac thông thường C-x b, vì vậy bạn sẽ không phải sử dụng hai ràng buộc chính, một để chuyển đổi bộ đệm và một cho trình quản lý bộ đệm thực tế. helm-minilà tất cả trong một. Đọc thêm trong hướng dẫn helm-mini của tôi .

helm-minicũng có thể mờ bộ đệm khớp và cho phép mở nhiều bộ đệm bằng cách đánh dấu bằng C-SPChoặc M-a(viết tắt của M ark a ll). Bạn cũng có thể thu hẹp để bộ đệm chứa chuỗi nhất định bằng cách nối thêm @trước một mẫu, ví dụ, @testcó nghĩa là chỉ chọn bộ đệm chứa chuỗi "kiểm tra".


1

Tôi sẽ thử một cái gì đó như thế này:

(require 'dash)

(defun my-kill-dired-buffers ()
  (interactive)
  (kill-some-buffers
   (-filter (lambda (buffer)
              (save-excursion
                (set-buffer buffer)
                (eq major-mode 'dired-mode)))
            (buffer-list))))

1
Tôi tin rằng -filteryêu cầu dash.eltừ MELPA. Bạn có lẽ nên liệt kê đó là một yêu cầu.
Vamsi

1

Những gì bạn thực sự có thể đang tìm kiếm là một cách để tự động dọn sạch bộ đệm không mong muốn, trong trường hợp đó bạn nên kiểm tra midnight.el, đó là một phần của Emacs.

Nhưng nói chung, ibufferlàm cho nó rất dễ dàng để hoạt động trên bộ đệm với số lượng lớn, như Francisco đề xuất.


1

Nếu bạn sử dụng Icicles , thì bạn có thể sử dụng C-x kđể tiêu diệt tất cả các bộ đệm Dired - hoặc tất cả các bộ đệm trong bất kỳ chế độ nào.

Sau khi nhấn C-x k, sử dụng C-x M +để chỉ giữ các bộ đệm với một chế độ nhất định. Nhấn TABđể xem các chế độ và chọn dired-mode. Sau đó sử dụng C-!để giết tất cả các bộ đệm với chế độ đó.

C-x k C-x M + dired-mode C-!
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.