Chiudi tutti i buffer oltre a quello attuale in Emacs


91

Come faccio a chiudere tutto tranne il buffer corrente in Emacs? Simile alla funzione "Chiudi altre schede" nei browser web moderni?

Risposte:


99

Per un approccio più manuale, è possibile elencare tutti i buffer con C-x C-b, contrassegnare i buffer nell'elenco per l'eliminazione con de quindi utilizzare xper rimuoverli.

Consiglio anche la sostituzione list-buffers con l'ibuffer più avanzato: (global-set-key (kbd "C-x C-b") 'ibuffer). Quanto sopra funzionerà con ibuffer, ma potresti anche farlo:

m(contrassegna il buffer che desideri mantenere)
t(attiva / disattiva i contrassegni)
D(elimina tutti i buffer contrassegnati)

Uso anche questo frammento dal Wiki di Emacs, che semplificherebbe ulteriormente questo approccio manuale:

;; 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)

Come posso tornare da ibuffer? @phils
Alper

1
Non sono sicuro di quello che stai chiedendo, ma forse q? Da usare C-h mper imparare le associazioni di tasti, proprio come con qualsiasi altra modalità.
phils

53

Da EmacsWiki: Killing Buffers :

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

Modifica : aggiornato con il feedback di Gilles


3
Perché il buffer diretto non viene ucciso? Mi piace rimuovere anche quello
swdev

i buffer diretti non vengono impostati buffer-file-namee quindi la chiamata a remove-if-notnell'esempio precedente preserverà i buffer diretti (così come buffer di memoria virtuale, buffer dei termini, buffer della guida, ecc., tutto ciò che non visita un file). Non riesco a pensare a un test semplice che chiuderebbe sia i buffer di file che i buffer diretti, avresti bisogno fondamentalmente di una seconda invocazione di mapc con un test diverso per i buffer dired.
robru

una semplice modifica per uccidere anche i buffer (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)))))
diretti

Sembra che in questo video l'uomo sia in grado di farlo. Apre un nuovo buffer Slime mentre chiude i buffer GNU e altri. Hai idea di come lo fa? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist

Sostituzione cl-remove-if-notcon remove-if-notopere ma questo non uccide i *helm..buffer
alper

21

Non c'è un modo direttamente in emacs per farlo.

Potresti scrivere una funzione per farlo. Quanto segue chiuderà tutti i buffer:

(elimina quasi tutti i buffer ()
  (interattivo)
  (mapc 'kill-buffer (buffer-list)))

4
Ah, ma questo chiuderà tutti i buffer.
Sridhar Ratnakumar

14

C'è un comando integrato m- x kill-some-buffers(Sto usando 24.3.50) Nella mia gui nextstep (non provato in un terminale ma sicuramente è simile) puoi quindi approvare quali buffer uccidere.


2
Ciò è particolarmente utile quando sono caricati più di 1000 buffer.
ottobre

10
 (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)))))

Funziona come previsto.

E dopo aver letto la risposta di @ Starkey, penso che sarà meglio:

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

(buffer-list (current-buffer)) restituirà una lista che contiene tutti i buffer esistenti, con il buffer corrente all'inizio della lista.

Questa è la mia prima risposta su StackOverflow. Spero che sia d'aiuto :)


2
E questo, amici miei, è il modo in cui le soluzioni eleganti nascono dalle persone che condividono le loro idee
Chris Clark

4

Ho trovato questa soluzione la più semplice. Questo cancella ogni buffer tranne quello corrente. Devi aggiungere questo codice al tuo .emacsfile

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

Ovviamente, poi lo usi con M-x kill-other-buffers RET o incolli anche il seguente codice nel .emacsfile e poi premiC-xC-b

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

1

Uso crux-kill-other-buffer da alcuni mesi.

Ma voglio che anche i buffer dired vengano eliminati. Le risposte di @ Euge e @ wenjun.yan risolvono questo problema. Ma eliminerà i buffer speciali (ad esempio * git-credential-cache - daemon *, * scratch *, helm operation e così via). Quindi ho escogitato questa (attuale) soluzione.

(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)))))

Ispirato da kill-matching-buffer . Puoi aggiungere altro conditionsu un altro nome-buffer da escludere, se lo desideri.

Spero che sia d'aiuto :)


Vedi questo per la mia soluzione migliorata.
azzamsa

0

Ti può piacere anche questo - elimina tutti i buffer eccetto quello attuale, * Messaggi * e * scratch * (che sono comodi da avere, li chiamo "toolkit"), chiudi anche le finestre ridondanti, vivendoti quale finestra quale corrente buffer.

(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))

(string-equal (buffer-name) (buffer-name x))è uguale a (eq x (current-buffer)), solo meno efficiente. Il resto orpuò essere semplificato in(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.