首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vim插件目录优先级

vim插件目录优先级
EN

Stack Overflow用户
提问于 2018-12-19 17:35:52
回答 1查看 1.6K关注 0票数 3

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

EN

回答 1

Stack Overflow用户

发布于 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查询。)那么会发生什么呢?

请注意,大多数插件的顶部都有一个多个包含保护,总是以类似的形式出现:

代码语言:javascript
复制
" 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-来配置的。如果您错过了影响插件的方法(但认为您的插件是一个常见且明智的用例),请插件的作者提供配置选项是个好主意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53856515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档