2012-07-11 54 views
6

$VIMRUNTIME/ftplugin/(例如python.vimada.vim)某些脚本不定义b:undo_ftplugincpo选项的默认值是aABceFs每个'ftplugin/name.vim`都需要定义`b:undo_ftplugin`吗?

当我set ft=python,然后set ft=css$VIMRUNTIME/ftplugin/css.vim立即完成。和omnifunc=pythoncomplete#Complete一直。

应该每ftplugin/name.vim需要定义b:undo_ftplugin


这是/usr/share/vim/vim73/ftplugin.vim

" Vim support file to switch on loading plugins for file types 
" 
" Maintainer: Bram Moolenaar <[email protected]> 
" Last change: 2006 Apr 30 

if exists("did_load_ftplugin") 
    finish 
endif 
let did_load_ftplugin = 1 

augroup filetypeplugin 
    au FileType * call s:LoadFTPlugin() 

    func! s:LoadFTPlugin() 
    if exists("b:undo_ftplugin") 
     exe b:undo_ftplugin 
     unlet! b:undo_ftplugin b:did_ftplugin 
    endif 

    let s = expand("<amatch>") 
    if s != "" 
     if &cpo =~# "S" && exists("b:did_ftplugin") 
     " In compatible mode options are reset to the global values, need to 
     " set the local values also when a plugin was already used. 
     unlet b:did_ftplugin 
     endif 

     " When there is a dot it is used to separate filetype names. Thus for 
     " "aaa.bbb" load "aaa" and then "bbb". 
     for name in split(s, '\.') 
     exe 'runtime! ftplugin/' . name . '.vim ftplugin/' . name . '_*.vim ftplugin/' . name . '/*.vim' 
     endfor 
    endif 
    endfunc 
augroup END 

这是/usr/share/vim/vim73/ftplugin/css.vim

" Vim filetype plugin file 
" Language:   CSS 
" Maintainer:  Nikolai Weibull <[email protected]> 
" Latest Revision: 2008-07-09 

if exists("b:did_ftplugin") 
    finish 
endif 
let b:did_ftplugin = 1 

let s:cpo_save = &cpo 
set cpo&vim 

let b:undo_ftplugin = "setl com< cms< inc< fo< ofu<" 

setlocal comments=s1:/*,mb:*,ex:*/ commentstring& 
setlocal formatoptions-=t formatoptions+=croql 
setlocal omnifunc=csscomplete#CompleteCSS 

let &l:include = '^\s*@import\s\+\%(url(\)\=' 

let &cpo = s:cpo_save 
unlet s:cpo_save 

如果我set ft=python,然后set ft=css。 Vim可以不通过这个测试:

if &cpo =~# "S" && exists("b:did_ftplugin") 

b:did_ftplugin没有被删除,所以ftplugin/css.vim立即完成。

回答

7

:help undo_ftplugin提到:

当用户执行 “:setfiletype xyz” 时,之前的文件类型命令应该被撤消。

注意,它说 “应该”,而不是 “必须”。但是,根据实施

func! s:LoadFTPlugin() 
    if exists("b:undo_ftplugin") 
     exe b:undo_ftplugin 
     unlet! b:undo_ftplugin b:did_ftplugin 
    endif 

一个文件类型插件必须定义b:undo_ftplugin,或者其文件类型设置不能通过:setf被改变了。我认为文档应该指出,所有ftplugins的确应该设置b:undo_ftplugin(如果只是一个空的,没有操作的值)。

相关问题