在Windows中,当光标以/cygdrive/开头时,如何在Vim/Gvim中编辑光标下的文件名
安装了cygwin64,并单独安装了Gvim 8.0.2。 我可以在bash提示符下打开一个文件,如下所示:在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
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:/”,“)