Vim - 在 Vim 脚本变量中写入文件名

8
我正在做类似以下的事情:
:let foo="bar"
:echom foo
bar
:w foo
"foo" [New File] 0 lines, 0 characters written

我希望写一个名为“bar”的文件,而不是一个名为“foo”的文件。假设我有一个存储在变量“foo”中的字符串,如何将当前缓冲区写入名称为该字符串的文件?
另外,有人可以解释一下关于“foo”,:w foo:echom foo之间有什么不同吗?
2个回答

8

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函数进行转义,该函数可以理解一些特殊符号(例如%表示当前缓冲区名称),并且喜欢转义空格:

:execute 'write' fnameescape(foo)

4

:execute 'write ' . foo<CR>

并且

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

请随意操作。

变量可以用于拼接(情况1)或表达式(情况2)中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接