Cerrar todos los búferes además del actual en Emacs

91

¿Cómo cierro todos menos el búfer actual en Emacs? ¿Similar a la función "Cerrar otras pestañas" en los navegadores web modernos?

Sridhar Ratnakumar
fuente

Respuestas:

99

Para un enfoque más manual, puede enumerar todos los búferes con C-x C-b, marcar los búferes en la lista para eliminarlos dy luego usarlos xpara eliminarlos.

También se recomienda la sustitución de list-buffers con el ibuffer más avanzada: (global-set-key (kbd "C-x C-b") 'ibuffer). Lo anterior funcionará con ibuffer, pero también puede hacer esto:

m(marque el búfer que desea mantener)
t(alternar marcas)
D(eliminar todos los búferes marcados)

También utilizo este fragmento de Emacs Wiki, que simplificaría aún más este enfoque manual:

;; 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
fuente
¿Cómo puedo volver ibuffer? @phils
Alper
1
No estoy seguro de lo que estás preguntando, pero q¿ tal vez ? Úselo C-h mpara aprender combinaciones de teclas, al igual que con cualquier otro modo.
phils
53

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

Editar : actualizado con comentarios de Gilles

Sridhar Ratnakumar
fuente
3
¿Por qué no se mata el búfer de dired? Me gusta eliminar eso también
swdev
Los búferes dired no se establecen buffer-file-namey, por lo tanto, la llamada a remove-if-noten el ejemplo anterior conservará los búferes dired (así como el búfer temporal, búfer temporal, búfer de ayuda, etc., cualquier cosa que no visite un archivo). No puedo pensar en una prueba fácil que cierre tanto los búferes de archivos como los búferes dired, básicamente necesitarías una segunda invocación completa de mapc con una prueba diferente para búferes dired.
robru
una modificación simple para matar también búferes (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
Parece que en este video el hombre puede hacer eso. Abre un nuevo búfer de Slime mientras cierra los búferes de GNU y otros. ¿Tienes idea de cómo lo hace? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist
Reemplazo cl-remove-if-notcon remove-if-notobras, pero esto no mata los *helm..búferes
alper
21

No hay una forma directamente en emacs de hacer esto.

Podría escribir una función para hacer esto. Lo siguiente cerrará todos los búferes:

(defun cerrar-todos-búferes ()
  (interactivo)
  (mapc 'kill-buffer (lista de búfer)))
Starkey
fuente
4
Ah, pero esto cerrará todos los búferes.
Sridhar Ratnakumar
14

Hay un comando integrado m: x kill-some-buffers(estoy usando 24.3.50) En mi siguiente interfaz gráfica de usuario (no probado en una terminal, pero seguro que es similar), puede aprobar qué búferes eliminar.

pjammer
fuente
2
Esto es especialmente útil cuando tiene más de 1000 búferes cargados.
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)))))

Funciona como esperabas.

Y después de leer la respuesta de @ Starkey, creo que esto será mejor:

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

(buffer-list (current-buffer)) devolverá una lista que contiene todos los búferes existentes, con el búfer actual al principio de la lista.

Esta es mi primera respuesta en StackOverflow. Espero eso ayude :)

wenjun.yan
fuente
2
Y esto, amigos míos, es cómo surgen las soluciones elegantes de las personas que comparten sus ideas
Chris Clark
4

Encontré que esta solución es la más simple. Esto borra todos los búferes excepto el actual. Tienes que agregar este código a tu .emacsarchivo

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

Por supuesto, luego lo usa con M-x kill-other-buffers RET o pega el siguiente código en el .emacsarchivo también y luego simplemente presioneC-xC-b

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

He usado crux-kill-other-buffers durante algunos meses.

Pero quiero que los búferes de dired también se eliminen. Las respuestas de @ Euge y @ wenjun.yan resuelven esto. Pero eliminará búferes especiales (por ejemplo, * git-credential-cache - daemon *, * scratch *, operación de helm, etc.). Entonces se me ocurrió esta solución (actual).

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

Inspirado en búferes de emparejamiento de muertes . Puede agregar más conditionen otro nombre de búfer para excluir, si lo desea.

Espero eso ayude :)

azzamsa
fuente
Vea esto para mi solución mejorada.
azzamsa
0

También le puede gustar este: elimine todos los búferes excepto el actual, * Messages * y * scratch * (que son útiles, los llamo "kit de herramientas"), cierre las ventanas redundantes también, y le mostrará cuál es la ventana actual buffer.

(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
fuente
(string-equal (buffer-name) (buffer-name x))es lo mismo que (eq x (current-buffer)), pero menos eficiente. El resto orse puede simplificar a(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan