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

How to edit file name under cursor in Vim/Gvim, when it starts with /cygdrive/ in Windows

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

gvim /cygdrive/c/Temp/foo.txt

之所以有效,是因为我的脚本使用 cygpath -w /cygdrive/c/Temp/foo.txt 将路径转换为 ​​windows 形式,最后调用 gvim.exe C:\Temp\foo.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 标准安装中正常工作?

过去,我确实尝试过从 vim 端即时转换。我最终放弃了,因为副作用太多——比如不正确的文件类型检测。这个想法是听 BufCreateand/or BufNewFile 事件来打开正确的文件并关闭无效的文件。这是一个试图正确打开 file:linenoplugin -- 但有副作用 :(

因为我的大部分用例都是在 quickfix windows 中打开文件名,所以我首先想到了 cygwin compiler plugin, then I moved it into build-tools-wrapper.

看看 file-line plugin 做了什么。你可以开发一个插件来根据它很容易地转换 /cygdrive/... 路径。

不是挂接到 *:* 模式,而是使用 /cygdrive/*,然后在 Vimscript (substitute()) 中或通过调用外部 cygpath 工具通过 system().

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

可以使用'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

和上面在 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