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



安装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

最新更新