为Vim设置C++头文件路径

13

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

path=.,/usr/include,,

我想这应该是“路径”默认设置吧。

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

但在 C++ 文件中,C++ 头文件不会被打开,因为 C++ 头文件的路径没有添加到 vim 的 path 变量中。

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

我认为在 vimrc 文件中进行以下设置可能是一种解决方法。但问题是,在每个不同的 Linux 发行版和 g++ 编译器版本中,C++ 头文件实际目录位置都会发生变化。

有什么方法可以以一种可移植的方式设置 C++ 头文件路径吗?

let g:gcpp_headers_path = system("g++ --version | grep g++ | awk '{print \"/usr/include/c++/\"$NF}'")

execute 'set path+=' . g:gcpp_headers_path

现在我正在使用上述内容:

这适用于g++环境。未经其他编译器测试。


@zachlatta,感谢您将我的问题编辑得更漂亮! - Jumogehn
你可以从调用 cpp -v 的结果中 grep 出搜索路径:awk '/^#include </ { state=1 } /End of search list/ { state=0 } /^ / && state { print substr($0, 2) }' - hochl
4个回答

10

如果只有有限数量的位置,那么在~/.vimrc中使用简单的条件语句就可以:

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

如果你有许多不同的系统,并且不希望在一个中心位置维护所有变体,你可以将依赖于系统的设置移动到一个单独的本地文件中,并从你的~/.vimrc调用它,就像这样:

" Source system-specific .vimrc first.
if filereadable(expand('~/local/.vimrc'))
    source ~/local/.vimrc
endif

非常感谢!我认为这将是一个很好的解决方案。谢谢您。 - Jumogehn
这次 expand() 的使用对我非常有帮助。谢谢! - Jumogehn
似乎是一个安全风险? - Steven Lu
@StevenLu:对于任意位置是可以的。但对于建议的~/local/.vimrc(或者在你的主目录下的任何其他位置),则不行。 - Ingo Karkat
让 g:gcpp_headers_path = system("g++ --version | grep g++ | awk '{print "/usr/include/c++/"$NF}'")执行 'set path+=' . g:gcpp_headers_path现在我正在使用以上内容: - Jumogehn

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++头文件。如果增加深度,搜索将花费更多时间,因此不要将此数字设置得太高。
@注意:对于#include <chrono>,ViM将转到/usr/include/boost/chrono,这是一个有趣的目录。我想知道为什么go file会打开一个目录,也许应该报告为错误。要获取正确的chrono头文件,您必须键入2gf

0
以下是 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中有类似的代码, 但是还有额外的特殊情况处理。


-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。希望这能帮到您。


非常感谢,但我需要了解的不是编译器,而是编辑器vim - Jumogehn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接