Vim tags support
Vim autocompletion is great (:help ins-completion
), line and path
completions are among my favourite. Vim also supports tags completion (CTRL-x
CTRL-]
), to jump to symbols definition (for example a class, method or
function definition).
However, it needs a ctags file defined for it to work.
Set up tags
I heavily inspired myself on Tim Pope's explanations.
This way, the tags are updated after every checkout, rebase, commit and merge. However, one of these Git manipulations is needed to update the tags. If a new symbol (method/class/property/...) is created, it will only be added in the tags at the next Git command.
A solution to that is to also generate them when Vim saves a file.
First, move the ctags
file from the Git templates directory to a directory
listed in $PATH
(and renamed, to not shadow the needed original
ctags
program) to be globally accessible:
sudo mv ~/.git_template/hooks/ctags /usr/local/bin/ctags-gen
Then, make sure that the script does not do anything in case it is called out of
a Git repository (you don't want Vim to scream about it when you write a random
file), so let's add an exit if git status
fails:
#!/bin/sh
set -e
+git status > /dev/null 2>&1 || exit
PATH="/usr/local/bin:$PATH"
dir="`git rev-parse --git-dir`"
trap 'rm -f "$dir/$$.tags"' EXIT
git ls-files | \
ctags --tag-relative -L - -f"$dir/$$.tags" \
--languages=python,php,c,c++
mv "$dir/$$.tags" "$dir/tags"
Then all the hooks need to be updated to call this new script, as a global
command. They will then look as follow (in my case, I renamed the script as
ctags-gen
):
#!/bin/sh
ctags-gen >/dev/null 2>&1 &
Finally, in your vimrc
, you can add the following hook:
autocmd BufWritePost * silent !ctags-gen
to call ctags-gen
everytime a buffer is saved.
Use tags in Vim
Once you have your ctags file ready, you can then set it up in your .vimrc with the following:
set tags+=.git/tags
Now that you have tags set up, you can use them to autocomplete using
CTRL-x CTRL-]
in INSERT mode and you can jump to the definition of the
symbol under the cursor by pressing CTRL-]
in NORMAL mode.