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-npr或vim-gotofile。
有没有人遇到过同样的问题并找到解决方案?
编辑
到目前为止我想到的最好的事情是:
:set inex=substitute(v:fname,'^\\@\/','src/','')
在另一个 stackoverflow 线程中找到了它,他们在那里使用~这个字符。但是它不适用于@. 我在尝试时收到此错误gf
E869: (NFA) Unknown operator '\@/'
我的解决方案
在 @romainl 的帮助下,我现在在after/ftplugin/vue.vim和after/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。正确的模式是^\~.