A command line tool that creates tags - for source code navigation by using ctags - for a cargo project, all of its direct and indirect dependencies and the rust standard library.
- ctags installed, needs a version with the
On a linux system the package is most likely called
Otherwise you can get the sources directly from here or use the newer and alternative universal-ctags.
universal-ctags will add tags for struct fields and enum variants.
$ cargo install rusty-tags
The build binary will be located at
rusty-tags vi or
rusty-tags emacs anywhere inside of the cargo project should just work.
After its run a
rusty-tags.vi / rusty-tags.emacs file should be beside of the
Additionally every dependency gets a tags file at its source directory, so jumping further to its dependencies is possible.
Rust Standard Library Support
Tags for the standard library are created if the rust source is supplied by defining the environment variable
These tags aren't automatically added to the tags of the cargo project and have to be added manually with the path
If you're using rustup you can get the rust source of the currently used compiler version by calling:
$ rustup component add rust-src
And then setting
RUST_SRC_PATH inside of e.g.
$ export RUST_SRC_PATH=$(rustc --print sysroot)/lib/rustlib/src/rust/src/
rustup by getting the rust source by yourself:
$ git clone https://github.com/rust-lang/rust.git /home/you/rust $ cd /home/you/rust $ git checkout stable $ export RUST_SRC_PATH=/home/you/rust/src/ # should be defined in your ~/.bashrc
rustup is the recommended way, because then you will automatically get the correct standard library tags for the currently used compiler version.
The current supported configuration at
~/.rusty-tags/config.toml (defaults displayed):
# the file name used for vi tags vi_tags = "rusty-tags.vi" # the file name used for emacs tags emacs_tags = "rusty-tags.emacs" # the name or path to the ctags executable, by default executables with names # are searched in the following order: "ctags", "exuberant-ctags", "exctags", "universal-ctags", "uctags" ctags_exe = "" # options given to the ctags executable ctags_options = ""
Put this into your
autocmd BufRead *.rs :setlocal tags=./rusty-tags.vi;/
Or if you've supplied the rust source code by defining
autocmd BufRead *.rs :setlocal tags=./rusty-tags.vi;/,$RUST_SRC_PATH/rusty-tags.vi
autocmd BufWritePost *.rs :silent! exec "!rusty-tags vi --quiet --start-dir=" . expand('%:p:h') . "&" | redraw!
.dir-locals.el in rust project root (please note the line to set
counsel-etags-extra-tags-files is optional):
((nil . ((counsel-etags-update-tags-backend . (lambda (src-dir) (shell-command "rusty-tags emacs"))) (counsel-etags-extra-tags-files . ("~/third-party-lib/rusty-tags.emacs" "$RUST_SRC_PATH/rusty-tags.emacs")) (counsel-etags-tags-file-name . "rusty-tags.emacs"))))
M-x counsel-etags-find-tag-at-point for code navigation.
counsel-etags will automatically detect and update tags file in project root. So no extra setup is required.
The plugin CTags uses vi style tags, so calling
rusty-tags vi should work.
By default it expects tag files with the name
.tags, which can be set in
vi_tags = ".tags"
Or by calling
rusty-tags vi --output=".tags".
Mac OS users may encounter problems with the execution of
ctags because the shipped version of this program does not support the recursive flag. See this posting for how to install a working version with homebrew.
If you're running Cygwin or Msys under Windows, you might have to set the environment variable
$CARGO_HOME explicitly. Otherwise you might get errors when the tags files are moved.