我的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 ++头文件的路径?
答案 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_PATH
和CPLUS_INCLUDE_PATH
。如果您正在使用bash / sh,那么使用export VARIABLE=value
或者如果您使用的是csh / tcsh,那么请使用setenv VARIABLE value
,或者如果您正在使用其他shell,那么您需要查看它。在这些示例中,VARIABLE
是C_INCLUDE_PATH
和CPLUS_INCLUDE_PATH
。我希望这会有所帮助。