autotag.vim
If you use ctags to make tags files of your source, it's nice to be able to re-run ctags on a source file when you save it.
However, using ctags -a
will only change existing entries in a tags file or add new ones. It doesn't delete entries that no longer exist. Should you delete an entity from your source file that's represented by an entry in a tags file, that entry will remain after calling ctags -a
.
This python function will do two things:
-
It will search for a tags file starting in the directory where your source file resides and moving up a directory at a time until it either finds one or runs out of directories to try.
-
Should it find a tags file, it will then delete all entries in said tags file referencing the source file you've just saved and then execute
ctags -a
on that source file using the relative path to the source file from the tags file.
This way, every time you save a file, your tags file will be seamlessly updated.
Installation
Currently I suggest you use Vundle and install as a normal Bundle
From the Vim command-line
:BundleInstall 'craigemery/vim-autotag'
And add to your ~/.vimrc
Bundle 'craigemery/vim-autotag'
Or you can manually install cd git clone git://github.com/craigemery/vim-autotag.git cd ~/.vim/ mkdir -p plugin cp ~/vim-autotag.git/plugin/* plugin/
Install as a Pathogen bundle
git clone git://github.com/craigemery/vim-autotag.git ~/.vim/bundle/vim-autotag
Getting round other ctags limitations
ctags is very file name suffix driven. When the file has no suffix, ctags can fail to detect the file type.
The easiest way to replicate this is when using a #! shebang. I've seen "#!/usr/bin/env python3" in a
shebang not get detected by ctags.
But Vim is better at this. So Vim's filetype buffer setting can help.
So when the buffer being written has no suffix to the file name then the Vim filetype value will be used instead.
So far I've only implemented "python" as one that is given to ctags --language-force= as is.
Other filetypes could be mapped. There's a dict in the AutTag class.
To not map a filetype to a forced language kind, add the vim file type to the comma "," separated
list in autotagExcludeFiletypes.
Configuration
Autotag can be configured using the following global variables:
Name | Purpose |
---|---|
g:autotagExcludeSuffixes |
suffixes to not ctags on |
g:autotagExcludeFiletypes |
filetypes to not try & force a language choice on ctags |
g:autotagVerbosityLevel |
logging verbosity (as in Python logging module) |
g:autotagCtagsCmd |
name of ctags command |
g:autotagTagsFile |
name of tags file to look for |
g:autotagDisabled |
Disable autotag (enable by setting to any non-blank value) |
g:autotagStopAt |
stop looking for a tags file (and make one) at this directory (defaults to $HOME) |
g:autotagStartMethod |
Now AutoTag uses Python multiprocessing, the start method is an internal aspect that Python uses. |
These can be overridden with buffer specific ones. b: instead of g: Example:
let g:autotagTagsFile=".tags"
macOS, Python 3.8 and 'spawn'
With the release of Python 3.8, the default start method for multiprocessing on macOS has become 'spawn' At the time of writing there are issues with 'spawn' and I advise making AutoTag ask Python to use 'fork' i.e. before loading the plugin:
let g:autotagStartMethod='fork'
Self-Promotion
Like autotag.vim? Follow the repository on GitHub and vote for it on vim.org. And if you're feeling especially charitable, follow [craigemery] on GitHub.
License
Copyright (c) Craig Emery. Distributed under the same terms as Vim itself.
See :help license
.