Vim:基于字符串的寻源

Vim:基于字符串的寻源,vim,Vim,在众多的Vim脚本在线教程中,我似乎找不到这个问题的答案。我要做的是从环境变量构造脚本的文件名,然后将其作为源代码。我想用Vim来做 如果我在壳里做,我会做这样的事情: source ${HOME}/.vim/myscript_${FOO}.vim 如何在Vim中执行此操作?您可以构建一个字符串,然后使用execute命令: exec“源代码”$家。“/.vim/myscript”。l:福。“.vim” (这里的l:foo是在函数中使用局部变量的示例。) 编辑: 但事实上,在这种特殊情况下

在众多的Vim脚本在线教程中,我似乎找不到这个问题的答案。我要做的是从环境变量构造脚本的文件名,然后将其作为源代码。我想用Vim来做

如果我在壳里做,我会做这样的事情:

source ${HOME}/.vim/myscript_${FOO}.vim

如何在Vim中执行此操作?

您可以构建一个字符串,然后使用execute命令:

exec“源代码”$家。“/.vim/myscript”。l:福。“.vim”
(这里的
l:foo
是在函数中使用局部变量的示例。)


编辑: 但事实上,在这种特殊情况下,
exec
是过分的。作为rampion,OPs任务可通过以下方式直接完成:

source $HOME/.vim/myscript_$FOO.vim
虽然vim不允许我们像在shell中一样将变量名整齐地包装在
${…}
中,但在这种情况下,我们很幸运
HOME
/
终止,而
FOO
终止

一般来说,如果要在其中一个变量后面加一个非终止字符,则需要执行
exec
。例如:

exec“源代码”$酒吧。“_script.vim”
将插入
BAR
变量,而下面将尝试查找名为
BAR\u script
的变量:

source $BAR_script.vim       " Possibly not what you wanted!
为了安全起见,请使用shellescape() 在向要执行的字符串添加变量时,我们应该真正使用
shellescape()
来转义奇怪的字符(例如文件名中的空格)

例如,这些是上述的更安全版本:

exec "source " . shellescape($HOME . "/.vim/myscript_" . l:foo) . ".vim"

exec "source " . shellescape($BAR) . "_script.vim"

只是
:source
适合我:

% export MYPATH='a/b/c'
% mkdir -p $MYPATH
% export MYFILE='temp.vim'
% cat > $MYPATH/$MYFILE
echo 'hello world'
^D
% vim
:source $MYPATH/$MYFILE
hello world
如果您想自动获取一些vim脚本,只需将它们粘贴到
~/.vim/plugin/
目录中,它们就可以为您加载,而无需手动执行

:help expand environment var
(这是我通过执行
:help environment
和制表符完成到第一个可能的结果得到的)

*:设置环境**扩展环境**扩展环境变量* 将展开特定字符串选项中的环境变量。如果 存在环境变量“$”和以下环境变量 名称将替换为其值。如果不存在“$”和名称 没有修改。可以使用任何非id字符(不是字母、数字或“"”) 跟随环境变量名。这个角色和接下来的是什么 附加到环境变量的值。示例:> :set term=$term.new :set path=/usr/$INCLUDE,$HOME/INCLUDE,。 使用“:set opt-=val”或“:set”从选项中添加或删除字符串时 opt+=val“扩展在添加或删除之前完成。
我倾向于发现vim的内置帮助比其他任何东西都更有用,但要知道要查找什么确实需要一段时间。

是的,我知道这是可行的,但您的脚本路径在一个非常具体的方面有所不同;您不需要将任何内容连接到环境变量!(+1)虽然马格纳斯最初说的是“环境变量”,但我认为他的意思是“vim变量”。rampion的解决方案在环境变量和连接方面确实适用于我:source$HOME/.vim/myscript_$FOO.vim如果你想偷偷摸摸的话,你可以将vim变量存储在环境变量中。 *:set_env* *expand-env* *expand-environment-var* Environment variables in specific string options will be expanded. If the environment variable exists the '$' and the following environment variable name is replaced with its value. If it does not exist the '$' and the name are not modified. Any non-id character (not a letter, digit or '_') may follow the environment variable name. That character and what follows is appended to the value of the environment variable. Examples: > :set term=$TERM.new :set path=/usr/$INCLUDE,$HOME/include,. When adding or removing a string from an option with ":set opt-=val" or ":set opt+=val" the expansion is done before the adding or removing.