使用 vim gf 命令和“@”webpack 别名

luk*_*ann 7 vim webpack vue.js

我经常使用 Vuejs 和 Webpack 以及“@”字符进行文件解析,如下所示

import MyComponent from "@/components/MyComponent.vue";
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用 vimgf命令移动到该文件。

E447: Can't find file "/components/MyComponent.vue" in path

我花了几个小时谷歌搜索,搞乱了 vim 路径和includeexpr. 我还尝试了几个插件,例如vim-nprvim-gotofile

有没有人遇到过同样的问题并找到解决方案?

编辑

到目前为止我想到的最好的事情是:

:set inex=substitute(v:fname,'^\\@\/','src/','')

在另一个 stackoverflow 线程中找到了它,他们在那里使用~这个字符。但是它不适用于@. 我在尝试时收到此错误gf

E869: (NFA) Unknown operator '\@/'

我的解决方案

在 @romainl 的帮助下,我现在在after/ftplugin/vue.vimafter/ftplugin/javascript.vim

setlocal isfname+=@-@
setlocal includeexpr=substitute(v:fname,'^@\/','src/','')
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

rom*_*inl 10

在链接的问题中,~被转义,因为~对于 Vim 的正则表达式引擎有特殊含义:“匹配最后给定的替换字符串”。

@无论如何都不特殊,所以没有必要转义它:

setlocal includeexpr=substitute(v:fname,'^@\/','src/','')
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,还有另一个问题。Vim 使用:help 'isfname'来定义v:fname,但默认情况下该选项的值不包含该@字符,因此它被排除在 之外v:fname。由于没有@in v:fname,因此 in 的模式substitute()不匹配,我们最终得到:

实际字符串 v:fname includeexpr 结果
@/foo/bar.vue /foo/bar.vue /foo/bar.vue 未找到

解决方案是添加@isfname

setlocal isfname+=@-@
Run Code Online (Sandbox Code Playgroud)

这给了我们:

实际字符串 v:fname includeexpr 结果
@/foo/bar.vue @/foo/bar.vue src/foo/bar.vue 成立

经测试可与$ vim -Nu NONE file.js.

现在,上面的设置是特定于文件类型的,最好将它们放在 ftplugin 中。假设filetype您的缓冲区是javascript,正确的位置是:

" on Unix-like systems
~/.vim/after/ftplugin/javascript.vim

" on Windows
%USERPROFILE%\vimfiles\after\ftplugin\javascript.vim
Run Code Online (Sandbox Code Playgroud)

YMMV。


请注意,在链接问题的答案中,^\\~是不正确的并且会引发错误E874。正确的模式是^\~.