Zamknij wszystkie bufory oprócz bieżącego w Emacsie

92

Jak zamknąć wszystkie bufory oprócz bieżącego w Emacsie? Podobna do funkcji „Zamknij inne karty” w nowoczesnych przeglądarkach internetowych?

Sridhar Ratnakumar
źródło

Odpowiedzi:

100

Aby uzyskać bardziej ręczne podejście, możesz wyświetlić wszystkie bufory za pomocą C-x C-b, oznaczyć bufory na liście do usunięcia za pomocą d, a następnie użyć xdo ich usunięcia.

Polecam również zastąpienie list-buforów z bardziej zaawansowanych ibuffer: (global-set-key (kbd "C-x C-b") 'ibuffer). Powyższe będzie działać z ibuffer, ale możesz też zrobić to:

m(zaznacz bufor, który chcesz zachować)
t(przełącz znaki)
D(zabij wszystkie zaznaczone bufory)

Używam również tego fragmentu z Emacs Wiki, który jeszcze bardziej usprawniłby to ręczne podejście:

;; 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)
phils
źródło
Jak mogę wrócić z ibuffer? @phils
alper
1
Nie jestem pewien, o co pytasz, ale może q? Służy C-h mdo nauki skrótów klawiszowych, tak jak w każdym innym trybie.
phils
53

Z EmacsWiki: zabijanie buforów :

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

Edycja : zaktualizowano o opinie od Gillesa

Sridhar Ratnakumar
źródło
3
Dlaczego dired bufor nie zostaje zabity? Lubię to również usuwać
swdev,
bufory dired nie są ustawiane, buffer-file-namea zatem wywołanie remove-if-notw powyższym przykładzie zachowa bufory dired (jak również bufor scratch, bufory terminów, bufory pomocy itp., wszystko, co nie odwiedza pliku). Nie mogę wymyślić prostego testu, który zamknąłby zarówno bufory plików, jak i bufory dired, w zasadzie potrzebowałbyś całego drugiego wywołania mapc z innym testem dla buforów dired.
robru
prosta modyfikacja, która zabija również dired bufory (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)))))
frinkr
Wygląda na to, że na tym filmie mężczyzna jest w stanie to zrobić. Otwiera nowy bufor Slime podczas zamykania buforów GNU i innych. Masz pojęcie, jak on to robi? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist
Wymiana cl-remove-if-notz remove-if-notprac, ale to nie zabija *helm..bufory
alper
21

W emacsie nie ma bezpośredniego sposobu, aby to zrobić.

Możesz napisać funkcję, która to zrobi. Poniższe działania zamkną wszystkie bufory:

(defun close-all-buffers ()
  (interaktywny)
  (mapc 'kill-buffer (buffer-list)))
Klawisz gwiazdki
źródło
4
Ach, ale to zamknie wszystkie bufory.
Sridhar Ratnakumar,
(delete (current-buffer) (buffer-list))powinien dać ci listę buforów, którą możesz zmapować kill-bufferi uniknąć zabijania obecnego bufora.
NickD
16

Jest wbudowane polecenie m- x kill-some-buffers(używam 24.3.50) W moim interfejsie GUI następnego kroku (nie próbowałem w terminalu, ale na pewno jest podobne) możesz następnie zatwierdzić, które bufory zabić.

pjammer
źródło
2
Jest to szczególnie przydatne, gdy załadowano ponad 1000 buforów.
ocodo
11
 (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)))))

Działa zgodnie z oczekiwaniami.

A po przeczytaniu odpowiedzi @ Starkey myślę, że tak będzie lepiej:

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

(lista-buforów (bieżący-bufor)) zwróci listę zawierającą wszystkie istniejące bufory, z bieżącym buforem na początku listy.

To moja pierwsza odpowiedź na StackOverflow. Mam nadzieję, że to pomoże :)

wenjun.yan
źródło
2
I tak moi przyjaciele, jak eleganckie rozwiązania powstają dzięki ludziom dzielącym się swoimi pomysłami
Chris Clark,
Nie wiem, czy specyfikacja buffer-listzmieniła się na przestrzeni lat, ale (buffer-list (current-buffer))działanie zgodnie z powyższą odpowiedzią NIE będzie działać. Zrób C-h f buffer-list RETdla aktualnej specyfikacji.
NickD
4

Uważam, że to rozwiązanie jest najprostsze. Spowoduje to usunięcie wszystkich buforów z wyjątkiem bieżącego. Musisz dodać ten kod do swojego .emacspliku

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

Oczywiście używasz go z M-x kill-other-buffers RET lub wklejasz również następujący kod do .emacspliku, a następnie po prostu naciśnijC-xC-b

(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
Euge
źródło
1

Od kilku miesięcy używam buforów crux-kill-other-buffers .

Ale chcę, żeby dired bufory też zostały usunięte. @ Euge i @ wenjun.yan rozwiązują ten problem. Ale usunie specjalne bufory (np. * Git-credential-cache - demon *, * scratch *, helm operation, itd.). Więc wymyśliłem to (aktualne) rozwiązanie.

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

Zainspirowany buforami dopasowującymi zabójstwa . Jeśli chcesz, możesz dodać więcej conditioninnych nazw buforów do wykluczenia.

Mam nadzieję, że to pomoże :)

azzamsa
źródło
Zobacz to dla mojego ulepszonego rozwiązania.
azzamsa
0

Ten też możesz polubić - zabij wszystkie bufory oprócz bieżącego, * Wiadomości * i * zadrapania * (które są przydatne, nazywam je "zestawem narzędzi"), zamknij również zbędne okna, sprawdzając, które okno jest aktualne bufor.

(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))
Adam Faryna
źródło
(string-equal (buffer-name) (buffer-name x))jest taki sam jak (eq x (current-buffer)), tylko mniej wydajny. Resztę ormożna uprościć do(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan