Como pular para uma chamada de função?

14

Depois de gerar um arquivo de tags com exuberant-ctags eu posso pular de uma chamada de função para sua declaração com a <C-]>qual é bastante conveniente.

Minha pergunta é como fazê-lo de outra maneira? Quando meu cursor está na definição de uma função, como posso ir para as linhas em que a função é chamada?

Quando olho para o arquivo gerado por ctags, vejo apenas informações relacionadas à localização da definição e não das chamadas, isso significa que não posso fazer isso, que o Vim é uma solução inteligente ou que preciso usar algo mais do que exuberant-ctags?

statox
fonte
Ack ou Ag também funcionará e você pode encontrar wrappers de plug-in para essas ferramentas de linha de comando com bastante facilidade. Por exemplo, github.com/mileszs/ack.vim e github.com/rking/ag.vim
dash-tom-bang

Respostas:

11

Você não pode pular para chamadas de função com ctags. Para C / C ++ e Java existe cscope, e ele se integra perfeitamente ao Vim (consulte :help cscope). Para outros idiomas, você poderá encontrar uma ferramenta que gere / exporte cscopebancos de dados compatíveis (fi hscopepara Haskell e starscopeRuby, Go e JavaScript). Você também pode usar cscopecom bancos de dados globais GNU , apontandocscopeprg para gtags-cscope.

Em uma nota lateral: se você não se incomoda com o uso ocasional do Engrish ,;) provavelmente também deseja usar tags universais em vez de exuberant-ctags. O último não é atualizado há anos. O primeiro é um garfo mantido ativamente.

Sato Katsura
fonte
O cscope suporta outras linguagens além de C / C ++ e Java?
edi9999
O cscopepróprio @ edi9999 suporta C / C ++, Lex e Yacc. O suporte para Java é marginalmente útil. Você pode obter suporte para PHP e JavaScript (à moda antiga) do GNU global, através do gtags-cscopeutilitário. E, como eu disse acima, existem outros indexadores que podem exportar cscopebancos de dados compatíveis.
Sato Katsura
8

Você não pode fazer isso com ctags.

Tente uma alternativa mais robusta, como cscope (que até possui sua própria seção de ajuda :):help cscope ou global .

romainl
fonte
O cscope suporta outras linguagens além de C / C ++ e Java?
edi9999
Sim, pelo menos PHP e JavaScript.
Romainl
1
@romainl Não, cscopeele não suporta PHP nem JavaScript. No entanto, você pode indexar arquivos PHP e JavaScript com o GNU globale executar gtags-cscopepara usar o gtagsarquivo resultante cscope.
Sato Katsura
@SatoKatsura, sim, o cscope suporta JavaScript (e CSS, aparentemente).
Romainl
2
@romainl Você deve considerar cscopeas fontes de dados em vez de especular com base em experiências rápidas. cscopepossui um analisador C bastante relaxado. É tudo o que tem e tudo o que faz. Com esse analisador, ele "suporta" muitos idiomas, para valores adequados de "suporte". As construções são reconhecidas desde que pareçam mais ou menos com C. É por isso que as classes Java e as construções PHP mais recentes não são reconhecidas. Compare fi com o starscope , que na verdade permite adicionar novos idiomas.
Sato Katsura
8

Você pode usar o comando grep do Vim para pesquisar todos os arquivos em seu projeto:

:grep! "\<<cword>\>" . -r
:copen

Vamos colocar isso em um keybind:

nnoremap <F4> :grep! "\<<cword>\>" . -r<CR>:copen<CR>

Acho esta pesquisa de uma chave em todo o projeto inestimável quando estou explorando uma grande base de código desconhecida.

\<e \>são sequências regexp que indicam o início e o fim de uma palavra, para que você não obtenha correspondências parciais. (O-w opção para grep pode ser outra maneira de conseguir isso.)

No entanto, essa é uma pesquisa não inteligente , para que possa produzir falsos positivos se a mesma palavra aparecer em contextos não relacionados.


Na verdade, eu uso minha própria versão modificada do plug-in grep.vim . Isso é um pouco mais amigável de usar:

  • Ele permite editar o padrão de pesquisa e também a linha de comando grep (para que você possa direcionar pastas específicas, como em src/ lib/vez de. ) e lembra as alterações.
  • Eu adicionei suporte para o csearch do Google . Isso pode ser muito mais rápido que o grep, pois cria um índice de palavras em vez de verificar cada arquivo todas as vezes. Notavelmente, o csearch usa um padrão regexp ligeiramente diferente, portanto \bdeve ser usado em vez de \<e \>.

Eu o configuro e excluo alguns arquivos padrão como este .

Para acesso rápido, crio dois atalhos de teclado . F3permite editar a linha de comando, F4usa a linha de comando configurada anteriormente sem nenhum pressionamento de tecla extra. O mecanismo é muito feio e pode usar alguma limpeza, mas me serviu bem.

joeytwiddle
fonte