web-dev-qa-db-fra.com

Fermez tous les tampons à part celui actuel dans Emacs

Comment puis-je fermer tout sauf le tampon actuel dans Emacs? Similaire à la fonction "Fermer d'autres onglets" dans les navigateurs Web modernes?

85
Sridhar Ratnakumar

De 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 commentaires de Gilles

50
Sridhar Ratnakumar

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

Je recommande également de remplacer les tampons de liste par l'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 (basculer les marques)
D (tuer 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)
93
phils

Il n'y a aucun moyen de le faire directement dans emacs.

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

 (defun close-all-buffers () 
 (interactif) 
 (mapc 'kill-buffer (buffer-list))) 
19
Starkey

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 sûr que c'est similaire), vous pouvez ensuite approuver les tampons à tuer.

13
pjammer
 (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 qui contient tous les tampons existants, avec le tampon actuel en tête de la liste.

Ceci est ma première réponse sur StackOverflow. J'espère que cela aide :)

9
wenjun.yan

J'ai trouvé que cette solution était la plus simple. Cela supprime tous les tampons, sauf celui en cours. Vous devez ajouter ce code à votre .emacs fichier

(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 o vous collez le code suivant dans le .emacs fichier aussi, puis appuyez simplement sur C-xC-b

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

J'ai utilisé crux-kill-other-buffers pendant quelques mois.

Mais je veux que les tampons dirigés soient également supprimés. Les réponses de @ Euge et @ wenjun.yan résolvent cela. Mais cela supprimera les tampons spéciaux (par exemple * git-credential-cache - daemon *, * scratch *, opération de barre, etc.). J'ai donc trouvé 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é de kill-matching-buffers . Vous pouvez ajouter plus condition sur un autre nom de tampon à exclure, si vous le souhaitez.

J'espère que cela aide :)

1
azzamsa

Vous pouvez également aimer celui-ci - tuez tous les tampons sauf le tampon actuel, * Messages * et * scratch * (qui sont pratiques à avoir, je les appelle "boîte à outils"), fermez également les fenêtres redondantes, vous vivant quelle fenêtre qui 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))
0
Adam Faryna