将 vim gf 命令与“@”webpack 别名一起使用

Using vim gf command with "@" webpack alias

我经常使用带有“@”字符的 Vuejs 和 Webpack 来进行文件解析,就像这样

import MyComponent from "@/components/MyComponent.vue";

但是,我无法使用 vim gf 命令移动到这个文件。

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

我花了几个小时谷歌搜索,弄乱 vim 路径和 includeexpr。我也尝试了几个插件,比如 vim-nprvim-gotofile.

有没有人遇到过同样的问题并找到了解决办法?

编辑

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

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

中找到它,他们为此使用了 ~ 字符。但是它不适用于 @。尝试 gf

时出现此错误

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

我的解决方案

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

中都进行了设置
setlocal isfname+=@-@
setlocal includeexpr=substitute(v:fname,'^@\/','src/','')

感谢您的帮助!

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

但是@在任何方面都不是特别的,所以没有必要转义它:

setlocal includeexpr=substitute(v:fname,'^@\/','src/','')

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

Actual string v:fname After includeexpr Outcome
@/foo/bar.vue /foo/bar.vue /foo/bar.vue Not found

解决办法是@加上isfname:

setlocal isfname+=@-@

这给了我们:

Actual string v:fname After includeexpr Outcome
@/foo/bar.vue @/foo/bar.vue src/foo/bar.vue Found

经测试可与 $ vim -Nu NONE file.js 一起使用。

现在,上面的设置是特定于文件类型的,最好将它们放在 ftplugin 中。假设你的缓冲区的 filetypejavascript,一个合适的位置应该是:

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

" on Windows
%USERPROFILE%\vimfiles\after\ftplugin\javascript.vim

YMMV.


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