Come faccio a chiudere tutto tranne il buffer corrente in Emacs? Simile alla funzione "Chiudi altre schede" nei browser web moderni?
Come faccio a chiudere tutto tranne il buffer corrente in Emacs? Simile alla funzione "Chiudi altre schede" nei browser web moderni?
Risposte:
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)
q
? Da usare C-h m
per imparare le associazioni di tasti, proprio come con qualsiasi altra modalità.
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
buffer-file-name
e quindi la chiamata a remove-if-not
nell'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.
(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
con remove-if-not
opere ma questo non uccide i *helm..
buffer
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)))
(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 :)
Ho trovato questa soluzione la più semplice. Questo cancella ogni buffer tranne quello corrente. Devi aggiungere questo codice al tuo .emacs
file
(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 .emacs
file e poi premiC-xC-b
(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
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 condition
su un altro nome-buffer da escludere, se lo desideri.
Spero che sia d'aiuto :)
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 or
può essere semplificato in(member (buffer-name x) '("*Messages*" "*scratch*"))
Questo è quello che vuoi:
C-x 1
fonte: https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/
ibuffer
? @phils