0
|
1 " Author: Gergely Kontra <kgergely@mcl.hu> |
|
2 " You may direct issues regarding version 0.4+ to |
|
3 " Eric Van Dewoestine (ervandew@yahoo.com). |
|
4 " Version: 0.41 |
|
5 " Description: |
|
6 " Use your tab key to do all your completion in insert mode! |
|
7 " The script remembers the last completion type, and applies that. |
|
8 " Eg.: You want to enter /usr/local/lib/povray3/ |
|
9 " You type (in insert mode): |
|
10 " /u<C-x><C-f>/l<Tab><Tab><Tab>/p<Tab>/i<Tab> |
|
11 " You can also manipulate the completion type used by changing g:complType |
|
12 " variable. |
|
13 " You can cycle forward and backward with the <Tab> and <S-Tab> keys |
|
14 " (<S-Tab> will not work in the console version) |
|
15 " Note: you must press <Tab> once to be able to cycle back |
|
16 " History: |
|
17 " 0.41 Fixed couple bugs introduced in last version (Eric Van Dewoestine). |
|
18 " 0.4 Added the following functionality (Eric Van Dewoestine) |
|
19 " - support for vim 7 omni, user, and spelling completion modes |
|
20 " (should be backwards compatible with vim 6.x). |
|
21 " - command :SuperTabHelp which opens a window with available |
|
22 " completion types that the user can choose from. |
|
23 " - variable g:SuperTabRetainCompletionType setting for determining if |
|
24 " and for how long to retain completion type. |
|
25 " 0.32 Corrected tab-insertion/completing decidion (thx to: Lorenz Wegener) |
|
26 " 0.31 Added <S-Tab> for backward cycling. (req by: Peter Chun) |
|
27 " 0.3 Back to the roots. Autocompletion is another story... |
|
28 " Now the prompt appears, when showmode is on |
|
29 |
|
30 if !exists('complType') "Integration with other completion functions... |
|
31 |
|
32 " This variable determines if, and for how long, the current completion type |
|
33 " is retained. The possible values include: |
|
34 " 0 - The current completion type is only retained for the current completion. |
|
35 " Once you have chosen a completion result or exited the completion |
|
36 " mode, the default completion type is restored. |
|
37 " 1 - The current completion type is saved for the duration of your vim |
|
38 " session or until you enter a different completion mode. |
|
39 " (SuperTab default). |
|
40 " 2 - The current completion type is saved until you exit insert mode (via |
|
41 " ESC). Once you exit insert mode the default completion type is |
|
42 " restored. |
|
43 if !exists("g:SuperTabRetainCompletionType") |
|
44 let g:SuperTabRetainCompletionType = 1 |
|
45 endif |
|
46 |
|
47 " This variable is used to set the default completion type. |
|
48 " There is no need to escape this value as that will be done for you when |
|
49 " the type is set. |
|
50 " Ex. let g:SuperTabDefaultCompletionType = "<C-X><C-U>" |
|
51 if !exists("g:SuperTabDefaultCompletionType") |
|
52 let g:SuperTabDefaultCompletionType = "<C-P>" |
|
53 endif |
|
54 |
|
55 " construct the help text. |
|
56 let s:tabHelp = |
|
57 \ "Hit <CR> or CTRL-] on the completion type you wish to swith to.\n" . |
|
58 \ "Use :help ins-completion for more information.\n" . |
|
59 \ "\n" . |
|
60 \ "|<C-N>| - Keywords in 'complete' searching down.\n" . |
|
61 \ "|<C-P>| - Keywords in 'complete' searching up (SuperTab default).\n" . |
|
62 \ "|<C-X><C-L>| - Whole lines.\n" . |
|
63 \ "|<C-X><C-N>| - Keywords in current file.\n" . |
|
64 \ "|<C-X><C-K>| - Keywords in 'dictionary'.\n" . |
|
65 \ "|<C-X><C-T>| - Keywords in 'thesaurus', thesaurus-style.\n" . |
|
66 \ "|<C-X><C-I>| - Keywords in the current and included files.\n" . |
|
67 \ "|<C-X><C-]>| - Tags.\n" . |
|
68 \ "|<C-X><C-F>| - File names.\n" . |
|
69 \ "|<C-X><C-D>| - Definitions or macros.\n" . |
|
70 \ "|<C-X><C-V>| - Vim command-line." |
|
71 if v:version >= 700 |
|
72 let s:tabHelp = s:tabHelp . "\n" . |
|
73 \ "|<C-X><C-U>| - User defined completion.\n" . |
|
74 \ "|<C-X><C-O>| - Occult completion.\n" . |
|
75 \ "|<C-X>s| - Spelling suggestions." |
|
76 endif |
|
77 |
|
78 " set the available completion types and modes. |
|
79 let s:types = |
|
80 \ "\<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>" |
|
81 let s:modes = '/^E/^Y/^L/^N/^K/^T/^I/^]/^F/^D/^V/^P' |
|
82 if v:version >= 700 |
|
83 let s:types = s:types . "\<C-U>\<C-O>\<C-N>\<C-P>s" |
|
84 let s:modes = s:modes . '/^U/^O/s' |
|
85 endif |
|
86 let s:types = s:types . "np" |
|
87 let s:modes = s:modes . '/n/p' |
|
88 |
|
89 " Globally available function that user's can use to create mappings to |
|
90 " quickly switch completion modes. Useful when a user wants to restore the |
|
91 " default or switch to another mode without having to kick off a completion |
|
92 " of that type or use SuperTabHelp. |
|
93 " Example mapping to restore SuperTab default: |
|
94 " nmap <F6> :call SetSuperTabCompletionType("<C-P>")<cr> |
|
95 fu! SuperTabSetCompletionType (type) |
|
96 exec "let g:complType = \"" . escape(a:type, '<') . "\"" |
|
97 endf |
|
98 |
|
99 call SuperTabSetCompletionType(g:SuperTabDefaultCompletionType) |
|
100 |
|
101 im <C-X> <C-r>=CtrlXPP()<CR> |
|
102 |
|
103 " Setup mechanism to restore orignial completion type upon leaving insert |
|
104 " mode if g:SuperTabDefaultCompletionType == 2 |
|
105 if g:SuperTabRetainCompletionType == 2 |
|
106 " pre vim 7, must map <esc> |
|
107 if v:version < 700 |
|
108 im <silent> <ESC> |
|
109 \ <ESC>:call SuperTabSetCompletionType(g:SuperTabDefaultCompletionType)<cr> |
|
110 |
|
111 " since vim 7, we can use InsertLeave autocmd. |
|
112 else |
|
113 augroup supertab |
|
114 autocmd InsertLeave * |
|
115 \ call SuperTabSetCompletionType(g:SuperTabDefaultCompletionType) |
|
116 augroup END |
|
117 endif |
|
118 endif |
|
119 |
|
120 fu! CtrlXPP() |
|
121 if &smd |
|
122 echo '' | echo '-- ^X++ mode (' . s:modes . ')' |
|
123 endif |
|
124 let complType=nr2char(getchar()) |
|
125 if stridx(s:types, complType) != -1 |
|
126 if stridx("\<C-E>\<C-Y>",complType)!=-1 " no memory, just scroll... |
|
127 return "\<C-x>".complType |
|
128 elseif stridx('np',complType)!=-1 |
|
129 let complType=nr2char(char2nr(complType)-96) " char2nr('n')-char2nr("\<C-n") |
|
130 else |
|
131 let complType="\<C-x>".complType |
|
132 endif |
|
133 |
|
134 if g:SuperTabRetainCompletionType |
|
135 let g:complType = complType |
|
136 endif |
|
137 |
|
138 return complType |
|
139 else |
|
140 echohl "Unknown mode" |
|
141 return complType |
|
142 endif |
|
143 endf |
|
144 |
|
145 " From the doc |insert.txt| improved |
|
146 im <Tab> <C-n> |
|
147 inore <S-Tab> <C-p> |
|
148 |
|
149 " This way after hitting <Tab>, hitting it once more will go to next match |
|
150 " (because in XIM mode <C-n> and <C-p> mappings are ignored) |
|
151 " and wont start a brand new completion |
|
152 " The side effect, that in the beginning of line <C-n> and <C-p> inserts a |
|
153 " <Tab>, but I hope it may not be a problem... |
|
154 ino <C-n> <C-R>=<SID>SuperTab('n')<CR> |
|
155 ino <C-p> <C-R>=<SID>SuperTab('p')<CR> |
|
156 |
|
157 fu! <SID>SuperTab(command) |
|
158 if (strpart(getline('.'),col('.')-2,1)=~'^\s\?$') |
|
159 return "\<Tab>" |
|
160 else |
|
161 " exception: if in <c-p> mode, then <c-n> should move up the list, and |
|
162 " <c-p> down the list. |
|
163 if a:command == 'p' && g:complType == "\<C-P>" |
|
164 return "\<C-N>" |
|
165 endif |
|
166 return g:complType |
|
167 endif |
|
168 endf |
|
169 |
|
170 fu! <SID>SuperTabHelp() |
|
171 if bufwinnr("SuperTabHelp") == -1 |
|
172 botright split SuperTabHelp |
|
173 |
|
174 setlocal noswapfile |
|
175 setlocal buftype=nowrite |
|
176 setlocal bufhidden=delete |
|
177 |
|
178 let saved = @" |
|
179 let @" = s:tabHelp |
|
180 silent put |
|
181 call cursor(1,1) |
|
182 silent 1,delete |
|
183 call cursor(4,1) |
|
184 let @" = saved |
|
185 exec "resize " . line('$') |
|
186 |
|
187 syntax match Special "|.\{-}|" |
|
188 |
|
189 setlocal readonly |
|
190 setlocal nomodifiable |
|
191 |
|
192 nmap <silent> <buffer> <cr> :call <SID>SetCompletionType()<cr> |
|
193 nmap <silent> <buffer> <c-]> :call <SID>SetCompletionType()<cr> |
|
194 else |
|
195 exec bufwinnr("SuperTabHelp") . "winc w" |
|
196 endif |
|
197 endf |
|
198 |
|
199 fu! s:SetCompletionType () |
|
200 let chosen = substitute(getline('.'), '.*|\(.*\)|.*', '\1', '') |
|
201 if chosen != getline('.') |
|
202 call SuperTabSetCompletionType(chosen) |
|
203 close |
|
204 winc p |
|
205 endif |
|
206 endf |
|
207 |
|
208 if !exists(":SuperTabHelp") |
|
209 command SuperTabHelp :call <SID>SuperTabHelp() |
|
210 endif |
|
211 en |