Feche todos os buffers direcionados

23

Às vezes, minha lista de buffers tem mais de 10 janelas direcionadas e eu acabo usando buffer-menupara marcar e matar manualmente todas elas. Existe uma maneira mais rápida de fechar todas as janelas dired abertas?

nispio
fonte
Aceitei a resposta que responde mais diretamente à pergunta. No entanto, tenho uma vez que começaram a aplicar uma onça de prevenção em vez disso: emacs.stackexchange.com/a/1041/93
nispio

Respostas:

32

Você pode fazer o seguinte:

M-x ibuffer

* / para marcar buffers no modo direcionado.

D para excluí-los.

Francisco Dibar
fonte
1
Eu nunca tinha ouvido falar em ibuffer antes. Definitivamente vou mapear C-x C-bpara ibuffer.
Nispio
Você também pode pressionar t( dired-toggle-marks) para marcar todos (se nenhum foi marcado anteriormente).
caisah 25/09/14
@caisah dired-toggle-marksé o nome do comando dired . Pressionar ttambém alternará todas as marcas no ibuffer, mas os buffers não direcionados geralmente superam os buffers direcionados, portanto, alternar geralmente não faz sentido nesse contexto.
Nispio 7/10
@nispio Você está certo. Eu não sei porque, mas eu estava pensando todos os buffers foram dired ...
caisah
1
Nota: isso não funciona corretamente quando não há buffers direcionados, porque o D não se aplica aos buffers direcionados, mas ao primeiro buffer da lista.
Daniel kullmann # 20/16
10

Em vez de adicionar outra função para eliminar todos os diredbuffers, sugiro que você aproveite os grupos de filtros ibuffer, pois permite agrupar o buffer por várias condições.

Aqui está um exemplo para definir grupos de filtros:

(setq-default ibuffer-saved-filter-groups
              `(("Default"
                 ;; I create a group call Dired, which contains all buffer in dired-mode
                 ("Dired" (mode . dired-mode))
                 ("Temporary" (name . "\*.*\*"))
                 )))

Em seguida, C-x C-babra a ibufferjanela, você pode ver algo como isto:

Exemplo 1

Mova o cursor para [ Dired ](com M-p, M-n) e pressione dpara marcar como excluir

exemplo2

depois pressione xpara executar.

Prefiro assim, porque não preciso pensar em como vincular minha chave à nova função, e meus buffers estão melhor organizados.

Rangi Lin
fonte
Os grupos de filtros não foram exibidos para mim quando iniciei ibufferapós avaliar seu código. Eu tive que bater / R(obrigado ibuffer-switch-to-saved-filter-groups) para obter os grupos.
itsjeyd
(ibuffer-switch-to-saved-filter-groups "Default")Você pode adicionar esta linha de código em ibuffer gancho, nome grupos de filtro deve ser mudado se não éDefault
Rangi Lin
1
Sim, foi o que acabei fazendo. Não sabia sobre grupos de filtro antes de ler a sua resposta, obrigado por mencioná-los;)
itsjeyd
10

Você tem muitos buffers Dired porque queria todos eles em um ponto? IOW, você queria criar cada um deles como buffers separados?

Caso contrário, a solução é simples: diga ao Dired para reutilizar um buffer Dired existente quando você pressionar RETum nome de diretório para abri-lo no Dired.

Aqui está como fazer isso:

  1. Carregar biblioteca Dired + ( dired+.el):

    (require 'dired+)
    
  2. Diga ao Dired para reutilizar os buffers Dired:

    (diredp-toggle-find-file-reuse-dir 1)
    

O efeito é que, quando você pressiona RET(ou clica com o mouse) em um diretório no Dired, find-alternate-fileé usado, portanto, o buffer Dired original é substituído (excluído) pelo novo.

Você pode alternar esse comportamento a qualquer momento, usando C-M-R(aka C-M-S-r) em Dired.

Desenhou
fonte
Esta é a solução que eu decidi agora. Eu nunca quis 20 buffers Dired abertos em primeiro lugar. Graças para sugerindo que (e criando-lo.)
nispio
Os links estão mortos, obtendo um 404: (
Zelphir Kaltstahl
1
@Zelphir: Obrigado pelo aviso. Deve estar bem agora. (Emacs Wiki mudou suas URLs em geral, de modo posts antigos como este tem links quebrados.)
de Drew
8

Algo assim (role um pouco)?

(defun kill-dired-buffers ()
     (interactive)
     (mapc (lambda (buffer) 
           (when (eq 'dired-mode (buffer-local-value 'major-mode buffer)) 
             (kill-buffer buffer))) 
         (buffer-list)))
nicael
fonte
5

Você também pode usar helm-mini:

  • Corra M-x helm-mini.
  • Digite no prompt: *Di(palavra parcial para Dired, não é necessário inserir mais). Conforme você digita, os buffers são reduzidos gradualmente. Agora, resta apenas o Diredbuffer. Pressione M-apara marcar tudo.
  • Pressione TABpara alternar para o menu de ação e pressione Kpara selecionar a ação Kill buffer(s).
  • Pressione RETpara executar a ação.

A coisa boa helm-minié que ele pode substituir o Emacs normal C-x b, para que você não precise usar duas ligações de teclas, uma para alternar o buffer e outra para um gerenciador de buffer real. helm-minié tudo em um. Leia mais no meu mini-guia de leme .

helm-minitambém pode conter buffer de correspondência difusa e permitir a abertura de vários buffers marcando com C-SPCou M-a(defina M ark a ll). Você também pode restringir para que o buffer contenha determinada sequência de caracteres anexando @antes de um padrão, por exemplo, @testsignifica selecionar apenas buffers que contenham a sequência "test".

Tu Do
fonte
1

Eu tentaria algo assim:

(require 'dash)

(defun my-kill-dired-buffers ()
  (interactive)
  (kill-some-buffers
   (-filter (lambda (buffer)
              (save-excursion
                (set-buffer buffer)
                (eq major-mode 'dired-mode)))
            (buffer-list))))
shosti
fonte
1
Eu acredito que -filterexige dash.eldo MELPA. Você provavelmente deve listar isso como um requisito.
Vamsi 24/09
1

O que você pode realmente procurar é uma maneira de limpar buffers indesejados automaticamente; nesse caso, você deve fazer check-out midnight.el, que faz parte do Emacs.

Mas de um modo geral, ibufferé muito fácil operar em buffers a granel, como sugeriu Francisco.

sanityinc
fonte
1

Se você usar Sincelos , poderá C-x kmatar todos os buffers Dired - ou todos os buffers em qualquer modo.

Após bater C-x k, use C-x M +para manter apenas os buffers com um determinado modo. Clique TABpara ver os modos e escolha dired-mode. Em seguida, use C-!para matar todos os buffers com esse modo.

C-x k C-x M + dired-mode C-!
Desenhou
fonte