【问题标题】:How to generate a single .ctags file for vim using 2 different locations?如何使用 2 个不同的位置为 vim 生成单个 .ctags 文件?
【发布时间】:2012-09-24 07:52:16
【问题描述】:

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

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

有没有办法将这 2 行 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

【问题讨论】:

    标签: vim ctags


    【解决方案1】:

    你不需要。 Vim 可以处理多个标签文件,只需选择一个位置来放置 virtualenv 标签文件并将其完整路径包含在 'tags' 选项中。

    还有另一种可能性:阅读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!
      

      。但是你可以通过使用system()来完全避免:redraw!

      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')
      

    【讨论】:

    • 这些 cmets 对 linux 和 OSX 都友好吗?如上所示,我发现呼叫系统建议在 Ubuntu 12.04 上不起作用。我白天在 Ubuntu 上使用我的 vimfiles,晚上在 OSX 上使用,所以我更喜欢两者都可以使用的东西。此外,我仍然看到“最后一个获胜”的行为发生在该项目的底部 ctags 仍然存在但我的 virtualenv 索引死亡(第一个被调用)的地方。
    • 看起来像在第二个 ctags 上添加 -a 标志将允许我将两个索引都保存在单个 ctags 文件中。 'ctags -a -Rf .ctags .....'
    • @ToranBillups 我不知道! 有效而等效的call system() 呼叫无效。第一行确实适用于我的系统(Gentoo linux)。注意:system() 没有扩展像 %# 这样的东西。根本不是交易:0。我在这里看不到特殊字符。 1. 你不能可靠地使用这些特殊字符(使用%扩展时,包含特殊字符的名称会中断调用,但在显式使用shellescape()时不会)。
    • @ToranBillups 我的意思是第一行call system()
    • 判断ctags是否成功退出使用v:shell_error