Schließen Sie alle Puffer außer dem aktuellen in Emacs


91

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:


99

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)

Wie kann ich zurückkehren ibuffer? @phils
Alper

1
Ich bin nicht sicher, was Sie fragen, aber vielleicht q? Verwenden Sie C-h mdiese Option, um wie bei jedem anderen Modus Tastenkombinationen zu lernen.
Phils

53

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


3
Warum wird der dired Puffer nicht getötet? Ich möchte das auch entfernen
swdev

Dired-Puffer werden nicht gesetzt, buffer-file-nameund daher werden beim Aufruf remove-if-notim 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.
Robru

eine einfache Modifikation, um auch verschmutzte Puffer zu töten (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

Es sieht so aus, als ob der Mann in diesem Video dazu in der Lage ist. Er öffnet einen neuen Schleimpuffer, während er die GNU-Puffer und andere schließt. Hast du eine Idee, wie er das macht? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist

Ersetzen cl-remove-if-notmit remove-if-notWerken aber nicht tötet *helm..Puffer
Alper

21

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

4
Ah, aber das schließt alle Puffer.
Sridhar Ratnakumar

14

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.


2
Dies ist besonders nützlich, wenn Sie mehr als 1000 Puffer geladen haben.
ocodo

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


2
Und so, meine Freunde, entstehen elegante Lösungen, wenn Menschen ihre Ideen teilen
Chris Clark,

4

Ich fand diese Lösung die einfachste. Dadurch wird jeder Puffer außer dem aktuellen gelöscht. Sie müssen diesen Code zu Ihrer .emacsDatei 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 .emacsDatei ein und drücken dann einfachC-xC-b

(global-set-key (kbd "C-x C-b") 'kill-other-buffers)

1

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


Siehe dies für meine verbesserte Lösung.
Azzamsa

0

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 orkann vereinfacht werden(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.