Vim: How to go to the declaration (of a class, method, function, variable, etc)
You can try gd
, it goes to local declaration, for more powerful 'go to definition', you might want to try tags
as Ingo suggested.
Setting up tags is not so difficult, though (as most things in Vim) it's not as automatic compared to IDEs.
- First, you need the
ctags
tool. The most common today is Exuberant Ctags, found at ctags.sourceforge.net. - Next, you need to create a tags database (a file names
tags
) for all the files in your project(s). This is usually done by runningctags -R .
from your project root (also from within Vim via:!ctags ...
). Exuberant Ctags support 41 languages, and you can even extend it via regular expressions. - Finally, Vim needs to be configured to pick up the tags database. With
:set tags=./tags;
, it will search in the file's directory upwards to the root directory. If you have certain global include directories, you can add those. - With that, you can start using Vim's tag functionality like
<C-]>
and:tag
.
You need to periodically update the tags database; there are plugins (like easytags.vim) that can do that automatically for you.
I use the you complete me (ycm) plugin for this, which is
a fast, as-you-type, fuzzy-search code completion engine for Vim
It works with a bunch of languages and is very powerful. Check this section for how to install it on your system.
When e.g. using it with a Java Maven project, open the desired file from the folder that contains your pom.xml
file and the plugin scans all your files and dependencies.
I do have the following key mappings in my ~/.vimrc
for convenient use of your requested feature:
let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
let g:SuperTabDefaultCompletionType = '<C-n>'
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>
nnoremap <leader>ji :YcmCompleter GoToImplementation<CR>
nnoremap <leader>jr :YcmCompleter GoToReferences<CR>
Assuming your <leader>
is mapped to ,
with let mapleader = ","
as in my case the following commands work:
,jd
go to definition or declaration,ji
go to implementation,jr
go to referencesCtrl+n
/Ctrl+p
move down/up in a list that pops up for autocompletion