Tutup semua buffer selain yang saat ini ada di Emacs

92

Bagaimana cara menutup semua kecuali buffer saat ini di Emacs? Mirip dengan fitur "Tutup tab lain" di browser web modern?

Sridhar Ratnakumar
sumber

Jawaban:

100

Untuk pendekatan yang lebih manual, Anda dapat mencantumkan semua buffer dengan C-x C-b, menandai buffer dalam daftar untuk dihapus d, lalu menggunakanx untuk menghapusnya.

Saya juga merekomendasikan mengganti daftar-buffer dengan ibuffer lebih maju: (global-set-key (kbd "C-x C-b") 'ibuffer). Di atas akan berfungsi dengan ibuffer, tetapi Anda juga bisa melakukan ini:

m(tandai buffer yang ingin Anda simpan)
t(toggle marks)
D(matikan semua buffer yang ditandai)

Saya juga menggunakan potongan ini dari Emacs Wiki, yang selanjutnya akan menyederhanakan pendekatan manual ini:

;; Ensure ibuffer opens with point at the current buffer's entry.
(defadvice ibuffer
  (around ibuffer-point-to-most-recent) ()
  "Open ibuffer with cursor pointed to most recent buffer name."
  (let ((recent-buffer-name (buffer-name)))
    ad-do-it
    (ibuffer-jump-to-buffer recent-buffer-name)))
(ad-activate 'ibuffer)
phils
sumber
Bagaimana saya bisa kembali dari ibuffer? @phils
alper
1
Saya tidak yakin apa yang Anda tanyakan, tapi mungkin q? Gunakan C-h muntuk mempelajari keybindings, sama seperti mode lainnya.
phils
53

Dari EmacsWiki: Killing Buffer :

(defun kill-other-buffers ()
    "Kill all other buffers."
    (interactive)
    (mapc 'kill-buffer 
          (delq (current-buffer) 
                (remove-if-not 'buffer-file-name (buffer-list)))))

Edit : diperbarui dengan umpan balik dari Gilles

Sridhar Ratnakumar
sumber
3
Mengapa buffer dired tidak dimatikan? Saya juga ingin menghapusnya
swdev
buffer dired tidak disetel buffer-file-namedan dengan demikian panggilan ke remove-if-notdalam contoh di atas akan mempertahankan buffer dired (serta buffer awal, buffer istilah, buffer bantuan, dll, apa pun yang tidak mengunjungi file). Saya tidak bisa memikirkan tes mudah yang akan menutup buffer file dan buffer dired, pada dasarnya Anda memerlukan pemanggilan mapc kedua penuh dengan tes berbeda untuk buffer dired.
robru
modifikasi sederhana untuk membunuh buffer juga dired (defun kill-other-buffers () "Kill all other buffers." (interactive) (mapc 'kill-buffer (delq (current-buffer) (remove-if-not '(lambda (x) (or (buffer-file-name x) (eq 'dired-mode (buffer-local-value 'major-mode x)))) (buffer-list)))))
frinkr
Sepertinya dalam video ini pria tersebut mampu melakukan itu. Dia membuka buffer Slime baru sambil menutup GNU buffer dan lainnya. Apakah Anda tahu bagaimana dia melakukan itu? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist
Mengganti cl-remove-if-notdengan remove-if-notkarya tetapi ini tidak mematikan *helm..buffer
alper
21

Tidak ada cara langsung di emacs untuk melakukan ini.

Anda bisa menulis fungsi untuk melakukan ini. Berikut ini akan menutup semua buffer:

(defun close-all-buffer ()
  (interaktif)
  (mapc 'kill-buffer (buffer-list)))
Starkey
sumber
4
Ah, tapi ini akan menutup semua buffer.
Sridhar Ratnakumar
(delete (current-buffer) (buffer-list))harus memberi Anda daftar buffer yang dapat Anda petakan kill-bufferdan menghindari mematikan buffer saat ini.
NickD
16

Ada perintah bawaan m- x kill-some-buffers(Saya menggunakan 24.3.50) Dalam langkah saya berikutnya (tidak dicoba di terminal tetapi pasti serupa) Anda kemudian dapat menyetujui buffer mana yang akan dimatikan.

pjammer.dll
sumber
2
Ini sangat berguna ketika Anda memiliki 1000+ buffer yang dimuat.
ocodo
11
 (defun only-current-buffer () 
   (interactive)
   (let ((tobe-killed (cdr (buffer-list (current-buffer)))))
     (while tobe-killed
       (kill-buffer (car tobe-killed))
       (setq tobe-killed (cdr tobe-killed)))))

Ini berfungsi seperti yang Anda harapkan.

Dan setelah membaca jawaban @ Starkey, saya pikir ini akan lebih baik:

(defun only-current-buffer () 
  (interactive)                                                                   
    (mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))

(buffer-list (current-buffer)) akan mengembalikan daftar yang berisi semua buffer yang ada, dengan buffer saat ini di bagian atas daftar.

Ini adalah jawaban pertama saya di StackOverflow. Semoga membantu :)

wenjun.yan
sumber
2
Dan ini teman saya adalah bagaimana solusi elegan muncul dari orang-orang yang berbagi ide mereka
Chris Clark
Saya tidak tahu apakah spesifikasi untuk buffer-listberubah selama bertahun-tahun, tetapi (buffer-list (current-buffer))bekerja seperti yang ditunjukkan jawaban di atas TIDAK akan berfungsi. Lakukan C-h f buffer-list RETuntuk spesifikasi saat ini.
NickD
4

Saya menemukan solusi ini menjadi yang paling sederhana. Ini menghapus setiap buffer kecuali yang sekarang. Anda harus menambahkan kode ini ke .emacsfile Anda

(defun kill-other-buffers ()
      "Kill all other buffers."
      (interactive)
      (mapc 'kill-buffer (delq (current-buffer) (buffer-list))))

Tentu saja, kemudian Anda menggunakannya dengan M-x kill-other-buffers RET atau Anda juga menempelkan kode berikut di .emacsfile, lalu tekan sajaC-xC-b

(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
Euge
sumber
1

Saya telah menggunakan crux-kill-other-buffer selama beberapa bulan.

Tapi saya ingin buffer yang dired dihapus juga. Jawaban @ Euge dan @ wenjun.yan memecahkan masalah ini. Tetapi itu akan menghapus buffer khusus (misalnya * git-credential-cache - daemon *, * scratch *, helm operation, dan lain-lain). Jadi saya datang dengan solusi (saat ini).

(defun aza-kill-other-buffers ()
  "Kill all buffers but current buffer and special buffers"
  (interactive)
  (dolist (buffer (delq (current-buffer) (buffer-list)))
    (let ((name (buffer-name buffer)))
      (when (and name (not (string-equal name ""))
             (/= (aref name 0) ?\s)
             (string-match "^[^\*]" name))
        (funcall 'kill-buffer buffer)))))

Terinspirasi dari kill-matching-buffer . Anda dapat menambahkan lebih banyak conditionpada nama-buffer lain untuk dikecualikan, jika Anda mau.

Semoga membantu :)

azzamsa
sumber
Lihat ini untuk solusi saya yang lebih baik.
azzamsa
0

Anda juga dapat menyukai yang ini - matikan semua buffer kecuali yang sekarang, * Pesan * dan * gores * (yang berguna untuk dimiliki, saya menyebutnya "toolkit"), tutup jendela yang berlebihan juga, tinggal Anda jendela mana yang saat ini penyangga.

(defun my/kill-all-buffers-except-toolbox ()
  "Kill all buffers except current one and toolkit (*Messages*, *scratch*). Close other windows."
  (interactive)
  (mapc 'kill-buffer (remove-if
                       (lambda (x)
                         (or
                           (string-equal (buffer-name) (buffer-name x))
                           (string-equal "*Messages*" (buffer-name x))
                           (string-equal "*scratch*" (buffer-name x))))
                       (buffer-list)))
  (delete-other-windows))
Adam Faryna
sumber
(string-equal (buffer-name) (buffer-name x))sama dengan (eq x (current-buffer)), hanya kurang efisien. Sisanya ordapat disederhanakan menjadi(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan