我对vim很新,而且我很难用vim脚本来理解一些细微之处。具体来说,我在使用期望不带引号的字符串的命令时遇到问题(这是否有名称?)。例如
cd some/unquoted/string/path
问题是我想传递一个变量,但是要调用
let pathname = 'some/path'
cd pathname
将尝试将当前目录更改为“pathname”而不是“some / path”。解决这个问题的一种方法是使用
let cmd = 'cd ' . pathname
execute cmd
但这似乎有点迂回。 This StackOverflow question实际上将cd
与变量一起使用,但它在我的系统上不起作用(“a:path”被视为上述路径)。
我使用cd
作为具体示例,但此行为并非cd
唯一;例如,edit
命令也以这种方式运行。 (这种命令有名称吗?)
答案 0 :(得分:20)
TL; DR :使用execute 'cd' fnameescape(pathname)
解释:许多以文件名作为参数的基本命令都支持反引号语法:
command `shell command`
或
command `=vim_expression`
所以你的例子可以写成
cd `=pathname`
如果您在受控环境中运行它。您不得在插件中使用此变体,因为a)&wildignore
设置可能会妨碍您:set wildignore=*|cd
会使=pathname
=pathname
失败,无论是什么存储在cd
和b)中如果pathname包含换行符,它将被拆分为两个或多个目录。因此,您应该用于您想要共享的任何代码段
pathname
请注意,您不能使用execute 'cd' fnameescape(pathname)
,因为它不关心路径名中的特殊字符(例如,空格)。
答案 1 :(得分:4)
Vim中的基本命令从不对变量进行任何处理(如何知道你不是要改为路径名目录而不是某些/路径目录?)。你不必像你建议的那样迂回,你可以这样做:
exe 'cd' pathname
请注意exe
自动将参数与空格连接,因此不必须这样做:
exe 'cd ' . pathname
答案 2 :(得分:0)
很久以前我写了plugin (function FixPathName()
来解决这类问题。现在,当路径需要与外部命令一起使用时,vim有一些新功能,如shellescape()
。