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 m
do 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-name
a zatem wywołanie remove-if-not
w 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-not
z remove-if-not
prac, 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-buffer
i 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-list
zmienił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 RET
dla 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 .emacs
pliku
(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 .emacs
pliku, 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 condition
innych 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ę or
moż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