2010-01-26 2 views
3

En essayant d'utiliser omni-finitions et si elle ne renvoie rien, je veux utiliser l'achèvement normal de mot-clé?Le mot clé vim est-il complet lorsque omni complete ne renvoie rien?

je pense que% omnifunc! = '' Devrait le faire ...
mais qu'est-ce qui me manque? Voici ma fonction.

function! CleverTab() 
    if pumvisible() 
    return "\<C-N>" 
    endif 
    if strpart(getline('.'), 0, col('.')-1) =~ '^\s*$' 
    return "\<Tab>" 
    elseif &omnifunc != '' 
    return "\<C-X>\<C-O>" 
    else 
    return "\<C-N>" 
    endif 
endfunction 
inoremap <Tab> <C-R>=CleverTab()<CR> 

Répondre

4
let g:stop_autocomplete=0 

function! CleverTab(type) 
    if a:type=='omni' 
     if strpart(getline('.'), 0, col('.')-1) =~ '^\s*$' 
      let g:stop_autocomplete=1 
      return "\<TAB>" 
     elseif !pumvisible() && !&omnifunc 
      return "\<C-X>\<C-O>\<C-P>" 
     endif 
    elseif a:type=='keyword' && !pumvisible() && !g:stop_autocomplete 
     return "\<C-X>\<C-N>\<C-P>" 
    elseif a:type=='next' 
     if g:stop_autocomplete 
      let g:stop_autocomplete=0 
     else 
      return "\<C-N>" 
     endif 
    endif 
    return '' 
endfunction 

inoremap <silent><TAB> <C-R>=CleverTab('omni')<CR><C-R>=CleverTab('keyword')<CR><C-R>=CleverTab('next')<CR> 
+0

mais .. onglet normal ne fonctionne pas avec cette solution? :( – jonaz

+0

oh putain, je l'oublie;) de toute façon, vous devriez vérifier double pumvisible pour chaque menu –

+0

hmm ... ne pas le faire fonctionner, si je tabulation après un espace je reçois un onglet, puis immédiatement je reçois une nouvelle saisie semi-automatique menu. J'ai essayé ceci comme une première instruction if: si strpart (getline ('.'), 0, col ('.') - 1) = ~ '^ \ s * $' retourne "\ " – jonaz

Questions connexes