为什么读取我的.vimrc文件后vim读取系统zipPlugin.vim?

时间:2012-01-01 00:11:03

标签: vim

我有一行

set cpoptions+=$
<{3>}文件中的

。但是根据

verbose set cpoptions output:

cpoptions=aABceFs
Last set from /usr/share/vim/vim73/plugin/zipPlugin.vim

:它总是被zipPlugin.vim覆盖。我想知道为什么vim在读取我的.vimrc文件之后阅读这些插件?有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

因为vim总是在插件之前读取vimrc。这个加载顺序是有意义的,因为在这种情况下,您可以在vimrc中设置插件选项。它无法覆盖,但您可以从vimrc中获取zipPlugin(包含:source /usr/share/vim/vim73/plugin/zipPlugin.vim:runtime plugin/zipPlugin.vim)。 AFAIK它不会阻止插件第二次加载,但由于这个插件使用后卫,它将不会在第二次来源时继续使用cpo重置线。

请注意,如果您的zipPlugin.vim与我的相同,则不是问题的根源:如果您查看其代码,您会看到它正在保存您的cpoptions设置然后恢复它。由于与vim一起分发的其他插件必须执行相同操作或根本不触及cpoptions,因此您可以忘记上述建议。我建议首先看一下set nocompatible(或set nocp)行,如果有的话,是vimrc中的第一行。请记住,设置此选项会导致许多其他选项重置为默认值(包括cpoptions),这就是必须在任何其他行修改选项之前的原因。

更新:现在我看到您提供了vimrc的链接,但没有上述问题。尝试检查verbose set compatible?,然后尝试使用以下命令启动vim:

vim --cmd 'let g:sourced_files=[] | autocmd SourcePre * if !empty(g:sourced_files) && stridx(&cpo, "$")==-1 | echomsg "cpo does not contain dollar sign after loading ".g:sourced_files[-1] | set cpo+=$ | endif | let g:sourced_files+=[expand("<amatch>")]'

你会有一些误报:首先加载vimrc(/etc/vim/vimrc):因为没有设置cpo,所有加载的插件都像

if exists("loaded_thlnk")
    finish
endif
let loaded_thlnk = 1
let s:save_cpo = &cpo
set cpo&vim

" (This is to allow installation of thlnk.vim with just :runtime plugin/thlnk.vim
"  without leaving vim after having thrown all files into a plugin directory :)
runtime! plugin/thlnkuri.vim
runtime! plugin/thlnkarr.vim
runtime! plugin/thlnkscm.vim

:这里cpo在加载插件之前重置,但最后还是

let &cpo = s:save_cpo
因此它真的很安全。在我的系统上只有误报:虽然cpo是由许多插件保存和恢复的,但没有插件忘记恢复它或做其他事情。