c++ 的路径设置包括 vim 的标头
Posted
技术标签:
【中文标题】c++ 的路径设置包括 vim 的标头【英文标题】:path setting for c++ include headers for vim 【发布时间】:2013-04-01 15:44:31 【问题描述】:我的 vim 有如下所示的路径设置。
path=.,/usr/include,,
我认为这是“路径”的默认设置。
正因为如此,g f打开光标下的c头文件。
但是在 C++ 文件上 C++ 头文件没有打开,因为 C++ 头文件位置没有添加到 vim 的 path
变量中。
set path+=/usr/include/c++/4.6
我认为vimrc
上的此设置将是一个解决方案。
但问题是 C++ 头文件的实际目录位置会在每个不同的 linux 发行版和 g++ 编译器版本中发生变化。
如何以可移植的方式设置 c++ 头文件的路径?
【问题讨论】:
@zachlatta,感谢您更漂亮地编辑我的问题! 你可能会从调用cpp -v
的结果中grep搜索路径:awk '/^#include </ state=1 /End of search list/ state=0 /^ / && state print substr($0, 2) '
【参考方案1】:
以下 Vimscript 代码用于 .vimrc
文件,更新 path
以包含预处理器使用的搜索路径。
if executable('gcc')
let s:expr = 'gcc -Wp,-v -x c++ - -fsyntax-only 2>&1 | grep "^ " | sed "s/^ //"'
let s:lines = systemlist(s:expr)
for s:line in s:lines
execute 'set path+=' . fnameescape(s:line)
endfor
endif
我的.vimrc
中有similar code,但有额外的特殊情况处理。
【讨论】:
【参考方案2】:我最近遇到了同样的问题,所以这是我的文档解决方案:
1) 我在.bashrc
中添加了以下内容:
# add additional search paths to vim.
VIM_EXTPATHS="$HOME/.vim.extpaths"
if [ ! -e "$VIM_EXTPATHS" ] || [ "/usr/bin/cpp" -nt "$VIM_EXTPATHS" ]; then
echo | cpp -v 2>&1 | \
awk '/^#include </ state=1 /End of search list/ state=0 /^ / && state print "set path+=" substr($0, 2) "/**2" ' > $VIM_EXTPATHS
fi
2) 我在.vimrc
中添加了以下内容:
" add extra paths.
let s:extpaths=expand("$HOME/.vim.extpaths")
if filereadable(s:extpaths)
execute "source ".s:extpaths
endif
在我的系统上,.vim.extpaths
文件的内容如下:
set path+=/usr/lib/gcc/x86_64-linux-gnu/8/include/**2
set path+=/usr/local/include/**2
set path+=/usr/lib/gcc/x86_64-linux-gnu/8/include-fixed/**2
set path+=/usr/include/x86_64-linux-gnu/**2
set path+=/usr/include/**2
**2
表示 ViM 将搜索这些目录深处的两个目录。现在gf
将找到我需要的所有 C++ 头文件。如果增加深度,搜索会花费更多时间,所以不要将此数字设置得太高。
@note:对于#include <chrono>
,ViM 将转到/usr/include/boost/chrono
,有趣的是,它是一个目录。我想知道为什么go file
会打开一个目录,也许这应该被报告为一个错误。要获得正确的 chrono
标头,您必须输入 2gf
。
【讨论】:
【参考方案3】:如果位置数量有限,~/.vimrc
中的简单条件即可:
if isdirectory('/usr/include/c++/4.6')
set path+=/usr/include/c++/4.6
elseif isdirectory(...
如果您有很多不同的系统,并且不想在一个中心位置维护所有变体,您可以将依赖于系统的设置移动到一个单独的、仅限本地的文件中,然后从您的 @987654323 调用它@,像这样:
" Source system-specific .vimrc first.
if filereadable(expand('~/local/.vimrc'))
source ~/local/.vimrc
endif
【讨论】:
非常感谢!我认为这将是一个很好的解决方案。谢谢。 这次expand() 的使用对我帮助很大。谢谢! 似乎存在安全风险? @StevenLu:对于任意位置,是的。对于建议的~/local/.vimrc
(或您的主目录中的任何其他位置),不是。【参考方案4】:
编译器需要检查特定的环境变量。如果您在 linux/Unix 环境中使用 gcc/g++,则变量为 C_INCLUDE_PATH
和 CPLUS_INCLUDE_PATH
。如果您使用的是 bash/sh,则使用 export VARIABLE=value
,或者如果您使用的是 csh/tcsh,则使用 setenv VARIABLE value
,或者如果您使用的是其他 shell,那么您需要查找它。在这些示例中,VARIABLE
是 C_INCLUDE_PATH
和 CPLUS_INCLUDE_PATH
。我希望这会有所帮助。
【讨论】:
非常感谢,但我需要知道的不是compiler
,而是编辑vim
。以上是关于c++ 的路径设置包括 vim 的标头的主要内容,如果未能解决你的问题,请参考以下文章
资源 (.rc) 文件包含标头忽略 Visual Studio 项目包含路径