Como tenho os buffers listados em uma janela de correção rápida no Vim?


13

Usando o editor vim, uma tarefa comum é procurar buffers. Agora eu uso comandos padrão como :lsou a :bnext. Na verdade, eu configurei no meu .vimrc:

"move amongs buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

Gostaria de procurar buffers como lista na janela do quickfix, da maneira simples (= excelente) que o plug-in MRU implementa.

Existe um plugin tão simples quanto o MRU, mas atuando em buffers?

OK, uma solução possível poderia ser usar o :CtrlpBufferscomando, parte do plugin Ctrlp, mas eu não sou um grande fã do Ctrlp, porque às vezes há beahviours estranhos que eu não entendo completamente (as seleções de modo difuso ...); então estou procurando algo realmente simples como o plugin MRU.

BTW, eu brinquei com o :cexpr {expr}comando, tentando preencher as janelas do quickfix com o conteúdo da :bufferslista, sem sucesso (talvez porque minha ignorância programação vimscripts)

Alguma sugestão ?


Você quis dizer em :bnextvez de :cnext?
23415 Tommcdo

Você precisa especificamente que seja a janela do quickfix ? Ou você quer apenas ver os buffers abertos em uma janela? (Porque existem vários plugins para fazer o último).
23615 Rich

Quero poder procurar buffers abertos em uma janela. Na verdade, o quickfix não é necessário
Giorgio Robino

@ tommcdo: sim desculpe, meus erros de costume. Quero dizer: bnext e eu atualizei a questão
Giorgio Robino

Respostas:


18

Você pode preencher a lista de correções rápidas com cada buffer como este:

:call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr": v:val}'))
  • setqflist()pega uma lista de itens do dicionário que descreve cada erro (nome do arquivo, número da linha, posição etc.). Nesse caso, estamos especificando um conjunto mínimo de informações: o número do buffer
  • map()pega uma lista e uma expressão (uma string) e retorna uma nova lista da expressão aplicada a cada item da lista de entrada. Aqui, estamos pegando uma lista de números de buffer listados e formatando-os para uso em setqflist()( '{"bufnr": v:val}', onde v:valé o valor do item na lista)
  • filter()filtra uma lista, removendo elementos que não atendem a uma determinada expressão. Aqui está a expressão buflisted(v:val), significando que o número do buffer existe e está listado, ou seja, aparece na :lssaída
  • range(a, b)gera uma lista de números de aparab
  • bufnr()retorna o número de um determinado nome de buffer. Se o argumento for '$', ele retornará o número mais alto do buffer

É muito para digitar, e não é muito memorável, então você pode envolvê-lo em um comando no seu vimrc:

command! Qbuffers call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr":v:val}'))

Agora você pode usar apenas :Qbufferspara preencher a lista de correções rápidas.


Se você deseja que isso seja atualizado automaticamente à medida que novos buffers são adicionados, você pode fazer algo assim:

autocmd BufAdd * Qbuffers

No entanto, eu não recomendaria isso, pois tornará a lista do quickfix bastante inutilizável para coisas como :makeou :grep.


1
obrigado pelas explicações, tommcdo. Qbuffers é lindo! Talvez eu adicione a: copen no final da sua chamada para abrir imediatamente a janela do quickfix e talvez seja útil relatar a posição do cursor. Eu tenho que estudar um pouco de vimscript :-)
Giorgio Robino

9

Você deve tentar este mapeamento:

nnoremap gb :ls<CR>:b<Space>

No prompt, digite o número do buffer desejado e pressione Enter.

gb


a pergunta onde listar buffers na janela quickfind.
VeXii 7/01/16

Sim, e minha resposta fornece uma alternativa leve.
romainl

1
OP afirma que ele conhece a lista de buffers, mas gostaria de tê-la na janela do quickfix. e sua solução é apenas usar a lista de buffer?
VeXii 7/01/16

1

Dê uma olhada no plug-in bufexplorer . Ele abre uma lista navegável de todos os buffers em uma barra lateral, semelhante ao plug-in MRU mencionado. Além disso, existem vários outros plugins no vim.org .

PS: Você fez a mesma pergunta no Stack Overflow ; não envie a pergunta idêntica a vários sites em paralelo!


tks Ingo, testei um pouco do bufexplorer e gostei. Eu postei aqui também porque um stackoverflow sugeriu fazer
Giorgio Robino

1
Sim, eu vi aquilo. Eu preferiria que você tivesse excluído a postagem original do SO ou, pelo menos, vinculada à postagem cruzada.
Ingo Karkat 23/02
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.