Comment puis-je fermer tout sauf le tampon actuel dans Emacs? Similaire à la fonction "Fermer d'autres onglets" dans les navigateurs Web modernes?
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
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)
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)))
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.
(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 :)
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)
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 :)
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))