Feche todos os buffers além do atual no Emacs

91

Como faço para fechar tudo, exceto o buffer atual no Emacs? Semelhante ao recurso "Fechar outras guias" nos navegadores modernos?

Sridhar Ratnakumar
fonte

Respostas:

99

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)
phils
fonte
Como posso voltar de ibuffer? @phils
alper
1
Não tenho certeza do que você está perguntando, mas talvez q? Use C-h mpara aprender atalhos de teclado, assim como em qualquer outro 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 : atualizado com feedback de Gilles

Sridhar Ratnakumar
fonte
3
Por que o buffer estragado não está sendo morto? Eu gosto de remover isso também
swdev
buffers dired não são configurados buffer-file-namee, portanto, a chamada para remove-if-notno 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.
robru
uma modificação simples para matar buffers também 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)))))
frinkr
Parece que neste vídeo o homem é capaz de fazer isso. Ele abre um novo buffer do Slime enquanto fecha os buffers do GNU e outros. Você tem alguma ideia de como ele faz isso? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist
Substituir cl-remove-if-notpor remove-if-notfunciona, mas não mata os *helm..buffers
final de
21

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)))
Starkey
fonte
4
Ah, mas isso fechará todos os buffers.
Sridhar Ratnakumar
14

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.

pjammer
fonte
2
Isso é especialmente útil quando você tem mais de 1000 buffers carregados.
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 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 :)

wenjun.yan
fonte
2
E é assim, meus amigos, que soluções elegantes surgem de pessoas que compartilham suas ideias
Chris Clark
4

Achei essa solução a mais simples. Isso exclui todos os buffers, exceto o atual. Você tem que adicionar este código ao seu .emacsarquivo

(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 .emacsarquivo também e, em seguida, apenas pressioneC-xC-b

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

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 conditionem outro nome-do-buffer para excluir, se quiser.

Espero que ajude :)

azzamsa
fonte
Veja isso para minha solução aprimorada.
azzamsa
0

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))
Adam Faryna
fonte
(string-equal (buffer-name) (buffer-name x))é o mesmo que (eq x (current-buffer)), apenas menos eficiente. O restante orpode ser simplificado para(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan