【问题标题】:Using vim gf command with "@" webpack alias使用带有 "@" webpack 别名的 vim gf 命令
【发布时间】:2025-12-19 14:45:17
【问题描述】:

我经常使用带有“@”字符的 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/','')

another * thread 中找到它,他们在那里使用~ 字符。但是它不适用于@。尝试gf时出现此错误

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

我的解决方案

在@romainl 的帮助下,我现在在after/ftplugin/vue.vimafter/ftplugin/javascript.vim 中都进行了设置

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

感谢您的帮助!

【问题讨论】:

  • 这是一个编程 QA 站点,因此您在“搞乱 vim 路径和includeexpr”时提出的代码是您问题中最重要的部分。它现在不见了。
  • 很公平!到目前为止,我用我最好的想法更新了我的问题(这不起作用)

标签: vue.js webpack vim


【解决方案1】:

在链接的问题中,~ 被转义,因为~ 对于 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。正确的模式是^\~

【讨论】:

  • 是的,这是有道理的。但是,它仍然找不到该文件。 " in after/ftplugin/javascript.vim 是什么意思?
  • 该特定选项的特定值是特定于文件类型的,因此它应该在 ftplugin 中。如果您的filetypefoo,那么正确的位置是after/ftplugin/foo.vim 在您的vimfiles.vim 目录中。
  • 感谢您的解释。路径是.,/usr/include,,,**
  • 我再次用更多代码更新了帖子。我认为将@ 添加到v:fname 似乎不起作用
最近更新 更多