Wie schließe ich alle außer dem aktuellen Puffer in Emacs? Ähnlich wie bei der Funktion "Andere Registerkarten schließen" in modernen Webbrowsern?
Wie schließe ich alle außer dem aktuellen Puffer in Emacs? Ähnlich wie bei der Funktion "Andere Registerkarten schließen" in modernen Webbrowsern?
Antworten:
Für einen manuelleren Ansatz können Sie alle Puffer mit auflisten C-x C-b, Puffer in der Liste zum Löschen mit markieren dund sie dann xzum Entfernen verwenden.
Ich empfehle außerdem, Listenpuffer durch den erweiterten ibuffer zu ersetzen : (global-set-key (kbd "C-x C-b") 'ibuffer)
. Das Obige funktioniert mit ibuffer, aber Sie können dies auch tun:
m(Markieren Sie den Puffer, den Sie behalten möchten.)
t(Markierungen umschalten.)
D(Alle markierten Puffer löschen.)
Ich verwende auch diesen Ausschnitt aus dem Emacs-Wiki, der diesen manuellen Ansatz weiter rationalisieren würde:
;; 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
? Verwenden Sie C-h m
diese Option, um wie bei jedem anderen Modus Tastenkombinationen zu lernen.
Aus EmacsWiki: Puffer töten :
(defun kill-other-buffers ()
"Kill all other buffers."
(interactive)
(mapc 'kill-buffer
(delq (current-buffer)
(remove-if-not 'buffer-file-name (buffer-list)))))
Bearbeiten : aktualisiert mit Feedback von Gilles
buffer-file-name
und daher werden beim Aufruf remove-if-not
im obigen Beispiel Dired-Puffer beibehalten (sowie Scratch-Puffer, Term-Puffer, Hilfepuffer usw., alles, was eine Datei nicht besucht). Ich kann mir keinen einfachen Test vorstellen, der sowohl Dateipuffer als auch Dired-Puffer schließt. Sie benötigen im Grunde einen zweiten Aufruf von mapc mit einem anderen Test für Dired-Puffer.
(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
mit remove-if-not
Werken aber nicht tötet *helm..
Puffer
Es gibt keine Möglichkeit direkt in Emacs, dies zu tun.
Sie könnten dazu eine Funktion schreiben. Folgendes schließt alle Puffer:
(Defun Close-All-Puffer () (interaktiv) (mapc 'kill-buffer (Pufferliste)))
Es gibt einen eingebauten Befehl m - x kill-some-buffers
(ich verwende 24.3.50) In meiner Nextstep-GUI (nicht in einem Terminal ausprobiert, aber sicher, dass es ähnlich ist) können Sie dann genehmigen, welche Puffer getötet werden sollen.
(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)))))
Es funktioniert wie erwartet.
Und nachdem ich die Antwort von @ Starkey gelesen habe, denke ich, dass dies besser sein wird:
(defun only-current-buffer ()
(interactive)
(mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))
(Pufferliste (aktueller Puffer)) gibt eine Liste zurück, die alle vorhandenen Puffer enthält, wobei der aktuelle Puffer am Anfang der Liste steht.
Dies ist meine erste Antwort auf StackOverflow. Ich hoffe es hilft :)
Ich fand diese Lösung die einfachste. Dadurch wird jeder Puffer außer dem aktuellen gelöscht. Sie müssen diesen Code zu Ihrer .emacs
Datei hinzufügen
(defun kill-other-buffers ()
"Kill all other buffers."
(interactive)
(mapc 'kill-buffer (delq (current-buffer) (buffer-list))))
Natürlich verwenden Sie es dann mit M-x kill-other-buffers
RET oder fügen den folgenden Code ebenfalls in die .emacs
Datei ein und drücken dann einfachC-xC-b
(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
Ich benutze seit einigen Monaten Crux-Kill-Other-Puffer .
Aber ich möchte, dass verschmutzte Puffer auch gelöscht werden. Die Antworten von @ Euge und @ wenjun.yan lösen dieses Problem. Es werden jedoch spezielle Puffer gelöscht (z. B. * git-credential-cache - Daemon *, * Scratch *, Helmoperation usw.). Also habe ich mir diese (aktuelle) Lösung ausgedacht.
(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)))))
Inspiriert von Kill-Matching-Puffern . Sie können weitere hinzufügencondition
weitere Puffernamen , um sie auszuschließen, wenn Sie möchten.
Ich hoffe es hilft :)
Sie können diesen auch mögen - töten Sie alle Puffer außer dem aktuellen, * Nachrichten * und * Kratzer * (die praktisch sind, ich nenne sie "Toolkit"), schließen Sie auch redundante Fenster und leben Sie, welches Fenster welches aktuell ist Puffer.
(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))
ist das gleiche wie (eq x (current-buffer))
, nur weniger effizient. Der Rest or
kann vereinfacht werden(member (buffer-name x) '("*Messages*" "*scratch*"))
Das ist, was du willst:
C-x 1
Quelle: https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/
ibuffer
? @phils