如何在.vimrc中正确使用未定义的环境变量?

mat*_*ull 5 vim environment-variables

我想在vim启动时使用特定目录root打开NERDTree,具体取决于环境变量.

设置环境变量将正确扩展,如$HOME.该文件指出未定义的变量将扩展为空字符串.

所以这个可以正确NERD_TREE_ROOT设置到现有目录.但如果不确定则不会.相反,$NERD_TREE_ROOT它将像字符串一样使用.

autocmd VimEnter * NERDTree $HOME/$NERD_TREE_ROOT
Run Code Online (Sandbox Code Playgroud)

如何正确使用未定义的环境变量作为空字符串?

编辑:澄清一点.这是我想避免的:

if empty($NERD_TREE_ROOT)
    autocmd VimEnter * NERDTree $HOME
else
    autocmd VimEnter * NERDTree $HOME/$NERD_TREE_ROOT
endif
Run Code Online (Sandbox Code Playgroud)

如果那是不可能的话,它会做.

kev*_*kev 7

在测试之前是否为空autocmd:

if !empty($NERD_TREE_ROOT)
    autocmd VimEnter * NERDTree $HOME/$NERD_TREE_ROOT
endif
Run Code Online (Sandbox Code Playgroud)


ZyX*_*ZyX 5

您观察到的与eval或表达式无关:echo eval('$HOME/$NERD_TREE_ROOT')结果-2147483648就像echo 0/0因为执行数字运算时的两个变量都变为零.的膨胀$HOME是通过VIM由于存在下进行-complete=dir:NERDTree命令定义.这是相当意外的和,顺便说一下,是第三类型的扩展::echo expand('$HOME/$NERD_TREE_ROOT')结果$HOME/$NERD_TREE_ROOT:echo expand('$HOME/$HOME')在结果中/home/zyx//home/zyx.我认为没有办法解决这个问题,但你总能做到

execute 'autocmd VimEnter * NERDTree '.fnameescape($HOME.'/'.$NERD_TREE_ROOT)
Run Code Online (Sandbox Code Playgroud)

.这是扩展工作的唯一情况,如文档中所述,因为它是存在任何表达式的唯一方法.