Vim - 在vimscript变量中写入文件名

时间:2014-05-26 04:57:14

标签: vim

我正在做类似

的事情
:let foo="bar"
:echom foo
bar
:w foo
"foo" [New File] 0 lines, 0 characters written

我期待/希望写一个名为" bar"的文件,而不是一个名为" foo"的文件。假设我有一个存储在变量" foo"中的字符串,如何将当前缓冲区写入名称为该字符串的文件?

顺便说一句,有人可以解释:w foo:echom foofoo方面的做法有何不同?

2 个答案:

答案 0 :(得分:4)

Vimscript评估规则

Vimscript的评估方式与:命令行中输入的Ex命令完全相同。 ex中没有变量,因此无法指定它们。以交互方式键入命令时,您可能使用<C-R>=来插入变量内容:

:sleep <C-R>=timetowait<CR>m<CR>

...但在脚本中,必须使用:execute。必须引用Ex命令的所有文字部分(单引号或双引号),然后与变量连接:

execute 'sleep' timetowait . 'm'

与上面的:execute类似,:echo[msg命令的特殊之处在于它需要一个变量参数,而大多数命令(如:write)都没有,并且从字面上看待论据。

您的特定问题

如上所述,您的问题最好通过execute解决:

:execute 'write' foo

但请注意,如果foo包含任何常规文件名,则:write函数仍然需要转义,它会理解一些特殊符号(例如{{1}代表当前缓冲区名称),并且喜欢转义空格:

%

答案 1 :(得分:0)

只有

:execute 'write ' . foo<CR>

:write <C-r>=foo<CR><CR>

做你想做的事。

变量可用于连接,案例1或表达式,案例2中。