Bagaimana cara menutup semua kecuali buffer saat ini di Emacs? Mirip dengan fitur "Tutup tab lain" di browser web modern?
92
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)
ibuffer
? @philsq
? GunakanC-h m
untuk mempelajari keybindings, sama seperti mode lainnya.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
sumber
buffer-file-name
dan dengan demikian panggilan keremove-if-not
dalam 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.(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)))))
cl-remove-if-not
denganremove-if-not
karya tetapi ini tidak mematikan*helm..
bufferTidak ada cara langsung di emacs untuk melakukan ini.
Anda bisa menulis fungsi untuk melakukan ini. Berikut ini akan menutup semua buffer:
sumber
(delete (current-buffer) (buffer-list))
harus memberi Anda daftar buffer yang dapat Anda petakankill-buffer
dan menghindari mematikan buffer saat ini.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.sumber
(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 :)
sumber
buffer-list
berubah selama bertahun-tahun, tetapi(buffer-list (current-buffer))
bekerja seperti yang ditunjukkan jawaban di atas TIDAK akan berfungsi. LakukanC-h f buffer-list RET
untuk spesifikasi saat ini.Saya menemukan solusi ini menjadi yang paling sederhana. Ini menghapus setiap buffer kecuali yang sekarang. Anda harus menambahkan kode ini ke
.emacs
file 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.emacs
file, lalu tekan sajaC-xC-b(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
sumber
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
condition
pada nama-buffer lain untuk dikecualikan, jika Anda mau.Semoga membantu :)
sumber
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))
sumber
(string-equal (buffer-name) (buffer-name x))
sama dengan(eq x (current-buffer))
, hanya kurang efisien. Sisanyaor
dapat disederhanakan menjadi(member (buffer-name x) '("*Messages*" "*scratch*"))
Inilah yang Anda inginkan:
C-x 1
sumber: https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/
sumber