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

3
我每天都在使用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个回答

6

您不需要这样做。Vim可以使用多个标签文件,只需选择一个位置来放置virtualenv标签文件,并将其完整路径包含在'tags'选项中即可。

还有另一种可能性:阅读man ctags。通过添加一个开关,ctags可以将标记添加到现有文件中。您仍然不需要将这些命令合并为一个命令。


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

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

    Do you really need to include .ctags; file with semicolon? Guess it is a typo.

  2. map …
    

    nnoremap …. First, there is nothing here you want to be remapped hence nore. Second, commands are not written to work from visual mode and I doubt you need them in operator-pending mode hence nnore.

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

    You don’t need :exe at all here, just

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

    . But you can completely avoid :redraw! by using 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')
    

这些注释在 Linux 和 OSX 上都适用吗?我发现上面提到的调用系统建议在 Ubuntu 12.04 上不起作用。白天我在 Ubuntu 上使用我的 vimfiles,晚上在 OSX 上使用,所以我希望找到一个两个系统上都能用的方法。另外我还发现“最后一个胜出”的情况仍在发生,项目底部的 ctags 会保留,但我的 virtualenv 索引却消失了(第一个被调用的索引)。 - Toran Billups
看起来在第二个ctags上添加-a标志将允许我将两者都索引到单个ctags文件中。'ctags -a -Rf .ctags .....' - Toran Billups
@ToranBillups 我不知道有什么情况下 ! 能工作而等效的 call system() 调用不能。第一行在我的系统上(Gentoo Linux)可以工作。注意:system() 不会扩展一些像 %# 这样的东西。这不是问题:0. 我这里没有看到特殊字符。1. 你不能可靠地使用这些特殊字符(包含特殊字符的名称将在使用 % 扩展时破坏调用,但在显式使用 shellescape() 时不会)。 - ZyX
@ToranBillups 我的意思是第一行 call system() - ZyX
要确定ctags是否成功退出,请使用v:shell_error - ZyX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接