├── README.md └── plugin ├── code_complete.vim └── my_snippets.vim /README.md: -------------------------------------------------------------------------------- 1 | Created by: 2 | Ming Bai 3 | 4 | Script type: 5 | Utility 6 | 7 | ### Description 8 | ![Demo](https://web.archive.org/web/20131110125157/http://files.myopera.com/mbbill/files/code_complete.gif) 9 | 10 | It shows what this script can do. 11 | 12 | In insert mode, when you type `` (default value of g:completekey) after function name with a `(` , function parameters will be append behind, use `` key again to switch between parameters. 13 | 14 | This key is also used to complete code snippets. 15 | 16 | #### Example: 17 | press `` after function name and `(` 18 | 19 | foo ( 20 | 21 | becomes: 22 | 23 | foo ( ``,`` ) 24 | 25 | press `` after code template 26 | 27 | if 28 | 29 | becomes: 30 | 31 | if( `<...>` ) 32 | { 33 | `<...>` 34 | } 35 | 36 | ### Code Snippets 37 | 38 | Custom snippet files can be used. The default file is 39 | [my_snippets.vim](plugin/my_snippets.vim) and is loaded by default. To add 40 | more custom snippet files (see [my_snippets.vim](plugin/my_snippets.vim) for 41 | the structure), use one of the following variables in your vimrc: 42 | 43 | ``` viml 44 | let g:user_defined_snippets = "snippets/custom_snippets.vim" 45 | let g:user_defined_snippets = ["snippets/c_snippets.vim", "snippets/js_snippets.vim"] 46 | ``` 47 | -------------------------------------------------------------------------------- /plugin/code_complete.vim: -------------------------------------------------------------------------------- 1 | "================================================== 2 | " File: code_complete.vim 3 | " Brief: function parameter complete, code snippets, and much more. 4 | " Author: Mingbai 5 | " Last Change: 2009-06-09 00:09:03 6 | " Version: 2.9 7 | " 8 | " Install: 1. Put code_complete.vim to plugin 9 | " directory. 10 | " 2. Use the command below to create tags 11 | " file including signature field. 12 | " ctags -R --c-kinds=+p --fields=+S . 13 | " 14 | " Usage: 15 | " hotkey: 16 | " "" (default value of g:completekey) 17 | " Do all the jobs with this key, see 18 | " example: 19 | " press after function name and ( 20 | " foo ( 21 | " becomes: 22 | " foo ( ``,`` ) 23 | " press after code template 24 | " if 25 | " becomes: 26 | " if( `<...>` ) 27 | " { 28 | " `<...>` 29 | " } 30 | " 31 | " 32 | " variables: 33 | " 34 | " g:disable_codecomplete 35 | " Disable code_complete, default enabled. 36 | " 37 | " g:completekey 38 | " the key used to complete function 39 | " parameters and key words. 40 | " 41 | " g:rs, g:re 42 | " region start and stop 43 | " you can change them as you like. 44 | " 45 | " g:user_defined_snippets 46 | " file name of user defined snippets. 47 | " 48 | " g:CodeComplete_Ignorecase 49 | " use ignore case for keywords. 50 | 51 | " key words: 52 | " see "templates" section. 53 | "================================================== 54 | 55 | if v:version < 700 56 | finish 57 | endif 58 | 59 | if exists("g:disable_codecomplete") 60 | finish 61 | endif 62 | 63 | " Variable Definitions: {{{1 64 | " options, define them as you like in vimrc: 65 | if !exists("g:completekey") 66 | let g:completekey = "" "hotkey 67 | endif 68 | 69 | if !exists("g:rs") 70 | let g:rs = '`<' "region start 71 | endif 72 | 73 | if !exists("g:re") 74 | let g:re = '>`' "region stop 75 | endif 76 | 77 | if !exists("g:user_defined_snippets") 78 | let g:user_defined_snippets = "" 79 | endif 80 | 81 | " ---------------------------- 82 | let s:expanded = 0 "in case of inserting char after expand 83 | let s:signature_list = [] 84 | let s:jumppos = -1 85 | let s:doappend = 1 86 | 87 | " Autocommands: {{{1 88 | autocmd BufReadPost,BufNewFile * call CodeCompleteStart() 89 | 90 | " Menus: 91 | menu &Tools.Code\ Complete\ Start :call CodeCompleteStart() 92 | menu &Tools.Code\ Complete\ Stop :call CodeCompleteStop() 93 | 94 | " Function Definitions: {{{1 95 | 96 | function! CodeCompleteStart() 97 | exec "silent! iunmap ".g:completekey 98 | exec "inoremap ".g:completekey." =CodeComplete()=SwitchRegion()" 99 | endfunction 100 | 101 | function! CodeCompleteStop() 102 | exec "silent! iunmap ".g:completekey 103 | endfunction 104 | 105 | function! FunctionComplete(fun, last_char) 106 | let s:signature_list=[] 107 | let signature_word=[] 108 | let ftags=taglist("^".a:fun."$") 109 | if type(ftags)==type(0) || ((type(ftags)==type([])) && ftags==[]) 110 | return '' 111 | endif 112 | let tmp='' 113 | if a:last_char == ')' 114 | let s:append_tail = '' 115 | else 116 | let s:append_tail = ')' 117 | endif 118 | for i in ftags 119 | if match(i.cmd,'^/\^.*\(\*'.a:fun.'\)\(.*\)\;\$/')>=0 120 | if match(i.cmd,'(\s*void\s*)')<0 && match(i.cmd,'(\s*)')<0 121 | let tmp=substitute(i.cmd,'^/\^','','') 122 | let tmp=substitute(tmp,'.*\(\*'.a:fun.'\)','','') 123 | let tmp=substitute(tmp,'^[\){1}]','','') 124 | let tmp=substitute(tmp,';\$\/;{1}','','') 125 | let tmp=substitute(tmp,'\$\/','','') 126 | let tmp=substitute(tmp,';','','') 127 | let tmp=substitute(tmp,',',g:re.','.g:rs,'g') 128 | " let tmp=substitute(tmp,'(\(.*\))',g:rs.'\1'.g:re.')','g') 129 | let tmp=substitute(tmp,'(\(.*\))',g:rs.'\1'.g:re.s:append_tail,'g') 130 | else 131 | let tmp='' 132 | endif 133 | if (tmp != '') && (index(signature_word,tmp) == -1) 134 | let signature_word+=[tmp] 135 | let item={} 136 | let item['word']=tmp 137 | let item['menu']=i.filename 138 | let s:signature_list+=[item] 139 | endif 140 | endif 141 | if has_key(i,'kind') && has_key(i,'name') && has_key(i,'signature') 142 | if (i.kind=='p' || i.kind=='f') && i.name==a:fun " p is declare, f is definition 143 | if match(i.signature,'(\s*void\s*)')<0 && match(i.signature,'(\s*)')<0 144 | let tmp=substitute(i.signature,',',g:re.','.g:rs,'g') 145 | " let tmp=substitute(tmp,'(\(.*\))',g:rs.'\1'.g:re.')','g') 146 | let tmp=substitute(tmp,'(\(.*\))',g:rs.'\1'.g:re.s:append_tail,'g') 147 | else 148 | let tmp='' 149 | endif 150 | if (tmp != '') && (index(signature_word,tmp) == -1) 151 | let signature_word+=[tmp] 152 | let item={} 153 | let item['word']=tmp 154 | let item['menu']=i.filename 155 | let s:signature_list+=[item] 156 | endif 157 | endif 158 | endif 159 | endfor 160 | if s:signature_list==[] 161 | " return ')' 162 | return s:append_tail 163 | endif 164 | if len(s:signature_list)==1 165 | return s:signature_list[0]['word'] 166 | else 167 | call complete(col('.'),s:signature_list) 168 | return '' 169 | endif 170 | endfunction 171 | 172 | function! ExpandTemplate(cword) 173 | "let cword = substitute(getline('.')[:(col('.')-2)],'\zs.*\W\ze\w*$','','g') 174 | if has_key(g:template,&ft) 175 | if ( exists('g:CodeComplete_Ignorecase') && g:CodeComplete_Ignorecase ) 176 | if has_key(g:template[&ft],tolower(a:cword)) 177 | let s:jumppos = line('.') 178 | return "\" . g:template[&ft][tolower(a:cword)] 179 | endif 180 | else 181 | if has_key(g:template[&ft],a:cword) 182 | let s:jumppos = line('.') 183 | return "\" . g:template[&ft][a:cword] 184 | endif 185 | endif 186 | endif 187 | if ( exists('g:CodeComplete_Ignorecase') && g:CodeComplete_Ignorecase ) 188 | if has_key(g:template['_'],tolower(a:cword)) 189 | let s:jumppos = line('.') 190 | return "\" . g:template['_'][tolower(a:cword)] 191 | endif 192 | else 193 | if has_key(g:template['_'],a:cword) 194 | let s:jumppos = line('.') 195 | return "\" . g:template['_'][a:cword] 196 | endif 197 | endif 198 | return '' 199 | endfunction 200 | 201 | function! SwitchRegion() 202 | if len(s:signature_list)>1 203 | let s:signature_list=[] 204 | return '' 205 | endif 206 | if s:jumppos != -1 207 | call cursor(s:jumppos,0) 208 | let s:jumppos = -1 209 | endif 210 | if match(getline('.'),g:rs.'.*'.g:re)!=-1 || search(g:rs.'.\{-}'.g:re)!=0 211 | normal 0 212 | call search(g:rs,'c',line('.')) 213 | normal v 214 | call search(g:re,'e',line('.')) 215 | if &selection == "exclusive" 216 | exec "norm l" 217 | endif 218 | return "\\gvo\" 219 | else 220 | if s:doappend == 1 221 | if g:completekey == "" 222 | return "\" 223 | endif 224 | endif 225 | return '' 226 | endif 227 | endfunction 228 | 229 | function! CodeComplete() 230 | let s:doappend = 1 231 | let function_name = matchstr(getline('.')[:(col('.')-2)],'\zs\w*\ze\s*(\s*$') 232 | if function_name != '' 233 | let funcres = FunctionComplete(function_name, getline('.')[col('.')-1]) 234 | if funcres != '' 235 | let s:doappend = 0 236 | endif 237 | return funcres 238 | else 239 | let template_name = substitute(getline('.')[:(col('.')-2)],'\zs.*\W\ze\w*$','','g') 240 | let tempres = ExpandTemplate(template_name) 241 | if tempres != '' 242 | let s:doappend = 0 243 | endif 244 | return tempres 245 | endif 246 | endfunction 247 | 248 | 249 | " [Get converted file name like __THIS_FILE__ ] 250 | function! GetFileName() 251 | let filename=expand("%:t") 252 | let filename=toupper(filename) 253 | let _name=substitute(filename,'\.','_',"g") 254 | "let _name="__"._name."__" 255 | return _name 256 | endfunction 257 | 258 | " Templates: {{{1 259 | " to add templates for new file type, see below 260 | " 261 | " "some new file type 262 | " let g:template['newft'] = {} 263 | " let g:template['newft']['keyword'] = "some abbrevation" 264 | " let g:template['newft']['anotherkeyword'] = "another abbrevation" 265 | " ... 266 | " 267 | " --------------------------------------------- 268 | " C templates 269 | let g:template = {} 270 | let g:template['c'] = {} 271 | let g:template['c']['cc'] = "/* */\\\" 272 | let g:template['c']['cd'] = "/**< */\\\" 273 | let g:template['c']['de'] = "#define " 274 | let g:template['c']['in'] = "#include \"\"\" 275 | let g:template['c']['is'] = "#include <>\" 276 | let g:template['c']['ff'] = "#ifndef \=GetFileName()\\#define \=GetFileName()\". 277 | \repeat("\",5)."#endif /*\=GetFileName()\*/".repeat("\",3) 278 | let g:template['c']['for'] = "for( ".g:rs."...".g:re." ; ".g:rs."...".g:re." ; ".g:rs."...".g:re." )\{\". 279 | \g:rs."...".g:re."\}\" 280 | let g:template['c']['main'] = "int main(int argc, char \*argv\[\])\{\".g:rs."...".g:re."\}" 281 | let g:template['c']['switch'] = "switch ( ".g:rs."...".g:re." )\{\case ".g:rs."...".g:re." :\break;\case ". 282 | \g:rs."...".g:re." :\break;\default :\break;\}" 283 | let g:template['c']['if'] = "if( ".g:rs."...".g:re." )\{\".g:rs."...".g:re."\}" 284 | let g:template['c']['while'] = "while( ".g:rs."...".g:re." )\{\".g:rs."...".g:re."\}" 285 | let g:template['c']['ife'] = "if( ".g:rs."...".g:re." )\{\".g:rs."...".g:re."\} else\{\".g:rs."...". 286 | \g:re."\}" 287 | 288 | " --------------------------------------------- 289 | " C++ templates 290 | let g:template['cpp'] = g:template['c'] 291 | 292 | " --------------------------------------------- 293 | " common templates 294 | let g:template['_'] = {} 295 | let g:template['_']['xt'] = "\=strftime(\"%Y-%m-%d %H:%M:%S\")\" 296 | 297 | " --------------------------------------------- 298 | " load user defined snippets 299 | exec "silent! runtime plugin/my_snippets.vim" 300 | if type(g:user_defined_snippets) == type("") 301 | exec "silent! runtime ".g:user_defined_snippets 302 | exec "silent! source ".g:user_defined_snippets 303 | elseif type(g:user_defined_snippets) == type([]) 304 | for snippet in g:user_defined_snippets 305 | exec "silent! runtime ".snippet 306 | exec "silent! source ".snippet 307 | endfor 308 | endif 309 | 310 | " vim: set fdm=marker et : 311 | -------------------------------------------------------------------------------- /plugin/my_snippets.vim: -------------------------------------------------------------------------------- 1 | " Templates: {{{1 2 | " to add templates for new file type, see below 3 | " 4 | " "some new file type 5 | " let g:template['newft'] = {} 6 | " let g:template['newft']['keyword'] = "some abbrevation" 7 | " let g:template['newft']['anotherkeyword'] = "another abbrevation" 8 | " ... 9 | " 10 | --------------------------------------------------------------------------------