在 MacVim 中,为什么在有 "filetype plugin indent on" 时我不能使用 gf 命令转到文件?

In MacVim, why can't I goto a file with the gf command when having "filetype plugin indent on"?

我正在使用 MacVim 版本 8.2.3455 (172)

我有一个 ruby 文件 vim_test.rb 只有一行代码。

require 'vim_test/core'

vim_test/core.rb 文件存在并且只有一条评论。

我执行以下操作:

  1. 我导航到包含 vim_test.rb 文件的目录并启动 MacVim mvim vim_test.rb

  2. 我 运行 :set suffixesadd+=.rb 命令。

  3. 我将光标放在 require 指令 (vim_test/core) 指定的文件上,然后按 gf.

我收到此错误 E345:无法在路径 .

中找到文件“vim_test/core.rb”

要解决这个问题,我必须在 .vimrc 中注释掉以下行,保存并重新启动 MacVim:

" filetype plugin indent on

现在,当我按照与以前完全相同的步骤操作时,我可以跳转到 vim_test/core.rb 文件。

有什么方法可以在我的 .vimrc 中包含 filetype plugin indent on 并使用 gf 转到由 require 指令指定的文件?

谢谢。

:help gf 通过在 :help 'path'.

中列出的目录中搜索光标下的文件名来工作

默认情况下,path的值为.,/usr/include,,,这意味着Vim将搜索:

  • 当前文件的目录,即.,
  • /usr/include,对你没用,
  • 工作目录,即,,

这与您的示例非常相配。

现在,filetype plugin indent on 告诉 Vim 启用文件类型检测、文件类型插件和特定于文件类型的缩进。此处的问题是 Ruby 文件类型插件努力定位系统中可能隐藏 Ruby 库的所有位置,然后将 path 选项设置为该列表。例如,这是我在我的机器上得到的(YMMV):

/Library/Ruby/Site/2.3.0,/Library/Ruby/Site/2.3.0/x86_64-darwin18,/Library/Ruby/Site/2.3.0/universal-darwin18,/Library/Ruby/Site,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/vendor_ruby/2.3.0,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/vendor_ruby/2.3.0/x86_64-darwin18,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/vendor_ruby/2.3.0/universal-darwin18,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/vendor_ruby,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/x86_64-darwin18,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/universal-darwin18

这可能很有用,但缺少允许在当前文件目录中搜索的 . 和允许在工作目录中搜索的 ,,

事实上,returns 值用于 path 的函数做了一些非常奇怪的事情:如果 path 的当前全局值不是' t 默认值,它附加上面的目录列表,但是,如果全局值 默认值,它只是 returns 上面的列表。我无法完全理解这个推理。

此外,同一个 ftplugin 映射 gf 到一些聪明的函数,这使得它更加复杂和不直观。

我能看到的唯一解决方法是更改​​ vimrc 中的全局 path,使 Ruby ftplugin appends 上面的列表到现有的 path 值,而不是 用该列表覆盖 它。

以下片段:

set path+=,,

在 Ruby 缓冲区中获取以下 path

.,/usr/include/,,,,,/Library/Ruby/Site/2.3.0,/Library/Ruby/Site/2.3.0/x86_64-darwin18,/Library/Ruby/Site/2.3.0/universal-darwin18,/Library/Ruby/Site,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/vendor_ruby/2.3.0,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/vendor_ruby/2.3.0/x86_64-darwin18,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/vendor_ruby/2.3.0/universal-darwin18,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/vendor_ruby,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/x86_64-darwin18,/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/universal-darwin18

这使得 gf 按预期工作。

但是首先不需要这样的 hack。我认为有问题。