在Windows中,当光标以/cygdrive/开头时,如何在Vim/Gvim中编辑光标下的文件名

在Windows中,当光标以/cygdrive/开头时,如何在Vim/Gvim中编辑光标下的文件名,vim,cygwin,Vim,Cygwin,安装了cygwin64,并单独安装了Gvim 8.0.2。 我可以在bash提示符下打开一个文件,如下所示: gvim /cygdrive/c/Temp/foo.txt /cygdrive/c/Temp/foo.txt 这是因为我的脚本使用cygpath-w/cygdrive/c/Temp/foo.txt将路径转换为其windows窗体,最后调用gvim.exe c:\Temp\foo.txt 但是,在Gvim中,当我的光标位于这样一条线上时: gvim /cygdrive/c/Temp/f

安装了cygwin64,并单独安装了Gvim 8.0.2。 我可以在bash提示符下打开一个文件,如下所示:

gvim /cygdrive/c/Temp/foo.txt
/cygdrive/c/Temp/foo.txt
这是因为我的脚本使用
cygpath-w/cygdrive/c/Temp/foo.txt
将路径转换为其windows窗体,最后调用
gvim.exe c:\Temp\foo.txt

但是,在Gvim中,当我的光标位于这样一条线上时:

gvim /cygdrive/c/Temp/foo.txt
/cygdrive/c/Temp/foo.txt
我输入
f
,我在Gvim中得到这个错误文本:

E447: Can't find file "/cygdrive/c/Temp/foo.txt" in path

在Windows下的Gvim标准安装中,我必须做些什么才能使其正常工作?

过去,我曾尝试从vim端动态转换。我最终放弃了,因为有太多的副作用——比如不正确的文件类型检测。我们的想法是监听
BufCreate
和/或
BufNewFile
事件以打开正确的文件并关闭无效的文件。下面是一个尝试正确打开
文件的示例:lineno
——但有副作用:(

由于我的大多数用例都是在quickfix窗口中打开文件名,所以我首先提出了一个,然后将其移动到中。

看看它的功能。您可以开发一个插件,用于基于它转换
/cygdrive/…
路径

您可以使用
/cygdrive/*
,然后在Vimscript(
substitute()
)中转换路径,或者通过
system()
调用外部
cygpath
工具,而不是挂接到
*:*
模式中


然后,插件用正确的文件名替换无效的当前缓冲区,并将其加载。

您可以使用
'includeexpr'
修改找到的路径:

set includeexpr=substitute(v:fname,'/cygdrive/c','C:/','')
这将打开
C:/Temp/foo.txt


请参见
:help gf
:help'includeexpr'

创建硬链接,使这些/cygdrive/c/path==/c/path==c:/path在NTFS中等效:

start > cmd > 
mkdir c:\cygdrive
mklink /D c:\cygdrive\c c:\
mklink /D c:\cygdrive\d d:\

cd c:\cygwin64
mklink /D c /cygdrive/c
mklink /D d /cygdrive/d
如上所述,对于gf,请参见vimrc

set includeexpr=substitute(v:fname,'^/cygdrive/\\(\\w\\)/','\\1:/','') 
测试:


为了处理多个驱动器号,我将这一行放入了我的_vimrc:
set includeexpr=substitute(v:fname,“\\”(^/cygdrive/\\)\(.\\),“\\2:/”,“)