Questão Como posso fechar todos os buffers no Emacs?


Muitas vezes deixo o Emacs (na verdade, Aquamacs) aberto e acabo com muitos buffers sobrecarregando meu auto-completar. Eu gostaria de poder fechar todos eles e começar de novo. Agora eu parei e reabrei o Emacs, mas isso parece errado.

Existe uma maneira de fechar todos os buffers no Emacs?

Este é o Emacs 24.4 / Aquamacs 3.2.


1


origem


(defun close-all-buffers () (interactive) (mapc 'kill-buffer (buffer-list))) - stackoverflow.com/a/3417472/2112489 - lawlist
@lawlist Obrigado! Você deve postar isso como uma resposta aqui, então está disponível sob o título da pergunta correta para ser encontrado por outras pessoas. - Schwern
Você também pode verificar clean-buffer-list, que fechará todos os buffers que não foram utilizados por algum tempo. - Juancho


Respostas:


A seguinte função foi escrita por nome de usuário Starkey no stackoverflow em uma questão relacionada: https://stackoverflow.com/a/3417472/2112489

(defun close-all-buffers ()
(interactive)
  (mapc 'kill-buffer (buffer-list)))

EDITAR: Como sugerido por @Drew no comentário abaixo, geralmente é uma boa ideia manter buffers internos que tenham um espaço principal em seus nomes. O doc-string fornece uma explicação de como esta função funciona. O atalho de teclado do F5 key é apenas um exemplo para os propósitos de testar a função em conjunto com um argumento universal.

(defun custom-kill-buffer-fn (&optional arg)
"When called with a prefix argument -- i.e., C-u -- kill all interesting
buffers -- i.e., all buffers without a leading space in the buffer-name.
When called without a prefix argument, kill just the current buffer
-- i.e., interesting or uninteresting."
(interactive "P")
  (cond
    ((and (consp arg) (equal arg '(4)))
      (mapc
        (lambda (x)
          (let ((name (buffer-name x)))
            (unless (eq ?\s (aref name 0))
              (kill-buffer x))))
        (buffer-list)))
    (t
      (kill-buffer (current-buffer)))))

(global-set-key [f5] 'custom-kill-buffer-fn)

3



Se você fizer isso, é melhor você fechar o Emacs e reiniciá-lo. ;-) É realmente improvável que você queira matar todos buffers. Isso inclui buffers "internos" que o Emacs praticamente espera estar lá. Você pode fazer isso, mas duvido que seja o que você realmente quer fazer. Eu sugiro talvez matar todos os buffers cujos nomes não começam com um caractere de espaço, para iniciantes. - Drew
@ Drew - Essa é uma excelente ideia e me daria uma desculpa para incluir uma idéia minha, que é uma função de buffer de morte que aceita um argumento universal - isto é, padrão mata o buffer atual, ou mata todos eles que não tem um espaço principal. Eu adicionarei a nova função à minha lista de tarefas. - lawlist


Parece-me, que o seu principal problema são muitos buffers antigos, que você provavelmente não visitou por algum tempo.

No emacs há um comando clean-buffer-list. Por padrão, ele limpa os buffers que não foram acessados ​​por 3 dias (ou 1 hora, no caso de alguns buffers especiais). Claro, você pode personalizar o tempo. Também dê uma olhada midnight-mode, que faz isso automaticamente em algum momento especificado.

Se você não quiser matar todos os buffers, exceto o que você está usando atualmente:

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

2