如何在 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 端即时转换。我最终放弃了,因为副作用太多——比如不正确的文件类型检测。这个想法是听 BufCreate
and/or BufNewFile
事件来打开正确的文件并关闭无效的文件。这是一个试图正确打开 file:lineno
的 plugin -- 但有副作用 :(
因为我的大部分用例都是在 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
安装了 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 端即时转换。我最终放弃了,因为副作用太多——比如不正确的文件类型检测。这个想法是听 BufCreate
and/or BufNewFile
事件来打开正确的文件并关闭无效的文件。这是一个试图正确打开 file:lineno
的 plugin -- 但有副作用 :(
因为我的大部分用例都是在 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