当Vim启动时,它会从操作系统获取许多环境变量(例如PATH
),并设置自己的环境变量(例如MYVIMRC
)。
我如何在Vim内部列出或查看所有Vim理解的环境变量及其相应的值?
当Vim启动时,它会从操作系统获取许多环境变量(例如PATH
),并设置自己的环境变量(例如MYVIMRC
)。
我如何在Vim内部列出或查看所有Vim理解的环境变量及其相应的值?
Vimscript中没有直接获取当前定义的环境变量列表的方法。但是,可以利用Vim命令行补全功能来实现这一点。
考虑以下未完成命令的可能补全选项:
:echo $
很容易看出,根据Vimscript语法,自动完成必须是环境变量的名称。 按下键(默认为Tab)或Ctrl+D将显示所有环境变量。
为了从脚本中获取这个自动完成列表,我们需要克服其交互性质。我在此提出一个可能的技巧,它依赖于一些特性的组合。其中第一个特性是Ctrl+A命令。在命令行模式下,这个快捷键会在光标前插入所有可用的自动完成项。插入的自动完成项按字母顺序列出,并用空格分隔。
如果我们可以让Vim把这些自动完成项打印到命令行中,我们就可以通过使用:redir
命令重定向命令输出来轻松地捕获它们。但我们需要实现这个副作用的全部是引用使用Ctrl+A插入的文本:引用使得我们:echo
命令的其余部分成为一个字符串字面值,可以直接打印出来!
:echo 'NAME1 NAME2 NAME3'
NAME1 NAME2 NAME3
要以这种方式编辑命令行,用户可以输入:ec
(:echo
的别名),后跟$
,按下Ctrl+A,输入'
,通过按下Ctrl+B跳到行的开头,通过按两次⇾(右箭头键)将光标移动到美元符号上,删除那个$
,最后插入'
代替它。 同样的按键序列可以使用:normal
命令轻松地进行非交互式重现。
将所有这些部分组合在一起,我们得到以下函数:
function! Env()
redir => s
sil! exe "norm!:ec$\<c-a>'\<c-b>\<right>\<right>\<del>'\<cr>"
redir END
return split(s)
endfunction
为了使用这种方法,必须使用+cmdline_compl
功能编译Vim。
echo
更改为 return
:这对我有用:execute "fu! Test()\nexe'silent normal!:return $\<C-a>'')\<C-b>\<C-right>\<Right>\<Del>split('''.\"\\n\"\nendfu"
。 - ZyX要列出所有的环境变量,请使用
:echo $<C-D>
然后,您可以开始输入感兴趣的变量名称,在 Tab 键自动完成后,最后按 Enter 键显示其值。
您没有说明是需要交互式还是在脚本中使用。对于后者,不幸的是,无法通过:redir
捕获输出。
之前的回答已经被 vimscript 的 environ() 函数所取代。
例如,要按顺序列出它们:
:let evars = environ()
:for var in evars->keys()->sort()
: echo var . '=' . evars[var]
:endfor
看到其他答案,你可以不用脚本就能做到。
进入插入模式,然后按下
<C-R>=
Ctrl+R快捷键可以插入可用的寄存器,详见:help i_Ctrl-R。但特别地,在此处您将使用表达式寄存器=来评估一个字符串,详见:help @=。
因此,现在您可以插入ib回答介绍的表达式。输入以下内容:
$<C-A>"<HOME>"<CR><ESC>
现在,您应该回到正常模式,表达式应该已经被求值为一个字符串并放置在缓冲区中。您可以进一步使用替换命令进行清理:
:s/\s/\r$/g
那将会把每个环境变量放在不同的行上。
根据ib的想法和ZyX的评论,这是我最终使用的函数:
function! GetEnvVars()
silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>"
endfunction
:let
显示所有变量(包括当前缓冲区/窗口)。或者,如果您需要列出例如所有窗口范围的变量,请改用此命令:
:let w: