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 &lt;chrono&gt;,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_PATHCPLUS_INCLUDE_PATH。如果您使用的是 bash/sh,则使用 export VARIABLE=value,或者如果您使用的是 csh/tcsh,则使用 setenv VARIABLE value,或者如果您使用的是其他 shell,那么您需要查找它。在这些示例中,VARIABLEC_INCLUDE_PATHCPLUS_INCLUDE_PATH。我希望这会有所帮助。

【讨论】:

非常感谢,但我需要知道的不是compiler,而是编辑vim

以上是关于c++ 的路径设置包括 vim 的标头的主要内容,如果未能解决你的问题,请参考以下文章

XCode 4 中的标头搜索路径

资源 (.rc) 文件包含标头忽略 Visual Studio 项目包含路径

Xcode 9.2 中缺少标头搜索路径、库路径和链接路径部分

库包含未检测包含路径中的标头

在 Objective-C 中使用外部 C++ 头文件

VSCode c++ task.json 包含路径和库