当 Vim 启动时,它会从操作系统中获取许多环境变量(如PATH
),并设置自己的环境变量(如MYVIMRC
)。
如何列出或查看 Vim 理解的所有环境变量,以及它们在 Vim 内部的各自值?
当 Vim 启动时,它会从操作系统中获取许多环境变量(如PATH
),并设置自己的环境变量(如MYVIMRC
)。
如何列出或查看 Vim 理解的所有环境变量,以及它们在 Vim 内部的各自值?
在 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,键入 ,按+'
跳到行首,按将光标移到美元符号上 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
特性进行编译。
要列出所有环境变量,请使用
: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: