将 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-npr
或 vim-gotofile
.
有没有人遇到过同样的问题并找到了解决办法?
编辑
到目前为止我想到的最好的事情是:
:set inex=substitute(v:fname,'^\@\/','src/','')
在 中找到它,他们为此使用了 ~
字符。但是它不适用于 @
。尝试 gf
时出现此错误
E869: (NFA) Unknown operator '\@/'
我的解决方案
在@romainl 的帮助下,我现在在 after/ftplugin/vue.vim
和 after/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 中。假设你的缓冲区的 filetype
是 javascript
,一个合适的位置应该是:
" on Unix-like systems
~/.vim/after/ftplugin/javascript.vim
" on Windows
%USERPROFILE%\vimfiles\after\ftplugin\javascript.vim
YMMV.
请注意,在链接问题的答案中,^\~
不正确并引发错误 E874
。正确的模式是 ^\~
.
我经常使用带有“@”字符的 Vuejs 和 Webpack 来进行文件解析,就像这样
import MyComponent from "@/components/MyComponent.vue";
但是,我无法使用 vim gf
命令移动到这个文件。
E447: Can't find file "/components/MyComponent.vue" in path
我花了几个小时谷歌搜索,弄乱 vim 路径和 includeexpr
。我也尝试了几个插件,比如 vim-npr
或 vim-gotofile
.
有没有人遇到过同样的问题并找到了解决办法?
编辑
到目前为止我想到的最好的事情是:
:set inex=substitute(v:fname,'^\@\/','src/','')
在 ~
字符。但是它不适用于 @
。尝试 gf
E869: (NFA) Unknown operator '\@/'
我的解决方案
在@romainl 的帮助下,我现在在 after/ftplugin/vue.vim
和 after/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 中。假设你的缓冲区的 filetype
是 javascript
,一个合适的位置应该是:
" on Unix-like systems
~/.vim/after/ftplugin/javascript.vim
" on Windows
%USERPROFILE%\vimfiles\after\ftplugin\javascript.vim
YMMV.
请注意,在链接问题的答案中,^\~
不正确并引发错误 E874
。正确的模式是 ^\~
.