Como fecho um único buffer (dentre muitos) no Vim?

445

Abro vários arquivos no Vim, por exemplo, executando

vim a/*.php

que abre 23 arquivos.

Em seguida, faço a minha edição e corro o seguinte duas vezes

:q

que fecha todos os meus buffers.

Como você pode fechar apenas um buffer no Vim?

Léo Léopold Hertz 준영
fonte
9
Observe que você pode abrir os arquivos em janelas separadas do Vim usando vim -o a/*.php(ou -Opara usar janelas verticais) e evitar a navegação no buffer - este é um ótimo método para apenas alguns arquivos, mas com 23 arquivos, eles terão apenas algumas linhas / colunas cada.
Cascabel
1
@ Jeffefi: Obrigado por apontar isso! Eu nunca usei a opção -o antes.
Léo Léopold Hertz
Sobre o assunto de janela se divide. Se você já está no Vim e deseja abrir outro arquivo em uma divisão: esp para horizontal: evsp para vertical.
Lanzafame

Respostas:

558

Uma palavra de cautela: "o w em bw não significa gravação, mas wipeout!"

Mais dos manuais:

: bd

Descarregue o buffer [N] (padrão: buffer atual) e exclua-o da lista de buffers. Se o buffer foi alterado, isso falhará, a menos que [!] Seja especificado; nesse caso, as alterações serão perdidas. O arquivo permanece inalterado.

Se você sabe o que está fazendo, também pode usar: bw

: bw

Como |: bdelete |, mas realmente exclua o buffer.

hhh
fonte
4
Também a possibilidade de fazer ': M, Nbd' para fechar os números de buffer M para N. Ou ': bd N1 N2 ...' onde N # é um número de buffer
bloqueado pela neve
61
O manual diz para usar apenas :bwse "você sabe o que está fazendo", o que eu não sei, então acho que vou usar :bd.
jberryman
1
Fiquei confuso com isso no começo - eu estava abrindo uma nova guia para fechar os buffers ... mas fechar o buffer na guia (usando uma linha reta :bd) também fecha a guia. O que você provavelmente quer é :bd n .. [m]ou :n,mbdpara números específicos ou intervalo de números para fechar, o que você pode fazer sem olhar para os buffers
JonnyRaa
5
wé abreviação de writecomando, de acordo com o manual do Vim, além disso, não há menção a qualquer "limpeza". A descrição do comando ( help write) começa com "Grave o buffer inteiro no arquivo atual".
amn
3
@ amn Também fiquei confuso, mas ele quis dizer que wo bwcomando significa apagamento, ele não está falando sobre o wcomando. Ele colocou este aviso lá para que as pessoas não acho que o bwcomando significava gravação tampão (o que não significa tampão wipeout.)
John
351

Se isso não for tornado óbvio pelas respostas anteriores:

: bd fechará o buffer atual. Se você não quiser pegar a lista de buffers.

RedBlueThing
fonte
4
Antes de encontrar: bd, nunca fazia sentido para mim que as pessoas não tivessem problemas ao fazer:: ls -> procurar número de documento -> descarregar buffer por número. As pessoas realmente acham isso eficaz?
Svend
3
@svend para uma variedade de buffers, com certeza, mas para um único a: bd é provavelmente mais eficaz.
Pharaun
10
:bdsomente fecha o buffer enquanto (o que isso significa) enquanto :bwtambém limpa todas as variáveis ​​e REALMENTE o elimina do lsbuffer.
RedX
1
a resposta do hhh abaixo é mais detalhada…
103

Verifique seu ID de buffer usando: buffers

você verá uma lista de buffers como

1  a.php
2  b.php
3  c.php

se você deseja remover o b.php do buffer

:2bw

se você deseja remover / fechar todos os buffers

:1,3bw
nightingale2k1
fonte
4
Você também pode limpar todos os buffers com:% bw
cdleonard
7
atalho para verificar o ID do buffer: 2 CTRL-G
snowbound 08/04
43

Em vez de procurar a saída do comando: ls e excluir (descarregar, limpar ..) um buffer especificando seu número, acho que o uso de nomes de arquivo geralmente é mais eficaz.

Por exemplo, depois que abri um arquivo .txt para atualizar minhas lembranças de algum ponto importante ... copie e cole algumas linhas de texto para usar como um modelo das sortes ... etc. Eu digitaria o seguinte:

:bd txt <Tab>

Observe que a sequência correspondente não precisa estar no início do nome do arquivo.

A tabela acima exibe a lista de nomes de arquivos que correspondem a 'txt' na parte inferior da tela e mantém o comando: bd que eu digitei inicialmente intacto, pronto para ser concluído.

Aqui está um exemplo:

doc1.txt doc2.txt
:bd txt 

Eu poderia retroceder sobre o bit 'txt' e digitar o nome do arquivo que desejo excluir, mas onde isso se torna realmente conveniente é que não preciso: se eu pressionar a tecla Tab pela segunda vez, o Vim concluirá automaticamente meu comando com a primeira partida:

:bd doc1.txt

Se eu quiser me livrar desse buffer em particular, só preciso pressionar Enter.

E se o buffer que eu quero excluir for a segunda (terceira .. etc.) correspondência, só preciso continuar pressionando a tecla Tab para fazer o meu comando: bd percorrer a lista de correspondências.

Naturalmente, esse método também pode ser usado para alternar para um determinado buffer por meio de comandos como: b ..: sb .. etc.

Essa abordagem é particularmente útil quando a opção 'oculta' do Vim é definida, porque a lista de buffers pode rapidamente se tornar bastante grande, cobrindo várias telas e dificultando a localização do buffer específico que estou procurando.

Para aproveitar ao máximo esse recurso, provavelmente é melhor ler o arquivo de ajuda do Vim a seguir e ajustar o comportamento da conclusão da linha de comando da Tab de acordo para que melhor se adapte ao seu fluxo de trabalho:

:help wildmode

O comportamento que descrevi acima resulta da seguinte configuração, que escolhi por razões de consistência para emular a conclusão do bash:

:set wildmode=list:longest,full

Ao contrário de usar números de buffer, o mérito dessa abordagem é que eu me lembro de pelo menos parte de um determinado nome de arquivo, permitindo-me direcionar o buffer diretamente, em vez de precisar primeiro procurar seu número através do comando: ls.

guv '
fonte
40

Usar:

  • :ls - para listar buffers
  • :bd#n- para fechar o buffer em que #n é o número do buffer (use lspara obtê-lo)

Exemplos:

  • para excluir o buffer 2:

    :bd2
    
Shaun
fonte
16

Você também pode mapear as teclas de função próxima e anterior, facilitando a alternância entre os buffers

map <F2> :bprevious<CR>
map <F3> :bnext<CR>

do meu vimrc

Ravi
fonte
2

E se

vim -O a a

Dessa forma, você pode editar um único arquivo à sua esquerda e navegar por todo o diretório à sua direita ... Apenas um pensamento, não a solução ...

Santi
fonte
2

[EDIT: essa foi uma sugestão estúpida de uma época em que eu não conhecia o Vim o suficiente. Por favor, não use guias em vez de buffers; guias são os "layouts de janela" do Vim]

Talvez mude para o uso de guias?

vim -p a/*.php abre os mesmos arquivos em guias

gt e gT alterne as guias

:q fecha apenas a guia atual

:qa fecha tudo e sai

:tabo fecha tudo, exceto a guia atual

Leonid Shevtsov
fonte
2
Por que você diz que usar guias é uma sugestão estúpida? Só pergunto porque uso abas o tempo todo ...: ^ /
Nate
2
@Nate: Eu decidi elaborar sobre isso leonid.shevtsov.me/en/…
Leonid Shevtsov
1
Esse foi um ótimo post - ele me inspirou a aprofundar ainda mais - você já viu wildmenu? É semelhante ao lustyjuggler (embora mais simples), mas está embutido (o que foi bom para mim, porque o lustyjuggler precisa +rubye o vim padrão para navios ubuntu oníricos -ruby).
Nate
@ Nate: sim, eu estou usando o wildmenu para abrir arquivos, mas quando você tem muitos arquivos no projeto, ele simplesmente não aumenta. Além disso, o vim-noxpacote do Ubuntu tem suporte a Ruby.
Leonid Shevtsov
1

Aqueles que usam um plug-in de navegação em buffer ou em árvore, como Buffergator ou NERDTree, precisarão alternar essas divisões antes de destruir o buffer atual - caso contrário, você enviará suas divisões para wonkyville

Eu uso:

"" Buffer Navigation                                                                                                                                                                                        
" Toggle left sidebar: NERDTree and BufferGator                                                                                                                                                             
fu! UiToggle()                                                                                                                                                                                              
  let b = bufnr("%")                                                                                                                                                                                        
  execute "NERDTreeToggle | BuffergatorToggle"                                                                                                                                                              
  execute ( bufwinnr(b) . "wincmd w" )                                                                                                                                                                      
  execute ":set number!"                                                                                                                                                                                    
endf                                                                                                                                                                                                        
map  <silent> <Leader>w  <esc>:call UiToggle()<cr>   

Onde " NERDTreeToggle" nessa lista é o mesmo que digitar :NERDTreeToggle. Você pode modificar esta função para integrar com sua própria configuração.

New Alexandria
fonte
para isso, o plugin bbye é perfeito, preservando o layout da janela ao usar :bdeleteou :bwipeout. Veja minha resposta .
Wolfson
0

Feche o buffer sem fechar a janela

Se você deseja fechar um buffer sem destruir o layout da janela (layout atual com base em divisões), você pode usar um plug-in como bbye . Com base nisso, você pode simplesmente usar

:Bdelete (instead of :bdelete)
:Bwipeout (instead of :bwipeout)

Ou simplesmente crie um mapeamento .vimrcpara facilitar o acesso, como

:nnoremap <Leader>q :Bdelete<CR>

Vantagem sobre o vim's: bdelete e: bwipeout

Na documentação do plugin :

  • Feche e remova o buffer.
  • Mostrar outro arquivo nessa janela.
  • Mostre um arquivo vazio se você não tiver outros arquivos abertos.
  • Não deixe buffers inúteis [sem arquivo] se você decidir editar outro arquivo nessa janela.
  • Funciona mesmo se um arquivo estiver aberto em várias janelas.
  • Trabalhe bem com vários exploradores de buffer e barras de tabulação.

: bdelete vs: bwipeout

Na documentação do plugin :

O Vim possui dois comandos para fechar um buffer: :bdeletee :bwipeout. O primeiro remove o arquivo da lista de buffers, limpa suas opções, variáveis ​​e mapeamentos. No entanto, ele permanece no jumplist, então Ctrl-ovocê volta e reabre o arquivo. Se não é isso que você deseja, use :bwipeoutou o equivalente do Bbye :Bwipeoutonde você teria usado :bdelete.

Wolfson
fonte