As tags exuberantes são a maneira mais simples de conseguir isso. No GNU / Linux (por exemplo, Ubuntu ou Debian), você deve ser capaz de fazer
sudo apt-get install exuberant-ctags
(Para OSX, "$ brew install ctags" deve ser suficiente; para Windows, visite http://ctags.sourceforge.net/ e faça o download do executável independente)
Em seguida, navegue até a pasta raiz do seu projeto e execute
ctags -R --exclude=.git .
Isso varrerá todo o seu projeto e criará um arquivo ./tags que o vim usará automaticamente para fornecer a capacidade de ir para as funções pressionando uma tecla. Nomeadamente:
Ctrl + ]
com o cursor colocado na função para a qual você deseja ver a implementação. Existem outras combinações e muitas funções no modo de comando que permitem que você navegue pelo código também com ctags (por exemplo, Ctrl+ tpara pular para a entrada mais antiga da pilha de tags). Veja :help 29.1
para uma visão geral.
Observe que você deve executar novamente as ctags para cada alteração significativa no código e permitir que ele re-indexe seu projeto. Você pode fazer isso manualmente ou ensinar o vim a fazê-lo na tecla de atalho ou na gravação.
Dica: se você fizer uso extensivo de ctags, talvez o plug-in vim-taglist ( http://vim-taglist.sourceforge.net ) também valha uma olhada. Ele fornece um esboço no estilo IDE com uma lista de todas as funções para essa classe / arquivo.
Até agora, posso citar duas soluções para o problema de encontrar a declaração ou a definição de uma função. Sei que há outra solução bem conhecida baseada em tags, mas como não a uso, deixarei que outras pessoas a ofereçam.
O mais moderno primeiro: YouCompleteMe tem um
:GoToDefinition
e um:GoToDeclaration
par de comandos.O que eu uso (é difícil mudar hábitos de 10 anos). Meu plugin lh-tags tem uma maneira de gerar um banco de dados ctags e atualizá-lo de forma incremental. E também oferece uma maneira (
CTRL+W Meta+Down
) de apresentar todas as declarações e definições que correspondem ao que está sob o cursor (/ o que está selecionado). Como essa solução depende de ctags, não será possível saber qual sobrecarga o identificador sob o cursor também está realmente relacionado. Outras soluções baseadas em ctags devem ser ruins (/ boas) neste tópico. No entanto, o YCM deve ser muito melhor aqui.Discl .: Eu implementei lh-tags como uma alternativa mais ergonômica para
:tselect
.(Na verdade, lembro-me de uma terceira solução: eu havia iniciado um fork do clang-indexer e o plugin vim relacionado que o teria encapsulado. Mas com o YCM por perto, eu esqueci essa solução)
EDIT: A partir de 2019, a solução mais eficiente conta com servidores LSP . Estou usando COC + ccls para indexar, pular e fazer muitas outras coisas. Estou voltando às soluções baseadas em tags quando tenho preguiça de configurar o COC para um projeto no qual não vou gastar muito tempo ou onde não consigo instalar versões recentes de clang e ccls.
fonte
GoToDeclaration
funciona com vários arquivos de origem. Aqui está uma citação dos documentos sobreGoToDefinition
:For C-family languages this only works ... when the definition of the symbol is in the current translation unit.
. Além disso, os comandos são:YcmCompleter GoTo*
.Existem poucas alternativas. O primeiro é
ctags
. Se você precisar de um indexador mais avançado,cscope
é uma alternativa melhor. Por exemplo, ele permitirá que você liste todos os chamadores de determinada função. Essas ferramentas indexarão seu código sem realmente entendê-lo corretamente (elas possuem uma definição gramatical simples para saber o que significa um símbolo). Também é relativamente fácil estender essa gramática. Otaglist
plug-in é essencial para eles e é possível estender a gramática do indexador para mostrar resultados na lista de tags.Se você precisar de algo mais do que indexador, como a verificação de sintaxe,
YouCompleteMe
provavelmente é o caminho a percorrer. Ele é construído em cima dollvm
e, portanto, possui um analisador adequado. Isso permite verificar a sintaxe e a semântica do código .Então, se você trabalha com um código que possui uma linguagem específica de domínio ou código incorporado, geralmente acaba passando por arquivos. Alternativa é o
Ack
script perl que tenta ajudar com esta tarefa.fonte
Eu acho que ctags é o que você precisa. O Vim é integrado com ctags nativamente e pode pular facilmente para definições e declarações de funções.
Dê uma olhada neste artigo http://andrew.stwrt.ca/posts/vim-ctags
fonte