Vim插件不总是加载?

3
我正在尝试将`autoclose.vim`安装到Vim中。我注意到我没有一个`~/.vim/plugin`文件夹,所以不小心创建了一个`~/.vim/plugins`文件夹(注意plugins后面多了个's')。然后我在我的`.vimrc`中添加了`au FileType python set rtp += ~/.vim/plugins`,因为据我所读,那样可以让我自动引用该文件夹中的脚本。
插件直到我意识到错误并从“plugins”中取出额外的“s”之后才对我加载。我感到困惑,因为这条新路径甚至没有在我的运行时路径中定义。我基本上想知道为什么当我将其放在`~/.vim/plugin`而不是`~/.vim/plugins`中时,插件没有加载?

1
我相信这很简单,因为~/.vim/plugin是预定义的,而~/.vim/plugins不是。 - Rubens
是的,那也是我的猜测。不过,假设我想要一个自定义目录来存储我的插件,我该怎么做呢? - Fumbster
4个回答

6

:help load-plugins介绍了插件的加载方式。

仅将文件夹添加到rtp是不够的,还需要一个plugin子目录。例如,给定:set rtp+=/tmp/foo命令,文件/tmp/foo/plugin/bar.vim将被检测并加载,但/tmp/foo/plugins/bar.vim/tmp/foo/bar.vim则不会被加载。


3
你在使用set rtp+=...方面是正确的,但它比表面上看起来更复杂(rtp是不递归的、帮助索引和有很多特殊情况),所以自己处理这个问题并不是一个好主意,除非你愿意减少数月的生产力。
如果你想要将所有插件存储在一个特定的目录中,你应该使用适当的runtimepath/插件管理解决方案。我建议使用Pathogenrtp管理器)或者Vundle(插件管理器),但还有其他许多选择。

2
除了@Nikita Kouevda的回答之外:在FileType事件上修改rtp可能太晚了,导致vim无法从修改后的运行时路径加载任何插件:如果此事件在vimrc被源化之后启动,则不能保证新添加的插件将被加载;如果此事件在VimEnter事件之后启动,则可以保证不会自动源化来自新添加的插件。
如果您想仅在编辑python文件时源化autoclose,您应该使用:au FileType python :source ~/.vim/macros/autoclose.vim(注意:macros或任何其他子目录除外plugin和在$VIMRUNTIME中找到的目录,甚至是在运行时路径中未找到的任何目录)。
如果您想仅在编辑python文件时使用autoclose,请查看插件源代码和文档,插件端必须支持才能正常工作。
// 或者,如果autoclose不支持此功能,则使用上面段落中的:au FileType命令,在source前加上记录vim状态(命令、映射和自动命令),在source后加上相同的内容,在每个:au BufEnter上查找状态的差异,如果文件类型不是python,则删除差异并恢复它们:这种方法可能会引入奇怪的错误。状态记录和差异确定代码的示例可以在此处找到。

1
我发现一种更简单的加载特定语言插件的方法是将它们放入.vim/ftplugin文件夹中。因此,如果我只想使用autoclose,则将其放在ftplugin/python中。我测试了一下,它只适用于python文件类型。您还必须在您的.vimrc中添加filetype plugin on。对于任何全局插件,我将它们放在.vim/plugin文件夹中。 - Fumbster
@Fumbster 这与 :au FileType 的解决方案完全相同。当您编辑Python文件时,它将插件,但作为全局插件,一旦您源它,您将启用它以供您编辑的所有后续文件使用。我强烈建议不要使用 ftplugin/python 来进行此类插件,因为这是语义违规:定义全局映射的插件不是文件类型插件,一旦启用,它们将适用于任何随后加载的文件,因此它们在语义上属于与 matchit.vim 相同的目录(未自动加载的全局插件)。 - ZyX
@Fumbster * 当然,我的意思是“在同一个vim会话中编辑的所有后续文件。” - ZyX
有意思。除了手动编辑插件文件上的全局映射之外,没有其他解决方法吗?我只是在假设,实际上我没有这样做的意图。 - Fumbster

1
所有在rtp(运行时路径)选项中的文件夹都需要具有与您的$VIMRUNTIME相同的文件夹结构($VIMRUNTIME通常为/usr/share/vim/vim{version})。因此,它应该具有相同的子目录名称,例如autoloaddocplugin(您需要哪个就使用哪个,但具有相同的名称是关键)。插件应位于其对应的子目录中。
假设您的/path/to/dir(在您的情况下为~/.vim)在您的rtp中,vim将会:
  • /path/to/dir/plugin中查找全局插件
  • /path/to/dir/ftplugin中查找文件类型插件
  • /path/to/dir/syntax中查找语法文件
  • /path/to/dir/doc中查找帮助文件
等等...

vim 只会查找 /path/to/dir 中的一些被认可的子目录。如果你有一些未被认可的子目录名称(比如 /path/to/dir/plugins),vim 就不会看到它。

这里的“被认可”意味着同名的子目录可以在 /usr/share/vim/vim{version} 或者你安装 vim 的任何位置找到。


1
谢谢你的帮助。这让我更清楚地理解了运行时路径。你是正确的;事实证明,我使用了 plugins 而不是 plugin,这不是 Vim 可识别的文件夹。 - Fumbster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接