Jak zamknąć wszystkie bufory oprócz bieżącego w Emacsie? Podobna do funkcji „Zamknij inne karty” w nowoczesnych przeglądarkach internetowych?
Jak zamknąć wszystkie bufory oprócz bieżącego w Emacsie? Podobna do funkcji „Zamknij inne karty” w nowoczesnych przeglądarkach internetowych?
Odpowiedzi:
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)
q? Służy C-h mdo nauki skrótów klawiszowych, tak jak w każdym innym trybie.
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
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.
(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)))))
cl-remove-if-notz remove-if-notprac, ale to nie zabija *helm..bufory
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)))
(delete (current-buffer) (buffer-list))powinien dać ci listę buforów, którą możesz zmapować kill-bufferi uniknąć zabijania obecnego bufora.
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ć.
(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 :)
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.
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)
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 :)
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*"))
To jest to, czego chcesz:
C-x 1
źródło: https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/
ibuffer? @phils