在Debian上,插件位于/usr/share/vim/vim80
中,但也位于用户家庭~/.vim
中。如何处理冲突?假设有/usr/share/vim/vim80/ftplugin/tex.vim
和~/.vim/ftplugin/tex.vim
,这是加载的?或修改给定插件的正确方法是什么(例如tex.vim
)-修改/usr/...
中的一个或将/usr/...
中的一个复制到~/.vim/
并在那里进行修改(我想避免在更新软件包时更改被覆盖)。
答案 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
进行配置。如果您缺少影响插件的方法(但认为您是一个常见且明智的用例),那么向插件的作者询问配置选项是个好主意。