我正在做类似的事情
:let foo="bar"
:echom foo
bar
:w foo
"foo" [New File] 0 lines, 0 characters written
Run Code Online (Sandbox Code Playgroud)
我期待/希望编写一个名为“bar”的文件,而不是一个名为“foo”的文件。假设我有一个字符串存储在变量“foo”中,如何将当前缓冲区写入名称为该字符串的文件?
顺便说一句,有人可以解释一下什么:w foo和:echom foo正在做的不同foo吗?
Vimscript 的计算方式与在命令行中键入的 Ex 命令完全相同:。中没有变量ex,因此无法指定它们。以交互方式键入命令时,您可能会使用<C-R>=插入变量内容:
:sleep <C-R>=timetowait<CR>m<CR>
Run Code Online (Sandbox Code Playgroud)
...但在脚本中,:execute必须使用。Ex 命令的所有文字部分都必须加引号(单引号或双引号),然后与变量连接:
execute 'sleep' timetowait . 'm'
Run Code Online (Sandbox Code Playgroud)
像:execute上面一样,该:echo[msg命令的特殊之处在于它接受一个可变参数,而大多数命令(如:write)不接受,并且按字面处理参数。
如上所述,您的问题最好通过execute以下方式解决:
:execute 'write' foo
Run Code Online (Sandbox Code Playgroud)
但是,请注意,如果foo包含任何常规文件名,它仍然需要为函数进行转义,该:write函数理解一些特殊符号(例如%代表当前缓冲区名称),并且喜欢对空格进行转义:
:execute 'write' fnameescape(foo)
Run Code Online (Sandbox Code Playgroud)