Vim - 在 vi​​mscript 变量中写入文件名

Bak*_*kot 5 vim

我正在做类似的事情

: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吗?

Ing*_*kat 6

Vimscript 评估规则

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)