Como ir para o próximo resultado grep?


7

Estou usando greppara encontrar ocorrências de funções em um projeto.

:grep "set_val" *

Sai do vim e sai:

code.py:68:        self._device.set_val('Level', new_level)
code.py:84:        self._device.set_val("Mode", "Remote")
Press ENTER or type command to continue

Pressiono enter e estou na code.py:68qual é a primeira ocorrência.

Como passo para outras ocorrências?


11
que tal abrir a janela qf?
21716 Kent

Respostas:


21

:grep/ :vimgrepambos usam a lista de correções rápidas para armazenar locais. Como você notou, o vim passará automaticamente para a primeira ocorrência (use !para evitar esse comportamento). Basta usar :cnextpara ir para o próximo local na lista de correções rápidas.

Comandos Quickfix

  • :cnext/ :cpreviouspara navegar para a frente e para trás na correção rápida na lista de correções rápidas
  • :cfirst/ :clastpara ir para o início e o fim da lista de correções rápidas
  • Use :copenpara abrir a janela do quickfix. Use <cr>para pular para uma entrada
  • Use :cclosepara fechar a janela do quickfix
  • Use :ccpara exibir o erro atual.
  • :colder/ :cnewerpara pular listas de correções rápidas mais antigas / mais recentes

Eu recomendo que você crie mapeamentos para :cnexte :cprevious. Eu pessoalmente uso unimpaired.vim, que fornece ]q& [qmapeamentos para :cnexte :cprevious.

Se você deseja que a janela do quickfix seja aberta automaticamente, coloque o seguinte em vimrc:

augroup autoquickfix
    autocmd!
    autocmd QuickFixCmdPost [^l]* cwindow
    autocmd QuickFixCmdPost    l* lwindow
augroup END

Há um episódio do Vimcasts sobre este tópico: Pesquise vários arquivos com: vimgrep .

Pesquisa e substituição em todo o projeto

Se você estiver usando :grep/ :vimgrepcomo maneira de fazer uma pesquisa e substituir todo o projeto , sugiro que você use :cdo/ :cfdo(no Vim 7.4.980+).

:grep 'foo'
:cfdo %s/foo/bar/g|w

Se sua versão do Vim não possui :cdo/ :cfdocoloca os seguintes comandos em seu vimrcarquivo para fornecer :Cdo/ :Cfdocomandos alternativos.

if !exists(':cdo')
  command! -nargs=1 -complete=command Cdo try | sil cfirst |
        \ while 1 | exec <q-args> | sil cn | endwhile |
      \ catch /^Vim\%((\a\+)\)\=:E\%(553\|42\):/ |
      \ endtry

  command! -nargs=1 -complete=command Cfdo try | sil cfirst |
        \ while 1 | exec <q-args> | sil cnf | endwhile |
      \ catch /^Vim\%((\a\+)\)\=:E\%(553\|42\):/ |
      \ endtry
endif

Usando um programa alternativo para :grep

Às vezes, grepnão é bom o suficiente para suas necessidades de pesquisa. Você pode alterar seu :grepprograma através da 'grepprg'configuração (também pode ser necessário alterar 'grepformat'). Pessoalmente, uso o ripgrep adicionando o seguinte ao meu vimrcarquivo, conforme instruído na rgpágina do manual:

set grepprg=rg\ --vimgrep
set grepformat^=%f:%l:%c:%m

Nota: Pode querer usar -Ssinalizador, por exemplo set grepprg=rg\ -S\ --vimgrep, para usar a pesquisa "caso inteligente" (pesquisa sem distinção entre maiúsculas e minúsculas quando todas as letras minúsculas).

Agora :grepusará rgpara pesquisar. por exemplo :grep foo -t js.

Aqui estão alguns programas grep alternativos para examinar: ack , ag , ripgrep e git grep( Fugitive.vim fornece :Ggrepwrapper)

Para obter mais ajuda, consulte:

:h :grep
:h 'grepprg'
:h quickfix
:h :cnext
:h :copen
:h :ccl
:h :cc
:h :colder
:h :cdo
:h :cfdo

Obrigado pela ótima resposta. Seu código para abrir automaticamente a janela do quickfix funciona, mas para mim ele é aberto e preciso usar os comandos para pular para ele (ctr + w e seta para baixo). Posso adicionar uma linha para pular automaticamente o cursor para a janela do quickfix depois que ele é aberto automaticamente? Obrigado. -Asaf
Asaf

Usar :cwindow/ :copendentro do QuickFixCmdPostevento autocmd restaurará o buffer atual após o disparo. Você pode adicionar :wincmd bou qualquer comando da janela que desejar autocmd, mas a janela será restaurada. Isso é mencionado em :h autocmd-use. Se você pensar sobre esse comportamento, faz sentido, pois você pode ter vários autocmd anexados a um evento, todos com certas suposições, como o buffer atual. Eu imagino que a maneira de forçar o problema seria agrupar isso no seu comando quickfix. por exemplo:command! Grep -nargs=+ grep <args> | cwindow
Peter Rincker
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.