Fermez tous les tampons en plus de celui actuel dans Emacs


91

Comment fermer tout sauf le tampon actuel dans Emacs? Similaire à la fonctionnalité "Fermer les autres onglets" dans les navigateurs Web modernes?

Réponses:


99

Pour une approche plus manuelle, vous pouvez répertorier tous les tampons avec C-x C-b, marquer les tampons dans la liste pour suppression avec d, puis les utiliser xpour les supprimer.

Je vous recommande également le remplacement de la liste-tampons avec le ibuffer plus avancé: (global-set-key (kbd "C-x C-b") 'ibuffer). Ce qui précède fonctionnera avec ibuffer, mais vous pouvez également le faire:

m(marquez le tampon que vous souhaitez conserver)
t(bascule)
D(tuez tous les tampons marqués)

J'utilise également cet extrait du Wiki Emacs, qui rationaliserait davantage cette approche manuelle:

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

Comment puis-je revenir de ibuffer? @phils
alper

1
Je ne sais pas ce que vous demandez, mais peut q- être ? Utilisez C-h mpour apprendre les associations de touches, comme avec n'importe quel autre mode.
phils

53

Depuis EmacsWiki: Killing Buffers :

(defun kill-other-buffers ()
    "Kill all other buffers."
    (interactive)
    (mapc 'kill-buffer 
          (delq (current-buffer) 
                (remove-if-not 'buffer-file-name (buffer-list)))))

Edit : mis à jour avec les retours de Gilles


3
Pourquoi le tampon dired n'est-il pas tué? J'aime supprimer cela aussi
swdev

les tampons dired ne sont pas définis buffer-file-nameet donc l'appel à remove-if-notdans l'exemple ci-dessus conservera les tampons dired (ainsi que le tampon de travail, les tampons de termes, les tampons d'aide, etc., tout ce qui ne visite pas un fichier). Je ne peux pas penser à un test facile qui fermerait les tampons de fichiers et les tampons dired, vous auriez besoin en gros d'une seconde invocation entière de mapc avec un test différent pour les tampons dired.
robru

une simple modification pour tuer également les tampons (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)))))
dired

On dirait que dans cette vidéo, l'homme est capable de le faire. Il ouvre un nouveau tampon Slime tout en fermant les tampons GNU et autres. Savez-vous comment il fait ça? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist

Remplacer cl-remove-if-notpar des remove-if-notœuvres mais cela ne tue pas les *helm..tampons
alper

21

Il n'y a pas de moyen directement dans emacs de faire cela.

Vous pouvez écrire une fonction pour ce faire. Ce qui suit fermera tous les tampons:

(défun fermer tous les tampons ()
  (interactif)
  (mapc 'kill-buffer (buffer-list)))

4
Ah, mais cela fermera tous les tampons.
Sridhar Ratnakumar

14

Il y a une commande intégrée m- x kill-some-buffers(j'utilise 24.3.50) Dans mon interface graphique nextstep (pas essayé dans un terminal mais bien sûr que c'est similaire), vous pouvez ensuite approuver les tampons à tuer.


2
Ceci est particulièrement utile lorsque vous avez plus de 1000 tampons chargés.
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)))))

Cela fonctionne comme prévu.

Et après avoir lu la réponse de @ Starkey, je pense que ce sera mieux:

(defun only-current-buffer () 
  (interactive)                                                                   
    (mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))

(buffer-list (current-buffer)) renverra une liste contenant tous les tampons existants, avec le tampon actuel en tête de la liste.

C'est ma première réponse sur StackOverflow. J'espère que ça aide :)


2
Et voici mes amis comment des solutions élégantes naissent de personnes partageant leurs idées
Chris Clark

4

J'ai trouvé que cette solution était la plus simple. Cela supprime tous les tampons sauf celui actuel. Vous devez ajouter ce code à votre .emacsfichier

(defun kill-other-buffers ()
      "Kill all other buffers."
      (interactive)
      (mapc 'kill-buffer (delq (current-buffer) (buffer-list))))

Bien sûr, vous l'utilisez avec M-x kill-other-buffers RET ou vous collez également le code suivant dans le .emacsfichier, puis appuyez simplement surC-xC-b

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

1

J'utilise crux-kill-other-buffers depuis quelques mois.

Mais je veux aussi que les tampons dired soient supprimés. Les réponses de @ Euge et @ wenjun.yan résolvent ce problème. Mais cela supprimera les tampons spéciaux (par exemple * git-credential-cache - daemon *, * scratch *, opération de barre, etc.). J'ai donc proposé cette solution (actuelle).

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

Inspiré des tampons de mise à mort . Vous pouvez en ajouter d'autres conditionsur un autre nom de tampon à exclure, si vous le souhaitez.

J'espère que ça aide :)


Voir ceci pour ma solution améliorée.
azzamsa

0

Vous pouvez également aimer celui-ci - tuer tous les tampons sauf celui actuel, * Messages * et * scratch * (qui sont pratiques à avoir, je les appelle "boîte à outils"), fermez également les fenêtres redondantes, en vous vivant quelle fenêtre actuelle tampon.

(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))est le même que (eq x (current-buffer)), juste moins efficace. Le reste orpeut être simplifié à(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.