VIM set ctags in .vimrc

Dmitry Teplyakov picture Dmitry Teplyakov · Nov 27, 2011 · Viewed 53.4k times · Source

I have my projects in /srv/http/dev folder. I generated ctags file for one project:

$ ctags -R --languages=php .

Now I set ctags path:

:set tags=/srv/http/dev/proj/tags

And it's working fine.

But I have many projects in dev/ folder. How can I set ctags in .vimrc file? set tags=tags not working properly.

And I would like to generate tags file by pressing hotkey on selected NERDTree folder. I tried:

nmap <silent> <F4>
    \ :!ctags -R
    \ --languages=php .<CR>

But it creates tags file in home folder and shows warnings about scanning home folder..

EDIT: As @Alexandru Plugaru advised I should use g:NERDTreeFileNode.GetSelected() function.

I am just newbie vim user, so I have one more question. I have added in my .vimrc file:

function createTags()
    let curNodePath = g:NERDTreeFileNode.GetSelected().path.str
    exec ':!ctags -R --languages=php ' . curNodePath
endfunction
nmap <silent> <F4> :execute createTags()<CR>

But by pressing on F4 I see:

E117: Unknown function: createTags
E15: Invalid expression: createTags

EDIT 2: Thanks to @Alexandru Plugaru I got this:

function CreateTags()
    let curNodePath = g:NERDTreeFileNode.GetSelected().path.str()
    exec ':!ctags -R --languages=php -f ' . curNodePath . '/tags ' . curNodePath
endfunction
nmap <silent> <F4> :call CreateTags()<CR>

And it works! By pressing F4 I get tags file in project folder.

Answer

romainl picture romainl · Nov 27, 2011
  1. Functions are supposed to start with a capital letter. Change createTags to CreateTags.

  2. To use project-specific tags files you will need to add something like that to your .vimrc:

    set tags=./tags,tags;
    

    so that Vim looks for a tags file in the current directory first and up and up until it finds it. Additionnaly, I like to set autochdir: the working directory is always the one containing the current file.