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?

Sridhar Ratnakumar
la source

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)
phils
la source
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

Sridhar Ratnakumar
la source
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)))
Touche étoile
la source
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.

pjammer
la source
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 :)

wenjun.yan
la source
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)
Euge
la source
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 :)

azzamsa
la source
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))
Adam Faryna
la source
(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