c ++的路径设置包括vim的头文件

时间:2013-04-10 00:42:07

标签: c++ vim path include

我的vim有路径设置,如下所示。

path=.,/usr/include,,

我认为这是'path'的默认设置。

因此, g f 打开光标下的c头文件。

但是在C ++文件中,C ++头文件没有打开,因为C ++头文件位置没有添加到vim的path变量中。

set path+=/usr/include/c++/4.6

我认为vimrc上的这个设置将是一个解决方案。 但问题是C ++头文件的实际目录位置会在每个不同的Linux发行版和g ++编译器版本中更改。

如何以可移植的方式设置c ++头文件的路径?

4 个答案:

答案 0 :(得分:9)

如果位置数量有限,~/.vimrc中的简单条件就会:

if isdirectory('/usr/include/c++/4.6')
    set path+=/usr/include/c++/4.6
elseif isdirectory(...

如果您有许多不同的系统,并且不希望在中心位置维护所有变体,则可以将依赖于系统的设置移动到单独的本地文件中,并从{{{ 1}},像这样:

~/.vimrc

答案 1 :(得分:1)

我最近遇到了同样的问题,因此这是出于文档目的的解决方案:

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

答案 2 :(得分:0)

以下用于.vimrc文件的Vimscript代码会更新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,但还有其他特殊情况处理。

答案 3 :(得分:-2)

编译器需要检查特定的环境变量。如果您在linux / Unix环境中使用gcc / g ++,则变量为C_INCLUDE_PATHCPLUS_INCLUDE_PATH。如果您正在使用bash / sh,那么使用export VARIABLE=value或者如果您使用的是csh / tcsh,那么请使用setenv VARIABLE value,或者如果您正在使用其他shell,那么您需要查看它。在这些示例中,VARIABLEC_INCLUDE_PATHCPLUS_INCLUDE_PATH。我希望这会有所帮助。