如何获取Vim中所有环境变量的列表?
启动Vim时,它从操作系统中获取许多环境变量(如如何获取Vim中所有环境变量的列表?,vim,environment-variables,Vim,Environment Variables,启动Vim时,它从操作系统中获取许多环境变量(如PATH),并设置自己的环境变量(如MYVIMRC) 如何列出或查看Vim了解的所有环境变量,以及Vim内部的相应值?要列出所有环境变量,请使用 :echo $<C-D> :echo$ 然后,您可以开始键入感兴趣的变量的名称,使用Tab自动完成,最后按Enter键显示其值 您没有说明是以交互方式还是在脚本中需要它。对于后者,不幸的是不可能通过Vimscript中的redir捕获输出,因为没有直接的方法来获取 当前定义的环境变量。然而
PATH
),并设置自己的环境变量(如MYVIMRC
)
如何列出或查看Vim了解的所有环境变量,以及Vim内部的相应值?要列出所有环境变量,请使用
:echo $<C-D>
:echo$
然后,您可以开始键入感兴趣的变量的名称,使用Tab自动完成,最后按Enter键显示其值
您没有说明是以交互方式还是在脚本中需要它。对于后者,不幸的是不可能通过Vimscript中的redir
捕获输出,因为没有直接的方法来获取
当前定义的环境变量。然而,这是可能的
要利用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,将光标移动到
按一下按钮,美元就会升值⇾ (右箭头键)两次,
删除$
,最后插入“
。相同的序列
可以使用
:正常的
命令
将所有这些部分放在一起,我们得到以下函数:
function! Env()
redir => s
sil! exe "norm!:ec$\<c-a>'\<c-b>\<right>\<right>\<del>'\<cr>"
redir END
return split(s)
endfunction
函数!环境()
redir=>s
西尔!exe“norm!:ec$\'\\'\\'\'
重拨端
返回拆分(s)
端功能
为了使这种方法起作用,必须使用
+cmdline\u compl
功能。查看其他Anwer,无需脚本即可完成
进入插入模式,然后按
<C-R>=
这应该将每个环境变量放在不同的行上。根据ib的想法和ZyX的评论,我最终使用了以下函数:
function! GetEnvVars()
silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>"
endfunction
函数!GetEnvVars()
静默执行“正常:返回$\”)\\\\split('\'
端功能
前面的答案已被vimscriptenviron()函数废弃
例如,要按顺序列出它们,请执行以下操作:
:let evars = environ()
:for var in evars->keys()->sort()
: echo var . '=' . evars[var]
:endfor
可能会有帮助,所以您正在查找vim继承的环境变量的完整列表,或者您正在查找vim自己(自己)创建的所有环境变量?据我所知,仅通过Vim是不可能做到这一点的。但是,在类似Unix的系统中,可以只使用:!env
。Tarek Fadel:正如我的问题中所指出的,我对两者都感兴趣。Vim也将两者都称为环境变量。Ingo Karkat:谢谢。交互式对我来说很好。可以捕获命令行的完整性n使用:redir
。不过,这需要一个非常简单的技巧。如果有兴趣,请查看我的。最好将echo
更改为return
:这对我很有效:执行“fu!Test()\nexe'silent normal!:return$\'\\\\\\\split('.\'.\\\\n\\'\nendfu'
。
function! GetEnvVars()
silent execute "normal! :return $\<C-a>')\<C-b>\<C-right>\<Right>\<Del>split('\<CR>"
endfunction
:let evars = environ()
:for var in evars->keys()->sort()
: echo var . '=' . evars[var]
:endfor