vim插件目录优先级

时间:2018-12-19 17:35:53

标签: vim vim-plugin

在Debian上,插件位于/usr/share/vim/vim80中,但也位于用户家庭~/.vim中。如何处理冲突?假设有/usr/share/vim/vim80/ftplugin/tex.vim~/.vim/ftplugin/tex.vim,这是加载的?或修改给定插件的正确方法是什么(例如tex.vim)-修改/usr/...中的一个或将/usr/...中的一个复制到~/.vim/并在那里进行修改(我想避免在更新软件包时更改被覆盖)。

1 个答案:

答案 0 :(得分:0)

Vim配置具有特定的结构(plugin/syntax/等子目录),并且可以有多个基础目录承载这些配置树。 'runtimepath'选项会枚举所有基本目录,Vim从头到尾依次搜索它们,如:help load-plugins所述。

通常有一个用户特定的基本目录(~/.vim/)和默认的Vim运行时(/usr/share/vim/vim80中的内容),有时还有其他系统范围的位置。用户的配置优先,因此具有优先权。

插件冲突

那么,如果您为用户(在~/.vim/plugin/中)安装了与其他地方(例如内置netrw plugin)相同的插件,会发生什么情况?

~/.vim/plugin/netrwPlugin.vim/usr/share/vim/vim80/plugin/netrwPlugin.vim都一个接一个地执行。 (您可以使用:scriptnames进行检查。)那么,会发生什么?

请注意,大多数插件的顶部都有多个包含保护,始终采用类似的形式:

" Load Once: {{{1
if &cp || exists("g:loaded_netrwPlugin")
    finish
endif
let g:loaded_netrwPlugin = "v156"

该插件在首次运行时定义了一个保护变量(g:loaded_netrwPlugin)。在下一次运行时,已经定义了该全局变量,并且脚本执行在:finish处停止。这意味着用户定义的插件“获胜”(如'runtimepath'中的第一个插件),并且您可以覆盖系统范围的插件(例如,使用已下载的较新版本)。

这同样适用于 pack插件软件包管理器添加的插件目录。语法插件(b:current_syntax)和文件类型插件(b:did_ftplugin)存在类似的区别,区别在于它们不会在启动时加载一次,而是在每次打开文件时加载(因此它们使用缓冲区-作用域变量,并在此省略插件名称。

修改插件

为了修改插件,您确实将副本放置在~/.vim/中。这比直接修改Vim附带的插件源要好(因为它会被Vim的更新覆盖)。即使您要在整个系统范围内应用更改(不仅仅针对您的用户),也最好将另一个基本目录(例如,通过全局/etc/vimrc文件)添加到'runtimepath'并在其中复制插件。

请注意,几乎不需要(永久)修改插件:对于常见任务(例如扩展语法插件或更改文件类型插件的选项),{ {3}}(如上所述,这是对“ runtimepath”的另一种操纵)。插件通常可以通过(记录的)变量或after-directory进行配置。如果您缺少影响插件的方法(但认为您是一个常见且明智的用例),那么向插件的作者询问配置选项是个好主意。