我正在做类似
的事情:let foo="bar"
:echom foo
bar
:w foo
"foo" [New File] 0 lines, 0 characters written
我期待/希望写一个名为" bar"的文件,而不是一个名为" foo"的文件。假设我有一个存储在变量" foo"中的字符串,如何将当前缓冲区写入名称为该字符串的文件?
顺便说一句,有人可以解释:w foo
和:echom foo
在foo
方面的做法有何不同?
答案 0 :(得分:4)
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中。