101 votes

Fermer tous les tampons en dehors de celui en cours dans Emacs

Comment fermer tout sauf le tampon actuel dans Emacs ? Similaire à la fonction "Fermer les autres onglets" des navigateurs web modernes ?

106voto

phils Points 30543

Pour une approche plus manuelle, vous pouvez lister tous les tampons avec C-x C-b marquer les tampons dans la liste pour la suppression avec d et ensuite utiliser x pour les enlever.

Je recommande également de remplacer les list-buffers par le plus avancé ibuffer : (global-set-key (kbd "C-x C-b") 'ibuffer) . Ce qui précède fonctionnera avec ibuffer, mais vous pouvez aussi faire ceci :

m (marquez le tampon que vous souhaitez conserver)
t (marques de basculement)
D (tuer tous les tampons marqués)

J'utilise également cet extrait du Wiki Emacs, qui simplifie encore plus 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)

0 votes

Comment puis-je revenir de ibuffer ? @phils

1 votes

Je ne suis pas sûr de ce que vous demandez, mais peut-être que q ? Utilisez C-h m pour apprendre les combinaisons de touches, comme pour tout autre mode.

57voto

Sridhar Ratnakumar Points 12390

De EmacsWiki : Tuer les tampons :

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

Editar : mise à jour avec les commentaires de Gilles

3 votes

Pourquoi les tampons durs ne sont pas tués ? J'aimerais aussi le supprimer.

0 votes

Les tampons désordonnés ne sont pas fixés buffer-file-name et donc l'appel à remove-if-not dans l'exemple ci-dessus préservera les tampons durs (ainsi que les tampons de scratch, les tampons de terme, les tampons d'aide, etc, tout ce qui ne visite pas un fichier). Je ne peux pas penser à un test facile qui fermerait à la fois les tampons de fichiers et les tampons directs, vous auriez besoin d'une seconde invocation de mapc avec un test différent pour les tampons directs.

0 votes

Une simple modification pour supprimer les tampons également désordonnés (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)))))

22voto

Starkey Points 7030

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

Vous pourriez écrire une fonction pour faire cela. La fonction suivante fermera tous les tampons :

(defun close-all-buffers ()
  (interactive)
  (mapc 'kill-buffer (buffer-list)))

5 votes

Ah, mais cela va fermer tous tampons.

1 votes

(delete (current-buffer) (buffer-list)) devrait vous donner une liste de tampons que vous pouvez mapper kill-buffer à travers et éviter de tuer le tampon actuel.

0 votes

@NickD : Oui, ça marche bien. Merci !

18voto

pjammer Points 5042

Il existe une commande intégrée m - x kill-some-buffers (J'utilise la 24.3.50) Dans mon interface nextstep (je n'ai pas essayé dans un terminal mais je suis sûr que c'est similaire) vous pouvez alors approuver les tampons à tuer.

5 votes

Ceci est particulièrement utile lorsque vous avez plus de 1000 tampons chargés.

2 votes

@ocodo Est-ce que tu voulais dire ça au sens propre ou au sens figuré ?

11voto

wenjun.yan Points 401
 (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 vous l'aviez prévu.

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

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

(buffer-list (current-buffer)) retournera une liste qui contient tous les tampons existants, avec le tampon actuel en tête de liste.

C'est ma première réponse sur StackOverflow. J'espère que cela vous aidera :)

2 votes

Et c'est ainsi, mes amis, que des solutions élégantes naissent du partage des idées entre les gens.

0 votes

Je ne sais pas si la spécification pour les buffer-list a changé au fil des ans, mais (buffer-list (current-buffer)) pour fonctionner comme l'indique la réponse ci-dessus PAS travail. Faites C-h f buffer-list RET pour la spécification actuelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X