在Debian上,插件是在/usr/share/vim/vim80中,但也在用户家庭~/.vim中。冲突是如何处理的?假设有/usr/share/vim/vim80/ftplugin/tex.vim和~/.vim/ftplugin/tex.vim,它会被加载吗?或者修改给定插件(例如tex.vim)的正确方法是修改/usr/...中的插件,或者将/usr/...中的插件复制到~/.vim/中,并在那里进行修改(我希望在更新包时避免被覆盖的更改)。
发布于 2018-12-20 07:42:35
Vim配置有一个特定的结构(plugin/、syntax/等子目录),并且可以有多个基本目录承载这些配置树。'runtimepath'选项枚举所有基本目录,并按照: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处停止。这意味着用户定义的插件"wins“(这是'runtimepath'中的第一个插件),并且您可以覆盖系统范围的插件(例如,使用您下载的更新版本)。
这同样适用于包管理器添加的包插件或插件目录。语法插件(b:current_syntax)和文件类型插件(b:did_ftplugin)也存在类似的情况,区别在于它们在启动时不加载一次,但每次打开文件时(因此它们使用缓冲区作用域变量,并在其中省略插件名称)。
修改插件
为了修改插件,您确实在~/.vim/中放置了一个副本。这比直接修改Vim附带的插件源代码要好(因为它将被Vim的更新覆盖)。即使您想在整个系统(不仅仅是为您的用户)应用更改系统,最好将另一个基本目录(例如,通过全局/etc/vimrc文件)添加到'runtimepath'中,并在那里复制插件。
Note认为(永久)修改插件几乎不应该是必要的:对于普通任务(比如扩展语法插件或更改文件类型插件的选项),通过after-directory (这是对“运行时路径”的另一次操作,如上所述)有一个内置的方式。插件通常是通过(记录在案的)变量或:help using-来配置的。如果您错过了影响插件的方法(但认为您的插件是一个常见且明智的用例),请插件的作者提供配置选项是个好主意。
https://stackoverflow.com/questions/53856515
复制相似问题