Tutup semua buffer yang dired

23

Kadang-kadang daftar buffer saya memiliki 10+ windows dired, dan saya akhirnya menggunakan buffer-menuuntuk secara manual menandai dan membunuh semuanya. Apakah ada cara yang lebih cepat untuk menutup semua jendela yang terbuka?

nispio
sumber
Saya telah menerima jawaban yang paling langsung menjawab pertanyaan itu. Namun, saya sejak itu mulai menerapkan satu ons pencegahan sebagai gantinya: emacs.stackexchange.com/a/1041/93
nispio

Jawaban:

32

Anda dapat melakukan hal berikut:

M-x ibuffer

* / untuk menandai buffer dalam mode dired.

D untuk menghapusnya.

Francisco Dibar
sumber
1
Saya belum pernah mendengar tentang ibuffer sebelumnya. Aku pasti akan pemetaan C-x C-buntuk ibuffer.
nispio
Anda juga dapat menekan t( dired-toggle-marks) untuk menandai semua (jika tidak ada yang sebelumnya ditandai).
caisah
@caisah dired-toggle-marksadalah nama dari perintah dired . Menekan tjuga akan mengaktifkan semua tanda di ibuffer, tetapi buffer non-dired biasanya lebih banyak daripada buffer yang dired, sehingga toggling tidak sering masuk akal dalam konteks ini.
nispio
@nispio Anda benar. Saya tidak tahu mengapa, tetapi saya berpikir semua penyangga dimatikan ...
caisah
1
Catatan: ini tidak berfungsi dengan benar ketika tidak ada buffer dired, karena D tidak akan berlaku untuk buffer dired, tetapi untuk buffer pertama dalam daftar.
daniel kullmann
10

Alih-alih menambahkan fungsi lain untuk membunuh semua diredbuffer, saya sarankan Anda memanfaatkan grup filter di ibuffer, itu memungkinkan Anda untuk mengelompokkan buffer berdasarkan banyak kondisi.

Berikut adalah contoh untuk mengatur grup filter:

(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 . "\*.*\*"))
                 )))

Kemudian C-x C-bbuka ibufferjendela, Anda dapat melihat sesuatu seperti ini:

Contoh 1

Pindahkan kursor ke [ Dired ](dengan M-p, M-n), lalu tekan duntuk menandai sebagai hapus

contoh2

lalu tekan xuntuk menjalankan.

Saya lebih suka cara ini karena saya tidak perlu memikirkan bagaimana saya harus mengikat kunci saya ke fungsi baru, dan buffer saya lebih terorganisir.

Rangi Lin
sumber
Grup filter tidak muncul untuk saya ketika saya pertama kali diluncurkan ibuffersetelah mengevaluasi kode Anda. Saya harus menekan / R(terikat ibuffer-switch-to-saved-filter-groups) untuk mendapatkan grup.
itsjeyd
(ibuffer-switch-to-saved-filter-groups "Default")Anda dapat menambahkan baris kode ini ke kait ibuffer, nama grup filter harus diubah jika tidakDefault
Rangi Lin
1
Ya, itulah yang akhirnya saya lakukan. Tidak tahu tentang filter grup sebelum membaca jawaban Anda, terima kasih telah menyebutkannya;)
itsjeyd
10

Apakah Anda memiliki banyak buffer Dired karena Anda menginginkan semuanya pada satu titik? TKI, apakah Anda ingin membuat masing-masing sebagai buffer terpisah?

Jika tidak, solusinya sederhana: beri tahu Dired untuk menggunakan kembali buffer Dired yang ada saat Anda menekan RETnama direktori untuk membukanya di Dired.

Inilah cara melakukannya:

  1. Muat perpustakaan Dired + ( dired+.el):

    (require 'dired+)
    
  2. Beri tahu Dired untuk menggunakan kembali Buffer Dired:

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

Efeknya adalah ketika Anda menekan RET(atau mengklik mouse) pada direktori di Dired, find-alternate-filedigunakan, jadi buffer Dired asli diganti (dihapus) dengan yang baru.

Anda dapat beralih perilaku ini kapan saja, menggunakan C-M-R(alias C-M-S-r) di Dired.

Drew
sumber
Ini solusi yang sudah saya selesaikan sekarang. Saya tidak pernah menginginkan 20 buffer Dired terbuka di tempat pertama. Terima kasih telah menyarankannya (dan membuatnya.)
nispio
Tautan sudah mati, mendapatkan 404: (
Zelphir Kaltstahl
1
@Zelphir: Terima kasih atas bantuannya. Seharusnya tidak apa-apa sekarang. (Emacs Wiki mengubah URL-nya secara umum, sehingga posting lama seperti ini mendapat tautan yang rusak.)
Drew
8

Sesuatu seperti ini (gulir sedikit)?

(defun kill-dired-buffers ()
     (interactive)
     (mapc (lambda (buffer) 
           (when (eq 'dired-mode (buffer-local-value 'major-mode buffer)) 
             (kill-buffer buffer))) 
         (buffer-list)))
nicael
sumber
5

Anda juga dapat menggunakan helm-mini:

  • Lari M-x helm-mini.
  • Ketik ke prompt: *Di(sebagian kata untuk Dired, tidak perlu memasukkan lebih banyak). Saat Anda mengetik, buffer semakin menyempit. Sekarang, tinggal Diredbuffer yang tersisa. Tekan M-auntuk menandai semua.
  • Tekan TABuntuk beralih ke menu tindakan dan tekan Kuntuk memilih tindakan Kill buffer(s).
  • Tekan RETuntuk menjalankan tindakan.

Hal baiknya helm-miniadalah ia dapat menggantikan Emacs normal C-x b, jadi Anda tidak perlu menggunakan dua ikatan utama, satu untuk mengganti buffer dan satu untuk buffer manager yang sebenarnya. helm-miniadalah all-in-one. Baca lebih lanjut di panduan helm-mini saya .

helm-minijuga dapat fuzzy match buffer dan memungkinkan untuk membuka beberapa buffer dengan menandai dengan C-SPCatau M-a(singkatan dari M ark a ll). Anda juga dapat mempersempit buffer berisi string tertentu dengan menambahkan @sebelum suatu pola, misalnya, @testberarti hanya memilih buffer yang berisi string "test".

Tu Do
sumber
1

Saya akan mencoba sesuatu seperti ini:

(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))))
shosti
sumber
1
Saya percaya -filtermemerlukan dash.eldari MELPA. Anda mungkin harus mencantumkannya sebagai persyaratan.
Vamsi
1

Apa yang sebenarnya Anda cari adalah cara untuk membersihkan buffer yang tidak diinginkan secara otomatis, dalam hal ini Anda harus memeriksa midnight.el, yang merupakan bagian dari Emacs.

Tetapi secara umum, ibuffermembuatnya sangat mudah untuk beroperasi pada buffer dalam jumlah besar, seperti yang disarankan Francisco.

sanityinc
sumber
1

Jika Anda menggunakan Icicles , maka Anda dapat menggunakannya C-x kuntuk membunuh semua buffer Dired - atau semua buffer dalam mode apa pun.

Setelah memukul C-x k, gunakan C-x M +untuk menjaga hanya buffer dengan mode tertentu. Tekan TABuntuk melihat mode, dan pilih dired-mode. Kemudian gunakan C-!untuk membunuh semua buffer dengan mode itu.

C-x k C-x M + dired-mode C-!
Drew
sumber