Chiudi tutti i buffer indirizzati


23

A volte il mio elenco di buffer ha più di 10 finestre indirizzate e finisco per buffer-menuusarle per contrassegnarle manualmente e ucciderle tutte. C'è un modo più veloce per chiudere tutte le finestre aperte?


Ho accettato la risposta che risponde più direttamente alla domanda. Tuttavia, da allora ho iniziato ad applicare un'oncia di prevenzione: emacs.stackexchange.com/a/1041/93
nispio

Risposte:


32

Puoi fare quanto segue:

M-x ibuffer

* / per contrassegnare i buffer in modalità diretta.

D per eliminarli.


1
Non avevo mai sentito parlare di ibuffer prima. Sicuramente mapperò C-x C-bsu ibuffer.
nispio,

Puoi anche premere t( dired-toggle-marks) per contrassegnare tutto (se nessuno era precedentemente contrassegnato).
caisah,

@caisah dired-toggle-marksè il nome del comando diretto . La pressione tinoltre commuta tutti i segni in ibuffer, ma i buffer non diretti solitamente superano quelli dei buffer diretti, quindi la commutazione spesso non ha senso in questo contesto.
nispio,

@nispio Hai ragione. Non so perché, ma stavo pensando tutti i tamponi sono stati Dired ...
caisah

1
Nota: questo non funziona correttamente quando non ci sono buffer indirizzati, poiché la D non si applicherà ai buffer indirizzati, ma al primo buffer nell'elenco.
Daniel Kullmann,

10

Invece di aggiungere un'altra funzione per eliminare tutti i diredbuffer, ti suggerisco di sfruttare i gruppi di filtri in ibuffer, ti consente di raggruppare il buffer in base a molte condizioni.

Ecco un esempio per impostare i gruppi di filtri:

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

Quindi C-x C-bapri la ibufferfinestra, puoi vedere qualcosa del genere:

Esempio 1

Spostare il cursore su [ Dired ](con M-p, M-n), quindi premere dper contrassegnare come Elimina

example2

quindi premere xper eseguire.

Preferisco così perché non ho bisogno di pensare a come associare la mia chiave alla nuova funzione e i miei buffer sono meglio organizzati.


I gruppi di filtri non sono stati visualizzati per me al primo avvio ibufferdopo aver valutato il codice. Ho dovuto colpire / R(vincolato ibuffer-switch-to-saved-filter-groups) per ottenere i gruppi.
itsjeyd

(ibuffer-switch-to-saved-filter-groups "Default")È possibile aggiungere questa riga di codice in ibuffer hook, il nome dei gruppi di filtri deve essere modificato in caso contrarioDefault
Rangi Lin

1
Sì, è quello che ho finito per fare. Non sapevo dei gruppi di filtri prima di leggere la tua risposta, grazie per averli menzionati;)
itsjeyd

10

Hai molti buffer Dired perché li volevi tutti ad un certo punto? IOW, volevi crearli ciascuno come buffer separati?

In caso contrario, la soluzione è semplice: dire a Dired di riutilizzare un buffer Dired esistente quando si premeRET un nome di directory per aprirlo in Dired.

Ecco come farlo:

  1. Carica libreria Dired + ( dired+.el):

    (require 'dired+)
    
  2. Di 'a Dired di riutilizzare i buffer di Dired:

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

L'effetto è che quando si RETpreme (o si fa clic con il mouse) su una directory in Dired, find-alternate-fileviene utilizzato, quindi il buffer Dired originale viene sostituito (eliminato) da quello nuovo.

Puoi attivare questo comportamento in qualsiasi momento, usando C-M-R(aka C-M-S-r) in Dired.


Questa è la soluzione su cui ho deciso ora. Non ho mai voluto 20 buffer Dired aperti in primo luogo. Grazie per averlo suggerito (e averlo creato.)
nispio,

I collegamenti sono morti, ottenendo un 404: (
Zelphir Kaltstahl

1
@Zelphir: grazie per l'heads-up. Dovrebbe essere OK ora. (Emacs Wiki ha cambiato i suoi URL in generale, quindi i vecchi post come questo hanno link non funzionanti.)
Disegnato il

8

Qualcosa del genere (scorrere un po ')?

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

5

Puoi anche usare helm-mini:

  • Corri M-x helm-mini.
  • Digitare nel prompt: *Di(parola parziale per Dired, non è necessario immetterne altri). Durante la digitazione, i buffer vengono ridotti in modo incrementale. Ora, è Diredrimasto solo il buffer. Premere M-aper contrassegnare tutto.
  • Premere TABper passare al menu azioni e premere Kper selezionare l'azione Kill buffer(s).
  • Premere RETper eseguire l'azione.

La cosa buona helm-miniè che può sostituire i normali Emacs C-x b, quindi non dovrai usare due combinazioni di tasti, una per cambiare buffer e una per un gestore buffer reale. helm-miniè tutto in uno. Maggiori informazioni nella mia guida helm-mini .

helm-minipuò anche fuzzy match buffer e consentire di aprire più buffer marcando con C-SPCo M-a(sta per M ark a ll). Puoi anche restringere il buffer per contenere una determinata stringa aggiungendo @prima di un modello, ad esempio, @testsignifica che solo i buffer contengono la stringa "test".


1

Vorrei provare qualcosa del genere:

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

1
Credo che -filterrichieda il dash.elMELPA. Probabilmente dovresti elencarlo come requisito.
Vamsi,

1

Quello che potresti effettivamente cercare è un modo per ripulire automaticamente i buffer indesiderati, nel qual caso dovresti dare un'occhiata midnight.el, che fa parte di Emacs.

Ma in generale, ibufferrende molto facile operare su buffer alla rinfusa, come ha suggerito Francisco.


1

Se usi Icicles , puoi usarlo C-x kper uccidere tutti i buffer Dired o tutti i buffer in una determinata modalità.

Dopo aver colpito C-x k, utilizzare C-x M +per mantenere solo i buffer con una determinata modalità. Premi TABper vedere le modalità e scegli dired-mode. Quindi utilizzare C-!per uccidere tutti i buffer con quella modalità.

C-x k C-x M + dired-mode C-!
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.