19

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

如何列出或查看 Vim 理解的所有环境变量,以及它们在 Vim 内部的各自值?

4

6 回答 6

22

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

考虑以下未完成命令的可能完成:

:echo $

不难看出,根据 Vimscript 语法,补全必须是环境变量的名称。按键wildcharTab默认情况下是 )或 Ctrl+D将显示所有这些。

为了从脚本中获得这个完成列表,我们需要克服它的交互性。我在这里提出的一个可能的技巧依赖于特征的组合。其中第一个是 Ctrl+A命令。在命令行模式下,此快捷方式触发在光标前插入每个可用的完成。插入的补全按字母顺序列出并用空格分隔。

如果我们可以让 Vim 将这些补全直接打印到命令行中,我们可以通过使用:redir命令重定向命令输出来轻松捕获它们。但是我们需要实现这个副作用是引用插入的文本Ctrl+ A:引用使我们的:echo命令的其余部分成为可以打印出来的字符串文字!

:echo 'NAME1 NAME2 NAME3'
NAME1 NAME2 NAME3

要以这种方式编辑命令行,用户可以键入 :ec(的别名:echo)  $,然后按 Ctrl+ A,键入 ,按+'跳到行首,按将光标移到美元符号上 CtrlB⇾</kbd> (the right arrow key) twice, delete that $, and, finally, insert ' instead. The same sequence of key presses can easily be reproduced non-interactively using the :normal command.

将所有这些部分放在一起,我们得到以下函数:

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特性进行编译。

于 2012-06-25T15:53:24.137 回答
21

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

:echo $<C-D>

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

您没有告诉您是否需要以交互方式或在脚本中。对于后者,不幸的是无法通过:redir.

于 2012-06-24T12:36:18.733 回答
6

vimscript environ()函数已使先前的答案过时。

例如,按顺序列出它们:

:let evars = environ()
:for var in evars->keys()->sort()
:    echo var . '=' . evars[var]
:endfor
于 2020-11-08T23:17:15.763 回答
3

查看其他答案,您无需脚本即可完成。

进入插入模式,然后按

<C-R>=

其中Ctrl+R允许您插入任何可用的寄存器(参见 :help i_Ctrl-R)。但特别是您将在=此处使用表达式寄存器来计算字符串(请参阅 :help @=)。

所以,现在您可以插入 ib. 的答案介绍的表达式。输入这个:

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

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

:s/\s/\r$/g

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

于 2013-07-24T02:53:10.733 回答
2

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

function! GetEnvVars()
    silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>"
endfunction
于 2013-09-30T10:08:05.447 回答
1
:let

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

:let w:
于 2022-01-11T20:13:20.827 回答