如何获取Vim中所有环境变量的列表?

jv2fixgn  于 9个月前  发布在  其他
关注(0)|答案(7)|浏览(100)

当Vim启动时,它会从操作系统获取许多环境变量(如PATH),并设置自己的环境变量(如MYVIMRC)。
如何列出或查看Vim能够理解的所有环境变量,以及它们在Vim内部的值?

ws51t4hk

ws51t4hk1#

在Vimscript中,没有一种直接的方法来获取当前定义的环境变量列表。但是,可以利用Vim命令行完成功能来创建一个。
考虑以下未完成命令的可能完成:

:echo $

字符串
不难看出,根据Vimscript语法,补全必须是环境变量的名称。按wildchar键(默认为Tab)或Ctrl+D将显示所有这些。
为了从脚本中获得这个补全列表,我们需要克服它的交互特性。我在这里提出的一个可能的技巧依赖于功能的组合。第一个是Ctrl+A命令。在命令行模式下,这个快捷键触发在光标前插入每个可用的补全。插入的补全按字母顺序列出,并用空格分隔。
如果我们可以让Vim直接将这些补全输出到命令行,我们可以通过使用:redir命令重定向命令输出来轻松捕获它们。但是我们需要实现的副作用是用Ctrl+A引用插入的文本:引用使我们的:echo命令的其余部分成为可以直接打印出来的字符串文字!

:echo 'NAME1 NAME2 NAME3'
NAME1 NAME2 NAME3


要以这种方式编辑命令行,用户可以键入:ec:echo的别名)后跟$,按Ctrl+A,键入',按Ctrl+B跳转到行首,按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


要使这种方法工作,Vim必须使用+cmdline_compl特性进行编译。

vwkv1x7d

vwkv1x7d2#

要列出所有环境变量,请使用

:echo $<C-D>

字符串
然后,您可以开始键入感兴趣的变量的名称,使用Tab自动完成,最后按Enter显示其值。
您没有说明是以交互方式还是在脚本中需要它,对于后者,不幸的是无法通过:redir捕获输出。

n8ghc7c1

n8ghc7c13#

前面的答案已经被vimscript**environ()**函数废弃了。
例如,按顺序列出它们:

:let evars = environ()
:for var in evars->keys()->sort()
:    echo var . '=' . evars[var]
:endfor

字符串

lymgl2op

lymgl2op4#

看看其他的答案,你可以不用脚本。
进入插入模式,然后按

<C-R>=

字符串
其中Ctrl+R允许您插入任何可用的寄存器(参见:help i_Ctrl-R)。但特别是您将在这里使用表达式register =来计算字符串(参见:help @=)。
所以,现在你可以插入由ib.的答案引入的表达式。输入:

$<C-A>"<HOME>"<CR><ESC>


现在,你应该回到正常模式,表达式应该已经被计算为字符串并被放入缓冲区。你可以使用替代命令进一步清理它:

:s/\s/\r$/g


这应该将每个环境变量放在不同的行上。

vsaztqbk

vsaztqbk5#

基于ib的想法和ZyX的评论,这是我最终使用的函数:

function! GetEnvVars()
    silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>"
endfunction

字符串

bkkx9g8r

bkkx9g8r6#

:let

字符串
显示所有(包括当前缓冲区/窗口)变量。或者,如果你需要列出例如所有窗口范围变量,请使用以下命令:

:let w:

ijnw1ujt

ijnw1ujt7#

一行:

:put =reduce(items(environ()), {a,e->a..e[0]..'='..e[1]..nr2char(10)}, '')

字符串
解释
| 语法|描述|
| --|--|
| 第一个月|将寄存器的内容插入编辑缓冲区|
| =个|计算表达式的虚拟寄存器|
| reduce(个|典型的reduce函数,需要Vim >= 8.2.0878(2021)|
| items(个|获取字典的(键,值)对列表|
| environ()个|包含环境变量Vim的字典>= 8.1.1305(2019)|
| 个|reduce()的第二个参数-reducer函数|
| {a,e->个|启动一个双参数lambda函数。a是累加器,e是一个长度为2的数组(键,值)对。|
| a..个|字符串附加到累加器变量a|
| e[0]个|环境变量名称|
| ..'='个|字符串附加等于号|
| ..e[1]个|string追加环境变量值|
| ..nr2char(10)个|字符串追加一个换行符;为什么不是"\n"?因为:put=不适合用双引号。你可以使用\"\n\"。|
| }个|结束λ|
| , ''| reduce的第三个参数:初始累加器值(空字符串)|
| )个|关闭reduce call和 fin。|
在vim 9 script中:

command! PutEnv {
    put =reduce(items(environ()),  (a, e) => a .. e[0] .. '=' .. e[1] .. '\n')
}

相关问题