【问题标题】:VIM - Sourcing tags from multiple locations in projectVIM - 从项目中的多个位置采购标签
【发布时间】:2012-11-24 00:06:07
【问题描述】:

早安,

我通常从事相对较小(少于 20,000 行代码)的项目,这些项目都自包含在一个目录中,有自己的 Makefile,并且相当容易使用。

VIM 是我首选的编辑器,当我打开一个项目时,我通常通过映射到 F10 键来构建 ctags 列表:

map <F10> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>

这允许我通过将光标移动到文本上并点击 CTRL+] 以及使用来跳转到变量/结构/等的定义通过 OmniCppComplete 使用下拉列表完成代码。

但是,我现在正在做一个稍微大一点的项目,该项目使用了很多结构。此外,其中许多结构都有其他自定义结构的数组作为成员,因此代码完成现在对我来说是一个非常有用且重要的工具。

我有两个路径,其中包含很多 .C 文件和 .h 文件,它们可能会因机器而异。然而,在每台机器上,我们的.bashrc 文件中都有一个环境变量指向它们,如下所示:

SDK_SRC_PLUS_HEADERS=/public/sdk
THIRD_PARTY_SDK=/private/sdk

我希望能够让 VIM 在我尝试执行代码完成(通过 VIM 的内置 OmniCppComplete 功能)时自动引用这些附加路径的内容,或者在我使用时跳转到这些位置中的文件VIM中的CTRL+]跳转到结构体、函数、变量等的定义

所以,对于上述两个路径,我将cd 放入其中,并通过ctags -R 生成标签。然后,我修改了我的 ~/.vimrc 文件以包含其他标签路径,如下所示:

tags=./tags
tags+=$SDK_SRC_PLUS_HEADERS/tags
tags+=$THIRD_PARTY_SDK/tags

然后我 cd 进入我的项目 /home/user1/projects/test,启动 VIM,然后在 VIM 中按 F10 来索引它。但是,这根本不起作用。事实上,它破坏了我甚至只为项目本身使用标签的能力(即:CTRL+] 现在什么都不做)。

有人对我如何通过环境变量使用多个源目录来获得代码完成源标签和跳转到定义有任何建议吗?

提前感谢大家的时间和帮助!

【问题讨论】:

  • 嗯,这一直对我有用。您是否使用:verbose set tags?检查过标签的值?
  • @sehe 肯定的。我通过上面的命令检查了输出,结果是:tags=./tags,$SDK_SRC_PLUS_HEADERS/tags,$SDK_SRC_PLUS_HEADERS/tags。我想知道它是否可能像我的 BASH 环境变量语法一样简单(即:也许我需要使用某种 VIM 函数来取消引用环境变量并将它们减少到绝对路径?)。
  • 是的,如果不扩展,我只赌~支持
  • @sehe 你知道我可以在我的 VIMRC 中使用什么命令来在 VIM 启动时扩展环境变量吗?我真的不允许修改 VIMRC 以使用哨兵路径字符串;它必须使用环境变量。
  • 事实上,我已经发布了,以防你没有注意到:)

标签: vim vi ctags code-completion omnicomplete


【解决方案1】:

我想添加到@sehe 提供的解决方案中。

这是我对.vimrc 所做的最后一组更改。第一行用于向我的 tags 变量添加扩展的环境变量路径。另一个是在我必须更新我的 SDK 并且不想意外使用过期标签的情况下自动更新标签:

" CTAGS tag generation for OmniCppComplete
set tags+=./tags
exec expand("set tags+=$SDK_SRC_PLUS_HEADERS/tags")
exec expand("set tags+=$THIRD_PARTY_SDK/tags")
" Can verify taglist is correct via ":set verbose tags?" command

" Create a mapping to delete the old tags, re-generate them, and use them
map <F10> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . \| rm -f $SDK_SRC_PLUS_HEADERS/tags \| ctags -R -f $SDK_SRC_PLUS_HEADERS/tags $SDK_SRC_PLUS_HEADERS/tags  \| rm -f $THIRD_PARTY_SDK/tags \| ctags -R -f $THIRD_PARTY_SDK/tags $THIRD_PARTY_SDK/tags  \| echo "Done re-generating tags."<CR>

【讨论】:

    【解决方案2】:

    这确实是你不能在标签设置中使用环境变量的问题。

    我想出了一个解决方法:

    :let &tags.=expand(",$SDK_SRC_PLUS_HEADERS/tags")
    

    这可能会更友好一些:

    :exec expand("set tags+=$SDK_SRC_PLUS_HEADERS/tags")
    

    【讨论】:

    • 嗯,:help 'tags'环境变量被扩展|:set_env|。
    • 嗯。是的。看起来你是对的。但是,这不是我的 Windows 盒子 IIRC 上发生的事情 - 我检查了它。我看看能不能稍后再试
    猜你喜欢
    • 2022-01-03
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多