Uma coisa que costumo fazer (mas confio na linha de comando) é pesquisar / fazer grepping em vários arquivos.
Existe uma maneira de exibir resultados de pesquisa para todos os buffers abertos?
Idealmente, eu gostaria de ter um novo buffer dividido contendo a localização e o fragmento do resultado, da mesma forma que o grep
faz. Por exemplo ( /statistics
):
models/statistics.php: /*! \file statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();
Como bônus, eu gostaria de poder pesquisar o termo sob o cursor, como gd
faz.
search
multiple-files
Roflo
fonte
fonte
Respostas:
Você pode usar
:vimgrep /pattern/ {files}
para preencher a lista de correções rápidas com padrões correspondentes. O problema é que a:vimgrep
opção de arquivos não permite diretamente buffers. Você pode usar:Outra opção é escrever um script que gere uma lista de arquivos
:buffers
. Por este post do SO, com uma pequena revisão, obtemos:Agora você pode ligar
:GrepBufs <expression>
e obter a:vimgrep
saída padrão, mas usando os buffers.Atualizar Se você gostaria de chamar
GrepBuffers
usando o valor abaixo do cursor, adicione este novo mapeamento.Quando você está no tipo de modo normal
<leader>z
e você vai:vimgrep
a palavra cursor sobre seus buffers abertos.fonte
command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' ')
. Uso::Bufgrep/foo/
Pesquisando apenas buffers abertos é bom, mas pode chegar um momento em que você deseja pesquisar em um projeto inteiro. Pode ser mais rápido e fácil do que você pensa!
Pesquisando em um Projeto
grep
é a ferramenta de pesquisa padrão do Unix. Vale mencionar devido à sua onipresença. Já integrado ao Vim via:grep
comando. por exemplo:grep -r 'foo'
. Veja:h :grep
.--perl
. Para integração ao Vim, consulte Ack.vimgit grep
pesquisa um repositório muito rapidamente. O Fugitive.vim fornece:Ggrep
.git grep
. Pode ser usado:grep
também.Eu recomendo o ripgrep, o Ag e
git grep
como são todos super rápidos. Pesquisei mais de 4700+ em menos de um segundo. É muito difícil vencer o ripgrep.Para testar uma dessas alternativas sem um plug-in ou você simplesmente não deseja um plug-in, defina sua
'grepprg'
opção de acordo. por exemploset grepprg=ag\ --vimgrep
ouset grepprg=rg\ --vimgrep
. Veja:h 'grepprg'
e:h 'grepformat'
para mais informações. Agora você pode pesquisar por:grep
. por exemplo:grep 'foo'
.Como substituto final, você pode usar
:vimgrep
, pois está disponível em todos os sistemas que o Vim está disponível. Veja:h :vimg
para mais ajuda.Lista do QuickFix
Como a maioria dessas opções usa a lista de correções rápidas, sugiro que você use alguns mapeamentos mais amigáveis para atravessar a lista de correções rápidas. Eu uso o plugin intacto de Tim Pope, que usa
]q
e[q
para:cnext
e:cprev
respectivamente. Algumas pessoas gostam da quickfix para abrir depois de uma pesquisa é realizada em seguida, adicione o seguinte ao seu~/.vimrc
arquivo:autocmd QuickFixCmdPost *grep* cwindow
. Você também pode abrir manualmente a lista do QuickFix via:copen
.Deseja "pesquisas" ainda mais rápidas?
Você precisará usar alguma ferramenta que use índices pré- criados como ctags , cscope ou GNU global .
:tag
,<c-]>
e muitos outros comandos e opções. Veja:h tags
. Também pode querer ler Ctags sem esforço com Git ou procurar no plugin Gutentags:cscope
comando. Vejo:h cscope
Mais ajuda
Eu começaria com este belo episódio do Vimcast : pesquise vários arquivos com
:vimgrep
.Para obter mais ajuda do Vim, consulte a documentação:
fonte
Meu plug-in GrepCommands define variantes do
:vimgrep
comando interno que têm como alvo todos os argumentos, buffers listados, janelas na página de guias atual ou todas as páginas de guias para sua pesquisa. Basicamente, uma implementação robusta de plug-in da resposta do @ jecxjo.fonte
Comandos
:bufdo
e:vimgrepadd
Esta resposta é baseada em /programming//a/11976158/1057593 .
No entanto, eu queria adicionar alguns bits. Novamente, o comando básico é
Se sua lista de correções rápidas não estiver vazia, você provavelmente deseja desmarcá-la primeiro (consulte /programming//q/27385970/1057593 ). Isso pode ser feito com
O vim-unimpaired fornece os mapeamentos
]q
e[q
percorre as correspondências.cmdline-history
É um bom fluxo de trabalho para inserir o padrão de pesquisa separadamente
/pattern
. Isso permite que você use um comando genérico do histórico da linha de comando usando o padrão de pesquisa atual. Isso pareceriaUma nova pesquisa típica de amplo buffer seria
Adicionei os seguintes mapeamentos ao meu vimrc para usar
<C-N>
e em<C-P>
vez das teclas de setaPara pesquisar o histórico de comandos
q:
, use e , em seguida,/bufdo<CR>
chame um comando com<CR>
. Para mais detalhes, consulte https://vim.fandom.com/wiki/Using_command-line_history e as páginas de ajuda:h history
e:h cmdline-window
.Você pode adicionar ao comando reutilizável
:copen
para ver imediatamente a lista de correções rápidas da seguinte maneira:A proposta do stackoverflow
:bufdo vimgrepadd // % | copen
abriu várias janelas não intencionais no meu caso.fonte