你好,
我通常处理相对较小(少于20000行代码)的项目,这些项目都独立包含在一个目录中,有自己的Makefile,并且很容易处理。
VIM是我喜欢的编辑器,当我打开一个项目时,我通常通过映射到F10键来构建ctags列表:
map <F10> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
这使我可以通过将光标移动到文本上,点击CTRL+
然而,我现在正在进行一个稍大的项目,该项目利用了结构的LOTS。此外,这些结构中的许多都有其他自定义结构的数组作为成员,因此代码完成现在对我来说是一个非常有用和重要的工具。
我有两个路径,其中包括许多.C
文件和.h
文件,它们可能会随着机器的不同而变化。然而,在每台机器上,我们的.bashrc
文件中都有一个指向它们的环境变量:
SDK_SRC_PLUS_HEADERS=/public/sdk
THIRD_PARTY_SDK=/private/sdk
当我尝试完成代码时(通过VIM内置的OmniCppComplete功能),或者当我在VIM中使用CTRL+<kbd]>跳转到结构、函数、变量等的定义时,我希望VIM能够自动引用这些附加路径的内容。
因此,对于上述两条路径,我将cd
插入其中,并通过ctags -R
生成标签。然后,我修改了我的~/.vimrc
文件,以包括额外的标签路径,比如:
tags=./tags
tags+=$SDK_SRC_PLUS_HEADERS/tags
tags+=$THIRD_PARTY_SDK/tags
然后,我在/home/user1/projects/test
将cd
放入我的项目中,启动VIM,并在VIM中点击F10对其进行索引。然而,这根本不起作用。事实上,它甚至破坏了我只为项目本身使用标签的能力(即:CTRL+<kbd〉〕>现在什么都不做)。
有人对我如何通过环境变量使用多个源目录来获得代码完成源标记和跳转到定义有什么建议吗?
提前感谢大家的时间和帮助!
我想添加到@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>
不能在标记设置中使用环境变量似乎确实是个问题。
我想出了一个变通办法:
:let &tags.=expand(",$SDK_SRC_PLUS_HEADERS/tags")
这可能会稍微友好一点:
:exec expand("set tags+=$SDK_SRC_PLUS_HEADERS/tags")