2012-07-11 12 views
6

Algunas secuencias de comandos en $VIMRUNTIME/ftplugin/ (por ejemplo python.vim y ada.vim) no definen b:undo_ftplugin. El valor predeterminado de la opción cpo es aABceFs.¿Debería cada `ftplugin/name.vim` necesitar definir` b: undo_ftplugin`?

Cuando I set ft=python, entonces set ft=css. $VIMRUNTIME/ftplugin/css.vim terminar de inmediato. Y omnifunc=pythoncomplete#Complete todo el tiempo.

¿Debería cada ftplugin/name.vim definir b:undo_ftplugin?


Ésta es /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 

Esta es /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 

Si set ft=python, entonces set ft=css. Vim no puede pasar esta prueba:

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

b:did_ftplugin no quede eliminado, por lo ftplugin/css.vim acabado inmediatamente.

Respuesta

7

:help undo_ftplugin menciones:

Cuando el usuario hace ": setfiletype xyz" el efecto del tipo de archivo anterior debe ser deshecho.

Tenga en cuenta que dice "debería", no "debe". Pero, de acuerdo con la aplicación

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

un ftplugin debe definir b:undo_ftplugin, o su configuración de tipo de archivo no puede ser cambiado más a través de :setf. Creo que la documentación debería señalarlo, y todos los ftplugins deberían establecer realmente b:undo_ftplugin (aunque solo sea un valor vacío, no operativo).

Cuestiones relacionadas