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?

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)

¿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


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

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.


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


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)

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


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

(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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.