¿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?
¿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:
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)
q
¿ tal vez ? Úselo C-h m
para aprender combinaciones de teclas, al igual que con cualquier otro modo.
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
buffer-file-name
y, por lo tanto, la llamada a remove-if-not
en 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.
(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)))))
cl-remove-if-not
con remove-if-not
obras, pero esto no mata los *helm..
búferes
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)))
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.
(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 :)
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 .emacs
archivo
(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 .emacs
archivo también y luego simplemente presioneC-xC-b
(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
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 condition
en otro nombre de búfer para excluir, si lo desea.
Espero eso ayude :)
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 or
se puede simplificar a(member (buffer-name x) '("*Messages*" "*scratch*"))
Esto es lo que quieres:
C-x 1
fuente: https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/
ibuffer
? @phils