【问题标题】:Vim plugins don't always load?Vim 插件并不总是加载?
【发布时间】:2013-06-15 23:28:45
【问题描述】:

我试图将autoclose.vim 安装到 Vim。我注意到我没有~/.vim/plugin 文件夹,所以我不小心创建了一个~/.vim/plugins 文件夹(注意插件中的额外's')。然后我将au FileType python set rtp += ~/.vim/plugins 添加到我的.vimrc 中,因为根据我所阅读的内容,这将允许我自动获取该文件夹中的脚本。

插件没有为我加载,直到我意识到我的错误并从“插件”中取出多余的“s”。我很困惑,因为这个新路径甚至没有在我的运行时路径中定义。我基本上想知道为什么当我在~/.vim/plugin 中而不是~/.vim/plugins 中时加载了插件?

【问题讨论】:

  • 我很确定这仅仅是因为 ~/.vim/plugin 是预定义的,而 ~/.vim/plugins 不是。
  • 是的,这也是我的猜测。但是,假设我想要一个自定义目录来存储我的插件,我该怎么做呢?

标签: python vim plugins


【解决方案1】:

:help load-plugins 概述了插件的加载方式。

仅将文件夹添加到您的rtp 是不够的;它必须有一个plugin 子目录。例如,给定:set rtp+=/tmp/foo,文件/tmp/foo/plugin/bar.vim 将被检测并加载,但/tmp/foo/plugins/bar.vim/tmp/foo/bar.vim 都不会。

【讨论】:

    【解决方案2】:

    您在 set rtp+=... 上走在了正确的轨道上,但它还有更多的东西(rtp 是非递归的,帮助索引,许多极端情况),所以它不是一个好主意自己做。除非您准备好迎接长达数月的生产力下降。

    如果您想将所有插件存储在一个特殊目录中,您应该使用适当的runtimepath/plugin-management 解决方案。我建议Pathogen (rtp-manager) 或Vundle (plugin-manager),但还有很多其他的。

    【讨论】:

      【解决方案3】:

      除了@Nikita Kouevda 回答:在FileType 事件上修改rtp 可能为时已晚,vim 无法从修改后的运行时路径加载任何插件:如果此事件是在获取 vimrc 之后启动的,则不能保证插件来自将加载新添加的内容;如果此事件在VimEnter 事件之后启动,则保证新添加的插件不会自动获取。

      如果您想source仅在编辑 python 文件时自动关闭,您应该使用:au FileType python :source ~/.vim/macros/autoclose.vim(注意:macros 或除plugin 和在$VIMRUNTIME 中找到的目录之外的任何其他子目录或甚至在 runtimepath 中根本找不到任何目录)。

      如果您想使用仅在编辑 python 文件时自动关闭,您应该查看插件源和文档,插件方面必须有支持才能工作。

      // 或者,如果 autoclose 不支持这一点,则使用上述段落中的 :au FileType 命令,但在 source 前面加上记录 vim 状态(命令、映射和自动命令)的内容,在 source 后面附加相同的内容,找到如果文件类型不是 python,则删除状态差异并删除每个 :au BufEnter 上的差异,否则恢复它们:hacky 并且可能会引入奇怪的错误。状态记录和差异确定代码的示例可以在here找到。

      【讨论】:

      • 我发现加载特定语言插件的一种更简单的方法是将它们放入.vim/ftplugin 文件夹中。所以如果我只想使用自动关闭,那么我会把它放在ftplugin/python 中。我对其进行了测试,它仅适用于 python 文件类型。你的 .vimrc 中还必须有 filetype plugin on。对于任何全局插件,我将它们放在我的 .vim/plugin 文件夹中。
      • @Fumbster 与:au FileType 的解决方案完全相同。它会在你编辑 python 文件时source 插件,但是一旦你将它作为一个全局插件,你将为你编辑的所有后续文件启用它。我强烈建议不要对此类插件使用ftplugin/python,因为它违反语义:定义全局映射的插件不是文件类型插件,一旦启用,它们将适用于任何随后加载的文件,因此它们在语义上属于与matchit.vim 相同的目录(未自动加载的全局插件)。
      • @Fumbster * 当然,我的意思是“您在在同一个 vim 会话中编辑的所有后续文件。”
      • 有趣。除了手动编辑插件文件上的全局映射之外,是否没有解决方法?我只是假设性地问,因为我没有实际这样做的意图。
      • 对。感谢您的帮助。
      【解决方案4】:

      rtp(运行时路径)选项中的所有文件夹都需要与您的$VIMRUNTIME 具有相同的文件夹结构($VIMRUNTIME 通常为/usr/share/vim/vim{version})。所以它应该有相同的子目录名称,例如autoloaddocplugin(无论您需要哪个,但名称相同是关键)。插件应该在其相应的子目录中。

      假设您有/path/to/dir(在您的情况下是~/.vim)在您的rtpvim

      • /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 的任何位置找到同名子目录。

      【讨论】:

      • 谢谢。这有助于我更清楚地理解运行时路径。你是对的;事实证明我使用了plugins 而不是plugin,这不是 Vim 可识别的文件夹。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2012-08-10
      • 2013-06-25
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多