Jak mogę zamknąć wszystkie bufory w Emacsie?

1

Często zostawiam Emacsa (właściwie Aquamaca) otwartego i kończę z dużą ilością buforów zaśmiecających moje automatyczne uzupełnianie. Chciałbym móc je wszystkie zamknąć i zacząć od nowa. W tej chwili rezygnuję i otwieram ponownie Emacsa, ale to źle się czuję.

Czy istnieje sposób na zamknięcie wszystkich buforów w Emacsie?

To jest Emacs 24.4 / Aquamacs 3.2.

Schwern
źródło
(defun close-all-buffers () (interactive) (mapc 'kill-buffer (buffer-list)))- stackoverflow.com/a/3417472/2112489
lista prawników
@lawlist Thanks! Powinieneś opublikować to jako odpowiedź tutaj, aby było dostępne pod odpowiednim tytułem pytania, aby inni mogli je znaleźć.
Schwern
1
Możesz także sprawdzić clean-buffer-list, co spowoduje zamknięcie wszystkich buforów, które nie były używane przez pewien czas.
Juancho

Odpowiedzi:

3

Następująca funkcja została napisana przez nazwę użytkownika Starkey podczas stackoverflow w powiązanym pytaniu: https://stackoverflow.com/a/3417472/2112489

(defun close-all-buffers ()
(interactive)
  (mapc 'kill-buffer (buffer-list)))

EDYCJA : Jak sugeruje @Drew w komentarzu poniżej, ogólnie dobrym pomysłem jest przechowywanie wewnętrznych buforów, które mają wiodące miejsce w nazwach. Dokument doc zawiera objaśnienie działania tej funkcji. Skrót klawiaturowy F5klawisza jest tylko przykładem do testowania funkcji w połączeniu z uniwersalnym argumentem.

(defun custom-kill-buffer-fn (&optional arg)
"When called with a prefix argument -- i.e., C-u -- kill all interesting
buffers -- i.e., all buffers without a leading space in the buffer-name.
When called without a prefix argument, kill just the current buffer
-- i.e., interesting or uninteresting."
(interactive "P")
  (cond
    ((and (consp arg) (equal arg '(4)))
      (mapc
        (lambda (x)
          (let ((name (buffer-name x)))
            (unless (eq ?\s (aref name 0))
              (kill-buffer x))))
        (buffer-list)))
    (t
      (kill-buffer (current-buffer)))))

(global-set-key [f5] 'custom-kill-buffer-fn)
lista prawnicza
źródło
Jeśli to zrobisz, równie dobrze możesz zamknąć Emacsa i uruchomić go ponownie. ;-) Naprawdę mało prawdopodobne jest, że chcesz zabić wszystkie bufory. Obejmuje to „wewnętrzne” bufory, których Emacs prawie się spodziewa. Możesz to zrobić, ale wątpię, aby to było to, co naprawdę chcesz zrobić. Na początek sugerowałbym zabicie wszystkich buforów, których nazwy nie zaczynają się od znaku spacji.
Drew
@Drew - To świetny pomysł i dałbym mi pretekst, aby załączyć własny pomysł, który jest funkcją kill-buffer, która akceptuje uniwersalny argument - tj. Standardowe zabicie bieżącego bufora lub zabicie ich wszystkich które nie mają wiodącej przestrzeni. Dodam nową funkcję do mojej listy rzeczy do zrobienia.
prawnik
2

Wydaje mi się, że twoim głównym problemem są wiele starych buforów, których prawdopodobnie nie odwiedziłeś przez jakiś czas.

W emacsie jest polecenie clean-buffer-list. Domyślnie czyści bufory, do których nie było dostępu przez 3 dni (lub 1 godzinę, w przypadku niektórych buforów specjalnych). Oczywiście możesz dostosować czas. Zobacz także midnight-mode, który robi to automatycznie w określonym czasie.

Jeśli nie chcesz zabijać wszystkich buforów oprócz tego, którego aktualnie używasz:

(defun kill-other-buffers ()
  "Kill all other buffers."
  (interactive)
  (mapc 'kill-buffer (delq (current-buffer) (buffer-list))))
Christian Herenz
źródło