Como faço para fechar tudo, exceto o buffer atual no Emacs? Semelhante ao recurso "Fechar outras guias" nos navegadores modernos?
Como faço para fechar tudo, exceto o buffer atual no Emacs? Semelhante ao recurso "Fechar outras guias" nos navegadores modernos?
Respostas:
Para uma abordagem mais manual, você pode listar todos os buffers com C-x C-b, marcar os buffers na lista para exclusão com de usar xpara removê-los.
Eu também recomendo substituindo list-buffers com o ibuffer mais avançado: (global-set-key (kbd "C-x C-b") 'ibuffer)
. O procedimento acima funcionará com o ibuffer, mas você também pode fazer isso:
m(marque o buffer que deseja manter)
t(marcas de alternância)
D(elimine todos os buffers marcados)
Eu também uso este trecho do Emacs Wiki, o que simplificaria ainda mais essa abordagem 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
? Use C-h m
para aprender atalhos de teclado, assim como em qualquer outro 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 : atualizado com feedback de Gilles
buffer-file-name
e, portanto, a chamada para remove-if-not
no exemplo acima preservará buffers dired (bem como buffer de rascunho, buffers de termo, buffers de ajuda, etc, qualquer coisa que não visite um arquivo). Não consigo pensar em um teste fácil que feche os buffers de arquivo e os buffers dired, você precisa basicamente de uma segunda chamada inteira de mapc com um teste diferente para os buffers 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
por remove-if-not
funciona, mas não mata os *helm..
buffers
Não existe uma maneira direta de fazer isso no emacs.
Você pode escrever uma função para fazer isso. O seguinte fechará todos os buffers:
(defun close-all-buffers () (interativo) (mapc 'kill-buffer (lista de buffers)))
Há um comando embutido m- x kill-some-buffers
(estou usando 24.3.50) Na minha gui nextstep (não tentei em um terminal, mas com certeza é semelhante), você pode aprovar quais buffers devem ser eliminados.
(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 você esperava.
E depois de ler a resposta de @ Starkey, acho que ficará melhor:
(defun only-current-buffer ()
(interactive)
(mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))
(buffer-list (current-buffer)) retornará uma lista que contém todos os buffers existentes, com o buffer atual no topo da lista.
Esta é minha primeira resposta no StackOverflow. Espero que ajude :)
Achei essa solução a mais simples. Isso exclui todos os buffers, exceto o atual. Você tem que adicionar este código ao seu .emacs
arquivo
(defun kill-other-buffers ()
"Kill all other buffers."
(interactive)
(mapc 'kill-buffer (delq (current-buffer) (buffer-list))))
Claro, então você o usa com M-x kill-other-buffers
RET ou cola o seguinte código no .emacs
arquivo também e, em seguida, apenas pressioneC-xC-b
(global-set-key (kbd "C-x C-b") 'kill-other-buffers)
Eu uso crux-kill-other-buffers por alguns meses.
Mas eu quero que os buffers dired sejam excluídos também. As respostas de @Euge e @wenjun.yan resolvem isso. Mas ele excluirá buffers especiais (por exemplo, * git-credential-cache - daemon *, * scratch *, operação do helm e etc). Então eu vim com esta solução (atual).
(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 em buffers de correspondência de morte . Você pode adicionar mais condition
em outro nome-do-buffer para excluir, se quiser.
Espero que ajude :)
Você também pode gostar deste - matar todos os buffers, exceto o atual, * Mensagens * e * arranhar * (que são úteis de se ter, eu os chamo de "kit de ferramentas"), feche janelas redundantes também, deixando você qual janela atual amortecedor.
(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))
é o mesmo que (eq x (current-buffer))
, apenas menos eficiente. O restante or
pode ser simplificado para(member (buffer-name x) '("*Messages*" "*scratch*"))
Isso é o que você quer:
C-x 1
fonte: https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/
ibuffer
? @phils