Skip to content

skywind3000/gutentags_plus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 

Repository files navigation

What is it ?

Gutentags is a vim 8 dedicated plugin which will update gtags database in background automatically on file change. Gutentags_plus works with gutentags and provides seemless databases switching:

  • Define a GscopeFind command to perform cscope searching via gtags-cscope.
  • Connect gtags database of current project automatically and disconnect unrelated project databases before searching.
  • Reuse gtags-cscope connection if current project is unchanged (gtags-cscope connection doesn't need a reset after updating).
  • Reset gtags-cscope connection if current working directory changed (otherwise, it will get a wrong file path in quickfix).

Gutentags can connect gtags databases automatically too, but it is trying to connect all the databases after updating. As a result, when you are querying symbol definitions or references, you will get results from not only current project but also other unrelated projects.

And your quickfix list will be totally messed up if you are working on more than two projects simultaneously. So, unrelated gtags databases must be disconnected to prevent query results from many projects at the same time.

That's the right way to use gtags. Install gutentags_plus with gutentags, you will never be worry about gtags database updating and connecting/disconnecting, you can search definitions and references whenever you want, database updating and switching are totally transparent to users, like using IDEs.

Installation

vim-plug:

Plug 'skywind3000/gutentags_plus'

vundle:

Plugin 'skywind3000/gutentags_plus'

Configuration

Plug 'ludovicchabant/vim-gutentags'
Plug 'skywind3000/gutentags_plus'

" enable gtags module
let g:gutentags_modules = ['ctags', 'gtags_cscope']

" config project root markers.
let g:gutentags_project_root = ['.root']

" generate datebases in my cache directory, prevent gtags files polluting my project
let g:gutentags_cache_dir = expand('~/.cache/tags')

" change focus to quickfix window after search (optional).
let g:gutentags_plus_switch = 1

NOTE: gutentags will identify current project root by by root markers (.git/.svn/.root). if your project is not in any git/svn repository, gutentags will not generate gtags database for it. To avoid this, you can create an empty .root file in your project root, and gutentags will know where is your project root and generate gtags database for it.

Demo

Gutentags_plus works very well when searching definition/references in huge projects like linux kernel:

Searching is very fast, You can't browse linux kernel source in IDEs, but you can read it in vim easily with the help of this plugin.

Command

:GscopeFind {querytype} {name}

Perform a cscope search and take care of database switching before searching.

{querytype} corresponds to the actual cscope line interface numbers as well as default nvi commands:

0 or s: Find this symbol
1 or g: Find this definition
2 or d: Find functions called by this function
3 or c: Find functions calling this function
4 or t: Find this text string
6 or e: Find this egrep pattern
7 or f: Find this file
8 or i: Find files #including this file
9 or a: Find places where this symbol is assigned a value

Keymaps

keymap desc
<leader>cs Find symbol (reference) under cursor
<leader>cg Find symbol definition under cursor
<leader>cd Functions called by this function
<leader>cc Functions calling this function
<leader>ct Find text string under cursor
<leader>ce Find egrep pattern under cursor
<leader>cf Find file name under cursor
<leader>ci Find files #including the file name under cursor
<leader>ca Find places where current symbol is assigned
<leader>cz Find current word in ctags database

You can disable the default keymaps by:

let g:gutentags_plus_nomap = 1

and define your new maps like:

noremap <silent> <leader>gs :GscopeFind s <C-R><C-W><cr>
noremap <silent> <leader>gg :GscopeFind g <C-R><C-W><cr>
noremap <silent> <leader>gc :GscopeFind c <C-R><C-W><cr>
noremap <silent> <leader>gt :GscopeFind t <C-R><C-W><cr>
noremap <silent> <leader>ge :GscopeFind e <C-R><C-W><cr>
noremap <silent> <leader>gf :GscopeFind f <C-R>=expand("<cfile>")<cr><cr>
noremap <silent> <leader>gi :GscopeFind i <C-R>=expand("<cfile>")<cr><cr>
noremap <silent> <leader>gd :GscopeFind d <C-R><C-W><cr>
noremap <silent> <leader>ga :GscopeFind a <C-R><C-W><cr>
noremap <silent> <leader>gz :GscopeFind z <C-R><C-W><cr>

Troubleshooting

ERROR: gutentags: gtags-cscope job failed, returned: 1

step1: add the line below to your .vimrc:

let g:gutentags_define_advanced_commands = 1

step2: restart vim and execute command:

:GutentagsToggleTrace

step3: open some files and generate gtags again with current project:

:GutentagsUpdate

step4: you may see a lot of gutentags logs, after that:

:messages

To see the gtags log.

Credits

You may be interested in the vim-preview plugin, it can preview results from quickfix window when you press p.

About

The right way to use gtags with gutentags

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published