diff --git a/.vim/plugin/cocci-grep.vim b/.vim/plugin/cocci-grep.vim new file mode 100644 index 0000000..f9acb2f --- /dev/null +++ b/.vim/plugin/cocci-grep.vim @@ -0,0 +1,106 @@ +" Vim global plugin for calling coccigrep +" Last Change: 2012 Aug 31 +" Maintener: Eric Leblond +" License: GNU General Public License version 3 or later + + +if exists("g:loaded_coccigrep") + finish +endif +let g:loaded_coccigrep = 1 + +if !exists("g:coccigrep_path") + let g:coccigrep_path = 'coccigrep' +endif + +function! s:CocciGrep(...) + let argl = [] + let i = 1 + while i <= a:0 + if stridx(a:{i}, '"') == 0 + " Check quoted value + if stridx(a:{i}, '"', 1) == len(a:{i}) - 1 + call add(argl, a:{i}) + let i += 1 + continue + endif + let tmparg = a:{i} + if i + 1 == a:0 + echohl WarningMsg | echo "Warning: Unbalanced quotes" | echohl None + return + endif + let i += 1 + while 1 + let tmparg = tmparg." ". a:{i} + if stridx(a:{i}, '"') == len(a:{i}) - 1 + call add(argl, tmparg) + let i += 1 + break + elseif i == a:0 + echohl WarningMsg | echo "Warning: Unfinished quotes" | echohl None + return + endif + let i += 1 + endwhile + else + call add(argl, a:{i}) + let i += 1 + endif + endwhile + + if !exists("g:coccigrep_files") + let s:b_files_arg = 1 + else + let s:b_files_arg = 0 + endif + +" if we've got +" 0 args: interactive mode + if len(argl) == 0 + call inputsave() + let s:type = input('Enter type: ') + let s:attribute = input('Enter attribute: ') + let s:op_list = system(g:coccigrep_path . ' -L') + let s:operation = input('Enter operation in ('. substitute(s:op_list,'\n','','g') . '): ') + let s:files = input('Enter files: ') + call inputrestore() + let cgrep = '-V ' + if s:type + let cgrep = cgrep. '-t ' . shellescape(s:type) . ' ' + endif + if s:attribute + let cgrep = cgrep. '-a ' . s:attribute . ' ' + endif + let cgrep = cgrep . '-o ' . s:operation . ' ' . s:files +" 1 args: use files in current dir + elseif len(argl) == (0 + s:b_files_arg) + let cgrep = '-V -t ' . get(argl, 0) . ' *.[ch]' +" 2 args: 'used' on first arg, second is files + elseif len(argl) == (1 + s:b_files_arg) + let cgrep = '-V -t ' . get(argl, 0) +" 3 args: 'deref' operation + elseif len(argl) == (2 + s:b_files_arg) + let cgrep = '-V -t ' . get(argl, 0) . ' -a ' . get(argl, 1) +" 4 args: command is type + elseif len(argl) == (3 + s:b_files_arg) + let cgrep = '-V -t ' . get(argl, 0) . ' -a ' . get(argl, 1) . ' -o ' . get(argl, 2) + endif + + if s:b_files_arg + if ! exists ("s:files") + let cgrep = cgrep . ' ' . get(argl, len(argl)-1) + endif + else + let cgrep = cgrep . ' -l ' . g:coccigrep_files + endif + + echo "Running coccigrep, please wait..." + let cocciout = system(g:coccigrep_path . ' '. cgrep) + if cocciout == "" + echohl WarningMsg | echo "Warning: No match found" | echohl None + else + :cexpr cocciout | cw + endif +endfunction + +command! -nargs=* -complete=tag_listfiles Coccigrep :call CocciGrep()