Mercurial > dotfiles
diff .vim/plugin/supertab.vim @ 0:c30d68fbd368
Initial import from svn.
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Wed, 26 Nov 2008 10:56:09 -0600 |
parents | |
children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/.vim/plugin/supertab.vim @@ -0,0 +1,211 @@ +" Author: Gergely Kontra <kgergely@mcl.hu> +" You may direct issues regarding version 0.4+ to +" Eric Van Dewoestine (ervandew@yahoo.com). +" Version: 0.41 +" Description: +" Use your tab key to do all your completion in insert mode! +" The script remembers the last completion type, and applies that. +" Eg.: You want to enter /usr/local/lib/povray3/ +" You type (in insert mode): +" /u<C-x><C-f>/l<Tab><Tab><Tab>/p<Tab>/i<Tab> +" You can also manipulate the completion type used by changing g:complType +" variable. +" You can cycle forward and backward with the <Tab> and <S-Tab> keys +" (<S-Tab> will not work in the console version) +" Note: you must press <Tab> once to be able to cycle back +" History: +" 0.41 Fixed couple bugs introduced in last version (Eric Van Dewoestine). +" 0.4 Added the following functionality (Eric Van Dewoestine) +" - support for vim 7 omni, user, and spelling completion modes +" (should be backwards compatible with vim 6.x). +" - command :SuperTabHelp which opens a window with available +" completion types that the user can choose from. +" - variable g:SuperTabRetainCompletionType setting for determining if +" and for how long to retain completion type. +" 0.32 Corrected tab-insertion/completing decidion (thx to: Lorenz Wegener) +" 0.31 Added <S-Tab> for backward cycling. (req by: Peter Chun) +" 0.3 Back to the roots. Autocompletion is another story... +" Now the prompt appears, when showmode is on + +if !exists('complType') "Integration with other completion functions... + + " This variable determines if, and for how long, the current completion type + " is retained. The possible values include: + " 0 - The current completion type is only retained for the current completion. + " Once you have chosen a completion result or exited the completion + " mode, the default completion type is restored. + " 1 - The current completion type is saved for the duration of your vim + " session or until you enter a different completion mode. + " (SuperTab default). + " 2 - The current completion type is saved until you exit insert mode (via + " ESC). Once you exit insert mode the default completion type is + " restored. + if !exists("g:SuperTabRetainCompletionType") + let g:SuperTabRetainCompletionType = 1 + endif + + " This variable is used to set the default completion type. + " There is no need to escape this value as that will be done for you when + " the type is set. + " Ex. let g:SuperTabDefaultCompletionType = "<C-X><C-U>" + if !exists("g:SuperTabDefaultCompletionType") + let g:SuperTabDefaultCompletionType = "<C-P>" + endif + + " construct the help text. + let s:tabHelp = + \ "Hit <CR> or CTRL-] on the completion type you wish to swith to.\n" . + \ "Use :help ins-completion for more information.\n" . + \ "\n" . + \ "|<C-N>| - Keywords in 'complete' searching down.\n" . + \ "|<C-P>| - Keywords in 'complete' searching up (SuperTab default).\n" . + \ "|<C-X><C-L>| - Whole lines.\n" . + \ "|<C-X><C-N>| - Keywords in current file.\n" . + \ "|<C-X><C-K>| - Keywords in 'dictionary'.\n" . + \ "|<C-X><C-T>| - Keywords in 'thesaurus', thesaurus-style.\n" . + \ "|<C-X><C-I>| - Keywords in the current and included files.\n" . + \ "|<C-X><C-]>| - Tags.\n" . + \ "|<C-X><C-F>| - File names.\n" . + \ "|<C-X><C-D>| - Definitions or macros.\n" . + \ "|<C-X><C-V>| - Vim command-line." + if v:version >= 700 + let s:tabHelp = s:tabHelp . "\n" . + \ "|<C-X><C-U>| - User defined completion.\n" . + \ "|<C-X><C-O>| - Occult completion.\n" . + \ "|<C-X>s| - Spelling suggestions." + endif + + " set the available completion types and modes. + let s:types = + \ "\<C-E>\<C-Y>\<C-L>\<C-N>\<C-K>\<C-T>\<C-I>\<C-]>\<C-F>\<C-D>\<C-V>\<C-N>\<C-P>" + let s:modes = '/^E/^Y/^L/^N/^K/^T/^I/^]/^F/^D/^V/^P' + if v:version >= 700 + let s:types = s:types . "\<C-U>\<C-O>\<C-N>\<C-P>s" + let s:modes = s:modes . '/^U/^O/s' + endif + let s:types = s:types . "np" + let s:modes = s:modes . '/n/p' + + " Globally available function that user's can use to create mappings to + " quickly switch completion modes. Useful when a user wants to restore the + " default or switch to another mode without having to kick off a completion + " of that type or use SuperTabHelp. + " Example mapping to restore SuperTab default: + " nmap <F6> :call SetSuperTabCompletionType("<C-P>")<cr> + fu! SuperTabSetCompletionType (type) + exec "let g:complType = \"" . escape(a:type, '<') . "\"" + endf + + call SuperTabSetCompletionType(g:SuperTabDefaultCompletionType) + + im <C-X> <C-r>=CtrlXPP()<CR> + + " Setup mechanism to restore orignial completion type upon leaving insert + " mode if g:SuperTabDefaultCompletionType == 2 + if g:SuperTabRetainCompletionType == 2 + " pre vim 7, must map <esc> + if v:version < 700 + im <silent> <ESC> + \ <ESC>:call SuperTabSetCompletionType(g:SuperTabDefaultCompletionType)<cr> + + " since vim 7, we can use InsertLeave autocmd. + else + augroup supertab + autocmd InsertLeave * + \ call SuperTabSetCompletionType(g:SuperTabDefaultCompletionType) + augroup END + endif + endif + + fu! CtrlXPP() + if &smd + echo '' | echo '-- ^X++ mode (' . s:modes . ')' + endif + let complType=nr2char(getchar()) + if stridx(s:types, complType) != -1 + if stridx("\<C-E>\<C-Y>",complType)!=-1 " no memory, just scroll... + return "\<C-x>".complType + elseif stridx('np',complType)!=-1 + let complType=nr2char(char2nr(complType)-96) " char2nr('n')-char2nr("\<C-n") + else + let complType="\<C-x>".complType + endif + + if g:SuperTabRetainCompletionType + let g:complType = complType + endif + + return complType + else + echohl "Unknown mode" + return complType + endif + endf + + " From the doc |insert.txt| improved + im <Tab> <C-n> + inore <S-Tab> <C-p> + + " This way after hitting <Tab>, hitting it once more will go to next match + " (because in XIM mode <C-n> and <C-p> mappings are ignored) + " and wont start a brand new completion + " The side effect, that in the beginning of line <C-n> and <C-p> inserts a + " <Tab>, but I hope it may not be a problem... + ino <C-n> <C-R>=<SID>SuperTab('n')<CR> + ino <C-p> <C-R>=<SID>SuperTab('p')<CR> + + fu! <SID>SuperTab(command) + if (strpart(getline('.'),col('.')-2,1)=~'^\s\?$') + return "\<Tab>" + else + " exception: if in <c-p> mode, then <c-n> should move up the list, and + " <c-p> down the list. + if a:command == 'p' && g:complType == "\<C-P>" + return "\<C-N>" + endif + return g:complType + endif + endf + + fu! <SID>SuperTabHelp() + if bufwinnr("SuperTabHelp") == -1 + botright split SuperTabHelp + + setlocal noswapfile + setlocal buftype=nowrite + setlocal bufhidden=delete + + let saved = @" + let @" = s:tabHelp + silent put + call cursor(1,1) + silent 1,delete + call cursor(4,1) + let @" = saved + exec "resize " . line('$') + + syntax match Special "|.\{-}|" + + setlocal readonly + setlocal nomodifiable + + nmap <silent> <buffer> <cr> :call <SID>SetCompletionType()<cr> + nmap <silent> <buffer> <c-]> :call <SID>SetCompletionType()<cr> + else + exec bufwinnr("SuperTabHelp") . "winc w" + endif + endf + + fu! s:SetCompletionType () + let chosen = substitute(getline('.'), '.*|\(.*\)|.*', '\1', '') + if chosen != getline('.') + call SuperTabSetCompletionType(chosen) + close + winc p + endif + endf + + if !exists(":SuperTabHelp") + command SuperTabHelp :call <SID>SuperTabHelp() + endif +en