Vim:`cd`到存储在变量中的路径

时间:2011-01-04 18:16:12

标签: vim

我对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命令也以这种方式运行。 (这种命令有名称吗?)

3 个答案:

答案 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()