Zamknij wszystkie buforowane bufory


23

Czasami moja lista buforów ma ponad 10 okien z diodami i ostatecznie używam buffer-menudo ręcznego zaznaczania i zabijania ich wszystkich. Czy istnieje szybszy sposób na zamknięcie wszystkich otwartych okien?


Zaakceptowałem odpowiedź, która najbardziej bezpośrednio odpowiada na pytanie. Jednak od tego czasu zacząłem stosować uncję zapobiegania: emacs.stackexchange.com/a/1041/93
nispio

Odpowiedzi:


32

Możesz wykonać następujące czynności:

M-x ibuffer

* / do oznaczania buforów w trybie diodowym.

D aby je usunąć.


1
Nigdy wcześniej nie słyszałem o ibufferze. Na pewno będę mapować C-x C-bna ibuffer.
nispio

Możesz także nacisnąć t( dired-toggle-marks), aby zaznaczyć wszystkie (jeśli żadne nie było wcześniej zaznaczone).
caisah

@caisah dired-toggle-marksjest nazwa dired polecenia. Naciśnięcie tspowoduje również przełączenie wszystkich znaków w ibufferze, ale bufory niebędące diodami zwykle przewyższają liczniki buforów, więc przełączanie często nie ma sensu w tym kontekście.
nispio

@nispio Masz rację. Nie wiem dlaczego, ale myślałem wszystkie bufory dired ...
caisah

1
Uwaga: nie działa to poprawnie, gdy nie ma buforów dired, ponieważ D nie będzie miało zastosowania do buforów dired, ale do pierwszego bufora na liście.
Daniel Kullmann

10

Zamiast dodawać kolejną funkcję do zabijania wszystkich diredbuforów, sugeruję skorzystanie z grup filtrów w ibuffer, pozwala to na grupowanie bufora według wielu warunków.

Oto przykład ustawiania grup filtrów:

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

Następnie C-x C-botwórz ibufferokno, możesz zobaczyć coś takiego:

Przykład 1

Przesuń kursor do [ Dired ](za pomocą M-p, M-n), a następnie naciśnij, daby zaznaczyć jako usuń

przyklad 2

następnie naciśnij, xaby wykonać.

Wolę tak, ponieważ nie muszę myśleć o tym, jak powinienem powiązać mój klucz z nową funkcją, a moje bufory są lepiej zorganizowane.


Grupy filtrów nie były dla mnie wyświetlane po pierwszym uruchomieniu ibufferpo sprawdzeniu kodu. Musiałem uderzyć / R(związany ibuffer-switch-to-saved-filter-groups), aby zdobyć grupy.
itsjeyd

(ibuffer-switch-to-saved-filter-groups "Default")Możesz dodać ten wiersz kodu do haczyka ibuffer, nazwa grupy filtrów powinna zostać zmieniona, jeśli nie jestDefault
Rangi Lin

1
Tak właśnie skończyłem. Nie wiedziałem o grupach filtrów przed przeczytaniem twojej odpowiedzi, dziękuję, że o nich wspomniałeś;)
itsjeyd

10

Czy masz wiele buforów Dired, ponieważ chciałeś je wszystkie w jednym momencie? IOW, czy chciałeś stworzyć każdy z nich jako osobne bufory?

Jeśli nie, rozwiązanie jest proste: powiedz Diredowi, aby ponownie używał istniejącego bufora Dired po naciśnięciuRET nazwy katalogu, aby otworzyć go w Dired.

Oto jak to zrobić:

  1. Załaduj bibliotekę Dired + ( dired+.el):

    (require 'dired+)
    
  2. Powiedz Diredowi, aby ponownie używał buforów Dired:

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

Efekt jest taki, że po RETnaciśnięciu (lub kliknięciu myszą) katalogu w Dired, find-alternate-fileużywany jest oryginalny bufor Dired jest zastępowany (usuwany) nowym.

Możesz zmienić to zachowanie w dowolnym momencie, używając C-M-R(aka C-M-S-r) w Dired.


To jest rozwiązanie, na które się teraz zdecydowałem. Nigdy nie chciałem 20 otwartych buforów Dired. Dzięki za sugestię (i utworzenie).
nispio,

Linki są martwe, a 404: (
Zelphir Kaltstahl,

1
@Zelphir: Dzięki za heads-up. Teraz powinno być OK. (Wiki Emacsa ogólnie zmieniało swoje adresy URL, więc stare posty, takie jak ten, miały zepsute linki).
Drew

8

Coś w tym stylu (przewiń trochę)?

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

5

Możesz także użyć helm-mini:

  • Uruchom M-x helm-mini.
  • Wpisz znak zachęty: *Di(słowo częściowe Dired, nie trzeba wprowadzać więcej). Podczas pisania bufory są stopniowo zwężane. Teraz został tylko Diredbufor. Naciśnij, M-aaby zaznaczyć wszystko.
  • Naciśnij, TABaby przejść do menu akcji i naciśnij, Kaby wybrać akcję Kill buffer(s).
  • Naciśnij, RETaby wykonać akcję.

Dobrą rzeczą helm-minijest to, że może zastąpić normalne Emacsa C-x b, więc nie będziesz musiał używać dwóch powiązań klawiszy, jednego do przełączania bufora i jednego do faktycznego menedżera buforów. helm-minijest wszystko w jednym. Przeczytaj więcej w moim mini przewodniku po sterach .

helm-minimoże także zamazać bufor dopasowania i pozwolić na otwarcie wielu buforów poprzez oznaczenie za pomocą C-SPClub M-a(skrót od M ark a ll). Możesz także zawęzić do bufora zawierającego określony ciąg, dołączając @przed wzorem, na przykład @testoznacza , że zaznacz tylko bufory zawierają ciąg „test”.


1

Spróbowałbym czegoś takiego:

(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
Wierzę, że -filterwymaga dash.elod MELPA. Prawdopodobnie powinieneś wymienić to jako wymóg.
Vamsi

1

To, czego możesz naprawdę szukać, to sposób automatycznego czyszczenia niechcianych buforów, w takim przypadku powinieneś sprawdzić midnight.el, który jest częścią Emacsa.

Ale ogólnie mówiąc, ibufferbardzo łatwo działa na zbiorczych buforach, jak sugerował Francisco.


1

Jeśli używasz Sopli , możesz użyć C-x kdo zabicia wszystkich buforów Dired - lub wszystkich buforów w dowolnym trybie.

Po trafieniu C-x kużyj, C-x M +aby zachować tylko bufory z określonym trybem. Naciśnij, TABaby zobaczyć tryby i wybierz dired-mode. Następnie użyj, C-!aby zabić wszystkie bufory w tym trybie.

C-x k C-x M + dired-mode C-!
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.