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?

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)

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


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

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ć.


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


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)

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


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

(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

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.