5

再会,

我通常处理相对较小(少于 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,然后F10在 VIM 中对其进行索引。但是,这根本不起作用。事实上,它破坏了我甚至只为项目本身使用标签的能力(即:CTRL+]现在什么都不做)。

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

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

4

2 回答 2

2

我想添加到@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>
于 2012-11-26T17:30:50.427 回答
1

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

我想出了一个解决方法:

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

这可能会更友好一些:

:exec expand("set tags+=$SDK_SRC_PLUS_HEADERS/tags")
于 2012-11-24T00:40:12.970 回答