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

Ton*_* Yu 11 vim

我对vim很新,而且我很难用vim脚本来理解一些细微之处.具体来说,我在使用期望不带引号的字符串的命令时遇到问题(这是否有名称?).例如

cd some/unquoted/string/path
Run Code Online (Sandbox Code Playgroud)

问题是我想传递一个变量,但是要调用

let pathname = 'some/path'
cd pathname
Run Code Online (Sandbox Code Playgroud)

将尝试将当前目录更改为"pathname"而不是"some/path".解决这个问题的一种方法是使用

let cmd = 'cd ' . pathname
execute cmd
Run Code Online (Sandbox Code Playgroud)

但这似乎有点迂回.这个StackOverflow问题实际上cd与变量一起使用,但它在我的系统上不起作用("a:path"被视为如上所述的路径).

我正在使用cd作为一个具体的例子,但这种行为并不是唯一的cd; 例如,该edit命令也以这种方式运行.(这种命令有名称吗?)

ZyX*_*ZyX 20

TL; DR:使用execute 'cd' fnameescape(pathname)

说明:许多将文件名作为参数的基本命令支持反引号语法:

command `shell command`
Run Code Online (Sandbox Code Playgroud)

要么

command `=vim_expression`
Run Code Online (Sandbox Code Playgroud)

所以你的例子可能写成

cd `=pathname`
Run Code Online (Sandbox Code Playgroud)

如果你在受控环境中运行它.你不能在插件中使用这个变体,因为a)有一些&wildignore设置可能会妨碍你:无论存储在什么内容都会失败.b)如果pathname包含换行符,它将被分成两个或多个目录.因此,您应该用于您想要分享的任何代码段set wildignore=*|cd =pathnamecdpathname

execute 'cd' fnameescape(pathname)
Run Code Online (Sandbox Code Playgroud)

请注意,您不能使用execute "cd" pathname它,因为它不关心路径名中的特殊字符(例如,空格).


DrA*_*rAl 5

Vim 中的基本命令从不处理任何变量(它怎么知道您不是要更改到路径名目录而不是 some/path 目录?)。你不必像你建议的那样迂回,你可以这样做:

exe 'cd' pathname
Run Code Online (Sandbox Code Playgroud)

请注意,exe自动将参数与空格连接起来,因此您不必执行以下操作:

exe 'cd ' . pathname
Run Code Online (Sandbox Code Playgroud)