Como você pode listar as correspondências da pesquisa do Vim?

101

Eu gostaria de listar as correspondências, quando atingir:

/example

para que eu veja onde todas as correspondências estão ao mesmo tempo.

Léo Léopold Hertz 준영
fonte

Respostas:

3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps
Yordan Georgiev
fonte
1
Gosto muito das suas ideias F5-F8. Seria bom ter algumas visualizações / saídas desses comandos aqui. Como o F8 foi projetado para funcionar? Ele procura apenas o diretório atual? - - A omissão de um dir é um costume - - por quê node_modules? - - Como as expressões regulares de perl mudam o funcionamento padrão do Vim? - - O seguinte é como eu projetei minha pesquisa de arquivos .tex askubuntu.com/a/789769/25388 Seria bom aprender com você como melhorá-la. Não é tão intuitivo, então muitas vezes também me esqueci da lógica.
Léo Léopold Hertz 준영
node_modules é o diretório que contém muitos códigos js dos módulos npm se você desenvolver front-ends ... é apenas um exemplo ...
Yordan Georgiev
1
faça um backup de você .vimrc e adicione essas configurações, carregue-as com: so% e tente executar as "ajudas" nos comandos ... vim é difícil - você teria que repetir isso milhares de vezes, mas uma vez dominá-los, você vai rir de @todo mundo que apontar seus novos recursos de IDE de interface do usuário ...
Yordan Georgiev
226
:g//p

Em sua forma mais longa:

:global/regular-expression/print

Você pode omitir o padrão / regex e o Vim reutilizará o termo de pesquisa anterior.

Curiosidades: A ferramenta grep foi nomeada após esta sequência de comando.

muito php
fonte
18
:g//- como p (rint) é a ação padrão, você também pode deixar isso de fora.
dekeguard
6
:g/é ainda mais curto!
Sparhawk
2
É possível ver o contexto aqui, como no grep --context 9?
Vitaly Zdanevich,
@VitalyZdanevich Try :%s/regular-expression//gn It produzirá algo nesse sentido:X matches on Y lines
Alexej Magura
@AlexejMagura Quero dizer - como ver algumas linhas antes e depois da string?
Vitaly Zdanevich
50

Você também pode fazer:

g/pattern/#

isso imprimirá o padrão que você deseja e o número da linha.

Taurus Olson
fonte
2
Agradável. Mas se você já tiver números de linha habilitados, então #não é necessário. Ele mostra os números das linhas por padrão
Pavan Manjunath
44

se você quiser olhar para esta lista e pular rapidamente entre as correspondências, considere usar

:vimgrep example %

ou

:grep example %

Isso irá preencher a "lista de erros" com todas as correspondências para que você possa :copenlistá-las todas no buffer de correção rápida, pressione Enter em uma linha específica para pular para aquela correspondência ou use comandos como :cne :cppara ir e voltar.

para uma explicação completa, veja minha resposta a uma pergunta semelhante

Paul Ivanov
fonte
Isto dá E499: Empty file name for '%' or '#', only works with ":p:h"em MacVim 8.1
Lincoln Bergeson
35

Acabei de aprender um novo: o Location List!
Digite :lvim foo %para pesquisar foono arquivo atual e entrar todos os jogos que contêm foona lista de locais .
Digite :lopenpara abrir a lista de locais na janela de correção rápida, que é totalmente navegável como de costume.
Use :lnext/ :lpreviouspara através da lista (use mapeamentos tpope / intactos para a melhor experiência)

freeo
fonte
2
Boa dica! isso me levou a fazer este mapeamento que expande automaticamente a palavra sob o cursor e lopen em uma varredura: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen
16

Outra possibilidade é usar os comandos de pesquisa de arquivo de inclusão.

[I

Isso listará todas as ocorrências da palavra sob o cursor. No entanto, pode ser mais do que você precisa, porque também pesquisará todos os arquivos incluídos no arquivo atual.

Mas o bom desse comando é que a exibição do resultado da pesquisa também mostra uma contagem do número de correspondências, além do número da linha de cada correspondência.

:help include-search

para ver muitas variantes.

Uma nota sobre

:g//p

Isso pode ser reduzido ainda mais para

:g//

porque, como outros disseram, p (rint) é a ação padrão.

dekeguard
fonte
É possível obter resultado [Icom contexto, como no grep --context 9?
Vitaly Zdanevich de
10

você pode obter uma bela quickfixjanela com as correspondências do seu padrão de pesquisa atual

:vim // %
:copen

muito útil se você já criou um padrão de pesquisa complexo usando apenas /pattern

Editar : acabei de descobrir que isso também funciona para todos os buffers abertos

:bufdo vimgrepadd // %
:copen
user1859022
fonte
10

Usar :set hlsearchirá destacar todas as correspondências em amarelo, permitindo que você verifique o arquivo facilmente em busca de correspondências. No entanto, pode não ser o que você deseja, após pesquisar: g // p fornecerá as correspondências listadas

Kevin
fonte
2
Deve ser ': set hlsearch' não ': hlsearch'.
muito php
É útil também mapear :nohlpara limpar os destaques quando você não precisar mais deles.
Kos,
9

Para elaborar sobre isso ... em vez de

/example
:g//p

você também pode escrever diretamente

:g/example/p

ou, como p (rint) é a ação padrão para o comando: g (lobal), isso pode ser encurtado para

:g/example

E em vez de p (rint), outras ações são possíveis, por exemplo, d (elete). Veja: ajuda: global

user55400
fonte
6
g/pattern

Em caso afirmativo :set number, o comando acima também exibe os números das linhas.

Se você não tem :set number, então

g/pattern/#

exibirá os números das linhas.

Sagar Jain
fonte
0

Eu escrevi um pedaço de código para isso. Na verdade, evita problemas em vimgrep. Funciona mesmo com arquivos sem nome. E é mais fácil de usar.

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

Quando você chama com um padrão, ele abre as janelas de localização com todas as correspondências.

Isso poderia ser um comando

command! -nargs=1 Mat call Matches(<f-args>)

Então, tudo que você precisa fazer é digitar :Mat pattern

Eu também uso o seguinte mapeamento para obter as correspondências da seleção visual atual.

vnoremap Y "xy:call Matches(@x)<CR>
user2679290
fonte
-1

Ctrl-f para listar todos os resultados da pesquisa:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
Fisher
fonte