如何使用2个不同的位置为vim生成单个.ctags文件?

时间:2012-09-17 04:06:49

标签: vim ctags

我每天都在使用python,需要拥有我的本地项目和我的virtualenv中找到的每个python模块/ egg的索引

以下是我希望改进的半工作版本。目前我可以在重绘命令之前执行一个或另一个。使用这种方法,我最终在我工作的每个项目的根目录中都有一个.ctags文件,vim知道通过类名/方法名称/等进行任何快速简单的查找。

有没有办法将这两个exe行组合成一行仍然只能生成一个索引文件?

提前谢谢

set tags=./.ctags,.ctags;

" re-index the ctags file
map <leader>ri :call RenewTagsFile()<cr>

" search through the indexed ctags file for any class/method/etc
map <leader>fs :FufTag<CR>

function! RenewTagsFile()
    exe 'silent !ctags -Rf .ctags ' . system('python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"')''
    exe 'silent !ctags -Rf .ctags --extra=+f --exclude=.git --languages=-javascript 2>/dev/null'
    exe 'redraw!'
endfunction

更新

对于任何可能在将来偶然发现这个问题的人,我可以使用-a标志附加(因此续订标签文件功能将会是这样的)

function! RenewTagsFile()
    exe 'silent !ctags -Rf .ctags ' . system('python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"')''
    exe 'silent !ctags -a -Rf .ctags --extra=+f --exclude=.git --languages=-javascript 2>/dev/null'
    exe 'redraw!'
endfunction

1 个答案:

答案 0 :(得分:5)

你不需要。 Vim能够处理多个标签文件,只需选择一个位置即可放置virtualenv标签文件,并在其中包含“标签”选项的完整路径。

还有另一种可能性:阅读man ctags。通过添加一个开关,可以使ctags向现有文件添加标签。您仍然不需要将这些命令组合成一个命令。


注意:代码中有一些奇怪的东西:

  1. set tags=./.ctags,.ctags;
    

    你真的需要用分号包含.ctags;文件吗?猜猜这是一个错字。

  2. map …
    

    nnoremap …。首先,这里没有你想重新映射的nore。其次,命令不是从可视模式编写的,我怀疑你是否需要它们在操作员待定模式nnore

  3. exe 'silent !ctags -Rf .ctags --extra=+f --exclude=.git --languages=-javascript 2>/dev/null'
    exe 'redraw!'
    

    这里根本不需要:exe,只是

    silent !ctags -Rf .ctags --extra=+f --exclude=.git --languages=-javascript 2>/dev/null
    redraw!
    

    。但是,您可以使用:redraw!完全避免system()

    call system('ctags -Rf .ctags ' . system('python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"'))
    call system('ctags -Rf .ctags --extra=+f --exclude=.git --languages=-javascript 2>/dev/null')