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

21

当Vim启动时,它会从操作系统获取许多环境变量(例如PATH),并设置自己的环境变量(例如MYVIMRC)。

我如何在Vim内部列出或查看所有Vim理解的环境变量及其相应的值?


1
http://vim.wikia.com/wiki/Displaying_the_current_Vim_environment 可能会有所帮助。 - epsilonhalbe
所以你正在寻找vim继承的环境变量的完整列表,还是你正在寻找vim自己创建的所有环境变量(单独创建)的列表? - Tarek Fadel
2
据我所知,仅通过Vim是不可能做到的。然而,在类Unix系统中,可以使用“:!env”。 - ib.
Tarek Fadel:正如我的问题所示,我对两者都感兴趣。Vim也是指环境变量。 - Ashwin Nanjappa
6个回答

24

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。


1
最好将 echo 更改为 return:这对我有用:execute "fu! Test()\nexe'silent normal!:return $\<C-a>'')\<C-b>\<C-right>\<Right>\<Del>split('''.\"\\n\"\nendfu" - ZyX

22

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

:echo $<C-D>

然后,您可以开始输入感兴趣的变量名称,在 Tab 键自动完成后,最后按 Enter 键显示其值。

您没有说明是需要交互式还是在脚本中使用。对于后者,不幸的是,无法通过:redir捕获输出。


Ingo Karkat:谢谢。交互式对我来说没问题。 - Ashwin Nanjappa
使用 :redir 可以捕获命令行完成。不过,这需要一些非平凡的技巧。如果感兴趣,请查看我的答案 - ib.

8

之前的回答已经被 vimscript 的 environ() 函数所取代。

例如,要按顺序列出它们:

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

3

看到其他答案,你可以不用脚本就能做到。

进入插入模式,然后按下

<C-R>=

Ctrl+R快捷键可以插入可用的寄存器,详见:help i_Ctrl-R。但特别地,在此处您将使用表达式寄存器=来评估一个字符串,详见:help @=。

因此,现在您可以插入ib回答介绍的表达式。输入以下内容:

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

现在,您应该回到正常模式,表达式应该已经被求值为一个字符串并放置在缓冲区中。您可以进一步使用替换命令进行清理:

:s/\s/\r$/g

那将会把每个环境变量放在不同的行上。


2

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

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

2
:let

显示所有变量(包括当前缓冲区/窗口)。或者,如果您需要列出例如所有窗口范围的变量,请改用此命令:

:let w:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接