当Vim启动时,它会从操作系统获取许多环境变量(如PATH),并设置自己的环境变量(如MYVIMRC)。如何列出或查看Vim能够理解的所有环境变量,以及它们在Vim内部的值?
PATH
MYVIMRC
ws51t4hk1#
在Vimscript中,没有一种直接的方法来获取当前定义的环境变量列表。但是,可以利用Vim命令行完成功能来创建一个。考虑以下未完成命令的可能完成:
:echo $
字符串不难看出,根据Vimscript语法,补全必须是环境变量的名称。按wildchar键(默认为Tab)或Ctrl+D将显示所有这些。为了从脚本中获得这个补全列表,我们需要克服它的交互特性。我在这里提出的一个可能的技巧依赖于功能的组合。第一个是Ctrl+A命令。在命令行模式下,这个快捷键触发在光标前插入每个可用的补全。插入的补全按字母顺序列出,并用空格分隔。如果我们可以让Vim直接将这些补全输出到命令行,我们可以通过使用:redir命令重定向命令输出来轻松捕获它们。但是我们需要实现的副作用是用Ctrl+A引用插入的文本:引用使我们的:echo命令的其余部分成为可以直接打印出来的字符串文字!
wildchar
:redir
:echo
:echo 'NAME1 NAME2 NAME3' NAME1 NAME2 NAME3
型要以这种方式编辑命令行,用户可以键入:ec(:echo的别名)后跟$,按Ctrl+A,键入',按Ctrl+B跳转到行首,按Ctrl+B将光标移动到美元符号上(右箭头键)两次,删除$,最后插入'。使用:normal命令可以轻松地以非交互方式再现相同的按键顺序。把所有这些部分放在一起,我们得到以下函数:
:ec
$
'
: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特性进行编译。
+cmdline_compl
vwkv1x7d2#
要列出所有环境变量,请使用
:echo $<C-D>
字符串然后,您可以开始键入感兴趣的变量的名称,使用Tab自动完成,最后按Enter显示其值。您没有说明是以交互方式还是在脚本中需要它,对于后者,不幸的是无法通过:redir捕获输出。
n8ghc7c13#
前面的答案已经被vimscript**environ()**函数废弃了。例如,按顺序列出它们:
:let evars = environ() :for var in evars->keys()->sort() : echo var . '=' . evars[var] :endfor
字符串
lymgl2op4#
看看其他的答案,你可以不用脚本。进入插入模式,然后按
<C-R>=
字符串其中Ctrl+R允许您插入任何可用的寄存器(参见:help i_Ctrl-R)。但特别是您将在这里使用表达式register =来计算字符串(参见:help @=)。所以,现在你可以插入由ib.的答案引入的表达式。输入:
$<C-A>"<HOME>"<CR><ESC>
型现在,你应该回到正常模式,表达式应该已经被计算为字符串并被放入缓冲区。你可以使用替代命令进一步清理它:
:s/\s/\r$/g
型这应该将每个环境变量放在不同的行上。
vsaztqbk5#
基于ib的想法和ZyX的评论,这是我最终使用的函数:
function! GetEnvVars() silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>" endfunction
bkkx9g8r6#
:let
字符串显示所有(包括当前缓冲区/窗口)变量。或者,如果你需要列出例如所有窗口范围变量,请使用以下命令:
:let w:
型
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中:
=
reduce(
items(
environ()
,
reduce()
{a,e->
a
e
a..
e[0]
..'='
..e[1]
..nr2char(10)
"\n"
\"\n\"
}
, ''
)
command! PutEnv { put =reduce(items(environ()), (a, e) => a .. e[0] .. '=' .. e[1] .. '\n') }
7条答案
按热度按时间ws51t4hk1#
在Vimscript中,没有一种直接的方法来获取当前定义的环境变量列表。但是,可以利用Vim命令行完成功能来创建一个。
考虑以下未完成命令的可能完成:
字符串
不难看出,根据Vimscript语法,补全必须是环境变量的名称。按
wildchar
键(默认为Tab)或Ctrl+D将显示所有这些。为了从脚本中获得这个补全列表,我们需要克服它的交互特性。我在这里提出的一个可能的技巧依赖于功能的组合。第一个是Ctrl+A命令。在命令行模式下,这个快捷键触发在光标前插入每个可用的补全。插入的补全按字母顺序列出,并用空格分隔。
如果我们可以让Vim直接将这些补全输出到命令行,我们可以通过使用
:redir
命令重定向命令输出来轻松捕获它们。但是我们需要实现的副作用是用Ctrl+A引用插入的文本:引用使我们的:echo
命令的其余部分成为可以直接打印出来的字符串文字!型
要以这种方式编辑命令行,用户可以键入
:ec
(:echo
的别名)后跟$
,按Ctrl+A,键入'
,按Ctrl+B跳转到行首,按Ctrl+B将光标移动到美元符号上(右箭头键)两次,删除$
,最后插入'
。使用:normal
命令可以轻松地以非交互方式再现相同的按键顺序。把所有这些部分放在一起,我们得到以下函数:
型
要使这种方法工作,Vim必须使用
+cmdline_compl
特性进行编译。vwkv1x7d2#
要列出所有环境变量,请使用
字符串
然后,您可以开始键入感兴趣的变量的名称,使用Tab自动完成,最后按Enter显示其值。
您没有说明是以交互方式还是在脚本中需要它,对于后者,不幸的是无法通过
:redir
捕获输出。n8ghc7c13#
前面的答案已经被vimscript**environ()**函数废弃了。
例如,按顺序列出它们:
字符串
lymgl2op4#
看看其他的答案,你可以不用脚本。
进入插入模式,然后按
字符串
其中Ctrl+R允许您插入任何可用的寄存器(参见:help i_Ctrl-R)。但特别是您将在这里使用表达式register =来计算字符串(参见:help @=)。
所以,现在你可以插入由ib.的答案引入的表达式。输入:
型
现在,你应该回到正常模式,表达式应该已经被计算为字符串并被放入缓冲区。你可以使用替代命令进一步清理它:
型
这应该将每个环境变量放在不同的行上。
vsaztqbk5#
基于ib的想法和ZyX的评论,这是我最终使用的函数:
字符串
bkkx9g8r6#
字符串
显示所有(包括当前缓冲区/窗口)变量。或者,如果你需要列出例如所有窗口范围变量,请使用以下命令:
型
ijnw1ujt7#
一行:
字符串
解释
| 语法|描述|
| --|--|
| 第一个月|将寄存器的内容插入编辑缓冲区|
|
=
个|计算表达式的虚拟寄存器||
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中:
型