在Vim中,如何将文件保存到变量中存储的路径?

在Vim中,如何将文件保存到变量中存储的路径?,vim,Vim,这在脚本中: :let s:submission_path = expand("%:p:h") . '\submissions\test_submission.csv' :echo s:submission_path :write s:submission_path 脚本引发错误“无法打开文件进行写入”,因为我在windows上,“:”不是有效的文件名字符。如果我将变量命名为“submission_path”,则会写入具有该名称的文件(编辑:并且文件的内容与我预期的一样,脚本正在编辑的缓冲区的

这在脚本中:

:let s:submission_path = expand("%:p:h") . '\submissions\test_submission.csv'
:echo s:submission_path
:write s:submission_path
脚本引发错误“无法打开文件进行写入”,因为我在windows上,“:”不是有效的文件名字符。如果我将变量命名为“submission_path”,则会写入具有该名称的文件(编辑:并且文件的内容与我预期的一样,脚本正在编辑的缓冲区的内容)

我不明白。写入之前的echo命令执行我期望的操作,输出我要写入的文件的完整路径。但是write似乎忽略了变量值,而是使用它的名称?我是否需要以某种方式取消引用它

试试这个:

:let s:submission_path = expand("%:p:h") . '\submissions\test_submission.csv'
:echo s:submission_path
:execute "write " . s:submission_path

Execute将允许您使用字符串操作编写一个ex命令,然后执行它。

vim有非常复杂的求值规则(您只需要学习它们)
write
不接受表达式,而是接受字符串,因此
s:submission\u path
按字面意思处理
write
。但是,
echo
会评估其参数,因此会评估
s:submission\u path

要执行所需操作,需要使用
执行
命令

exec 'write' s:submission_path

环境变量没有这个问题,但您必须像在unix中那样用美元符号取消对它们的引用:

:let $submission_path = expand("%:p:h") . '\submissions\test_submission.csv'
:echo $submission_path
:write $submission_path

它会在vim过程中修改您的环境,所以请注意。

谢谢,就是这样。最后,写相对路径“write../submission\u path/new\u submission.csv”会更容易,但我真的被这个问题难住了——我想我无法相信行为会不一致。这也很方便,但我正在寻找使用局部变量的方法——不是因为现在的特定原因,而是为了知道未来。