安装cygwin64,并单独安装Gvim 8.0.2。我可以像这样在bash提示符下打开一个文件:
gvim /cygdrive/c/Temp/foo.txt
它可以工作,因为我的脚本使用cygpath -w /cygdrive/c/Temp/foo.txt
将路径转换为windows形式,最后调用gvim.exe C:Tempfoo.txt
。
但是在Gvim中,当我的光标在这样的行上时:
/cygdrive/c/Temp/foo.txt
和我输入<Ctrl-W> f
,我得到这个错误文本在Gvim:
E447: Can't find file "/cygdrive/c/Temp/foo.txt" in path
我必须做什么才能在Windows下的Gvim标准安装中工作?
您可以使用'includeexpr'
修改找到的路径:
set includeexpr=substitute(v:fname,'/cygdrive/c','C:/','')
这将打开C:/Temp/foo.txt
。
参见:help gf
, :help 'includeexpr'
看一下文件行插件的功能。你可以很容易地开发一个插件来转换/cygdrive/...
路径。
您将使用/cygdrive/*
而不是挂钩到*:*
模式,然后转换路径,要么在Vimscript (substitute()
)中,要么通过system()
调用外部cygpath
工具。
插件然后将无效的当前缓冲区替换为正确的文件名,并加载该文件名。
过去,我确实尝试过从vim端动态转换。我最终放弃了,因为有太多的副作用——比如不正确的文件类型检测。我们的想法是监听BufCreate
和/或BufNewFile
事件来打开正确的文件并关闭无效的文件。这是一个插件,试图正确打开file:lineno
-但有副作用:(
由于我的大多数用例都是在快速修复窗口中打开文件名,因此我首先提出了cygwin编译器插件,然后将其移到build-tools-wrapper中。
创建硬链接,使这些/cygdrive/c/path ==/c/path == c:/path在NTFS中等效:
start > cmd >
mkdir c:cygdrive
mklink /D c:cygdrivec c:
mklink /D c:cygdrived d:
cd c:cygwin64
mklink /D c /cygdrive/c
mklink /D d /cygdrive/d
和上面在vimrc中为gf
set includeexpr=substitute(v:fname,'^/cygdrive/\(\w\)/','\1:/','')
测试: echo 123 > c:/x
C:cygwin64> ls -al c:/x /cygdrive/c/x /c/x
-rwxrwxrwx 1 ad None 6 Mar 26 21:47 /c/x
-rw-r--r-- 1 a Users 6 Mar 26 21:47 /cygdrive/c/x
-rw-r--r-- 1 a Users 6 Mar 26 21:47 c:/x