【问题标题】:path setting for c++ include headers for vimc++ 的路径设置包括 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) }'

标签: c++ vim path include


【解决方案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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2011-12-28
      • 1970-01-01
      • 2010-10-09
      • 2011-04-20
      • 2018-12-27
      • 2018-08-28
      相关资源
      最近更新 更多