代码之家  ›  专栏  ›  技术社区  ›  Jumogehn

vim的c++include头的路径设置

  •  12
  • Jumogehn  · 技术社区  · 11 年前

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

    path=.,/usr/include,,
    

    我想这是“路径”的默认设置。

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

    但在C++文件上,由于C++头文件位置未添加到 path vim的变量。

    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++环境。未使用其他编译器进行测试。

    4 回复  |  直到 2 年前
        1
  •  10
  •   Ingo Karkat    11 年前

    如果位置数量有限 ~/.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
    
        2
  •  2
  •   hochl Michael Aaron Safyan    6 年前

    我最近遇到了同样的问题,因此以下是我的解决方案,用于文档编制:

    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 .

        3
  •  0
  •   dannyadam    5 年前

    以下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
    

    我有 similar code 在我的 .vimrc公司 ,但需要额外的特殊情况处理。

        4
  •  -2
  •   CHardnett    11 年前

    编译器需要检查特定的环境变量。如果您在linux/Unix环境中使用gcc/g++,那么变量是 C_INCLUDE_PATH CPLUS_INCLUDE_PATH 。如果您正在使用bash/sh,则使用 export VARIABLE=value 或者,如果您正在使用csh/tcsh,则使用 setenv VARIABLE value 或者,如果你正在使用其他shell,那么你需要查找它。在这些例子中 VARIABLE 是其中之一 包含路径(_C) CPLUS_INCLUDE_PATH(包含路径) 。我希望这能有所帮助。