" =========================================================================== " File: vimsuite.vim " Author: Stefan Liebl (S.Liebl@gmx.de) " Description: some usefull tools " =========================================================================== " ------------------ " Draw Vimsuite-Menu " ------------------ let s:VimSuiteMenuLocation = 70 let s:VimSuiteMenuName = '&VimSuite.' function s:RedrawMenu() " Compile exec 'anoremenu '.s:VimSuiteMenuLocation.'.30 '.s:VimSuiteMenuName. \'&Compile.&Build<tab>:Make'. \' :Make<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.30 '.s:VimSuiteMenuName. \'&Compile.&Lint<tab>:Make\ lint'. \' :Make lint<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.30 '.s:VimSuiteMenuName. \'&Compile.&Clean<tab>:Make\ clean'. \' :Make clean<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.30 '.s:VimSuiteMenuName. \'&Compile.&Run<tab>:Make\ run'. \' :Make run<CR>' " exec 'anoremenu '.s:VimSuiteMenuLocation.'.30 '. s:VimSuiteMenuName. " \'&Compile.-sep- :' " Search exec 'anoremenu '.s:VimSuiteMenuLocation.'.40 '.s:VimSuiteMenuName. \'&Search.&Grep<tab>:Grep'. \' :Grep<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.40 '.s:VimSuiteMenuName. \'&Search.&File<tab>:find\ <name>'. \' :call FindFile()<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.40 '. s:VimSuiteMenuName. \'&Search.-sep- :' exec 'anoremenu '.s:VimSuiteMenuLocation.'.40 '.s:VimSuiteMenuName. \'&Search.Goto\ &Cscope-Tag<tab>:cscope'. \' :cscope find i <C-R><C-W><CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.40 '.s:VimSuiteMenuName. \'&Search.Goto\ &CTag<tab>:tag'. \' :tag <C-R><C-W><CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.40 '.s:VimSuiteMenuName. \'&Search.List\ &CTags<tab>:tselect'. \' :tselect /<C-R><C-W><CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.40 '.s:VimSuiteMenuName. \'&Search.Update\ c&tags<tab>:Make\ tags'. \' :Make tags<CR>' " Edit exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.&Comment\ out/in<tab>^k'. \' :CommentInOut<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Mark\ &long\ lines<tab>:MarkLongLines'. \' :MarkLongLines<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.&Reformat\ File<tab>:Reformat'. \' :Reformat<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Reformat\ &Tabs<tab>:ReformatTabs'. \' :ReformatTabs<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Reformat\ &Indent<tab>:ReformatIndent'. \' :ReformatIndent<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Delete\ trailing\ spaces<tab>:DelAllTrailWhitespace'. \' :DelAllTrailWhitespace<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Delete\ multiple\ &empty\ lines<tab>:DelAllMultipleEmptyLines'. \' :DelAllMultipleEmptyLines<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Delete\ multiple\ &same\ lines<tab>:DelAllMultipleSameLines'. \' :DelAllMultipleSameLines<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '. s:VimSuiteMenuName. \'&Edit.-sep- :' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Insert\ &Function\ Header<tab>:InsertFHeader'. \' :InsertFHeader<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Insert\ &C-File\ Header<tab>:InsertCHeader'. \' :InsertCHeader<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Insert\ &H-File\ Header<tab>:InsertHHeader'. \' :InsertHHeader<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.50 '.s:VimSuiteMenuName. \'&Edit.Insert\ H&TML-File\ Header<tab>:InsertHTMLHeader'. \' :InsertHTMLHeader<CR>' " Diff exec 'anoremenu '.s:VimSuiteMenuLocation.'.60 '.s:VimSuiteMenuName. \'&Diff.&show\ diffs<tab>:diffthis'. \' :diffthis<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.60 '.s:VimSuiteMenuName. \'&Diff.&end\ diffs<tab>:diffoff'. \' :diffoff<CR>' exec 'anoremenu '.s:VimSuiteMenuLocation.'.60 '.s:VimSuiteMenuName. \'&Diff.&close\ diff<tab>:DiffClose'. \' :DiffClose<CR>' endfunction call s:RedrawMenu() " search functions " ---------------- " Search for file function FindFile() let basename = inputdialog('Filename:') echo 'basename:' basename " do it execute ':find ' basename endfunction " Open multiple files command -nargs=+ -complete=file EditFiles call EditFiles('<args>') function EditFiles(wildcards) for wildcard in split(a:wildcards) for file in split(expand(wildcard)) execute('edit ' . file) endfor endfor endfunction " don't use :grep let &grepprg='echo extern grep is not supported. Use vimgrep' " defaults let g:GrepDir = getcwd() let g:GrepFiles = '*.*' command -nargs=* Grep call Grep('<args>') function Grep(input) if (a:input == '') let pattern = inputdialog('Pattern:') else let pattern = a:input endif " Use Buffer-Variables, if exists if exists('b:GrepDir') let GrepDir = b:GrepDir else let GrepDir = g:GrepDir endif if exists('b:GrepFiles') let GrepFiles = b:GrepFiles else let GrepFiles = g:GrepFiles endif call GrepFull(GrepDir, GrepFiles, pattern) endfunction function GrepFull(GrepDir, GrepFiles, Pattern) " Normpath let GrepDir = substitute(a:GrepDir, '\\', '/', 'g') " add GrepDir to each GrepFiles let Files = substitute(a:GrepFiles, '\(\S\+\)', GrepDir.'/**/\0', 'g') " get pattern if empty if (a:Pattern == '') let Pattern = inputdialog('Pattern:') else let Pattern = a:Pattern endif " do it let command = 'vimgrep /'.Pattern.'/gj '.Files echo command silent execute command " list results execute 'cl' endfunction func GitGrep(...) let save = &grepprg set grepprg=git\ grep\ -n\ $* let s = 'grep' for i in a:000 let s = s . ' ' . i endfor exe s let &grepprg = save endfun command -nargs=? GitGrep call GitGrep(<f-args>) " Options for GitV let g:Gitv_WipeAllOnClose = 1 let g:Gitv_TruncateCommitSubjects = 1 " Remove all buffers which are not found by findfile() " ---------------------------------------------------- command BuffersCleanup call s:BuffersCleanup() function s:BuffersCleanup() let buffers = getbufinfo() for buffer in buffers if buffer['listed'] let path = fnamemodify(buffer['name'], ':p') let name = fnamemodify(path, ':t') let found = fnamemodify(findfile(name), ':p') if found != path && buffer['listed'] echo 'delete buffer '.path execute 'bdelete ' buffer['bufnr'] else echo 'keep buffer '.path endif endif endfor endfunction " Formatting Functions " -------------------- " delete all multiple empty lines command -range=% DelAllMultipleEmptyLines call DelAllMultipleEmptyLines(<line1>,<line2>) function DelAllMultipleEmptyLines(fromline, toline) let cursorLine = line(".") let cursorCol = col(".") execute a:fromline . ',' . a:toline . 's/\s\+$//e' execute a:fromline . ',' . a:toline . 's/^\s*\(\n\s*$\)\+//e' call cursor(cursorLine, cursorCol) endfunction " delete all trailling whitespace command -range=% DelAllTrailWhitespace call DelAllTrailWhitespace(<line1>,<line2>) function DelAllTrailWhitespace(fromline, toline) let cursorLine = line(".") let cursorCol = col(".") execute a:fromline . ',' . a:toline . 's/\s\+$//e' call cursor(cursorLine, cursorCol) endfunction " delete all multiple same lines command -range=% DelAllMultipleSameLines call DelAllMultipleSameLines(<line1>,<line2>) function DelAllMultipleSameLines(fromline, toline) let cursorLine = line(".") let cursorCol = col(".") execute a:fromline . ',' . a:toline . 's/^\(.*\)\(\n^\1$\)\+/\1/e' call cursor(cursorLine, cursorCol) endfunction " reformat command -range=% Reformat call ReformatFile(<line1>,<line2>) function ReformatFile (fromline,toline) call ReformatText(a:fromline,a:toline) if (&filetype == 'kgs') call ReformatKGS() endif endfunction "command -range=% Reformat call ReformatText(<line1>,<line2>) function ReformatText (fromline,toline) " execute a:fromline . ',' . a:toline . 'DelAllTrailWhitespace' call DelAllTrailWhitespace(a:fromline,a:toline) call ReformatTabs(a:fromline,a:toline) call ReformatIndent(a:fromline,a:toline) endfunction command -range=% ReformatIndent call ReformatIndent(<line1>,<line2>) function ReformatIndent (fromline,toline) " mark actual position let cursorLine = line(".") let cursorCol = col(".") " mark all commented lines let line_nr = a:fromline while (line_nr <= a:toline) let line = getline(line_nr) if !exists("b:commentstring") let commentstring = b:commentstring else let commentstring = '#' endif if (match(line,'^' . commentstring)>=0) let line = '@' . line " echo line call setline(line_nr, line) endif let line_nr = line_nr + 1 endwhile " indent all lines execute 'normal ' . a:fromline . 'G=' . a:toline . 'G' " reindent commented lines let substCmd = 's?^\s*@' . commentstring . '?' . commentstring . '?' silent! execute a:fromline . ',' . a:toline . substCmd " go back to mark call cursor(cursorLine, cursorCol) endfunction command -range=% ReformatTabs call ReformatTabs(<line1>,<line2>) function ReformatTabs (fromline,toline) let cursorLine = line(".") let cursorCol = col(".") if (a:fromline > 1) call cursor(a:fromline-1, 255) else call cursor(a:fromline, 1) endif let found = search('\t', 'W') while ((found > 0) && (found <= a:toline)) execute "normal r\t" let found = search('\t', 'W') endwhile call cursor(cursorLine, cursorCol) endfunction " convert UTF-8 to LATIN1 command ConvertUTF8 call ConvertUTF8() function ConvertUTF8() silent! %s/ä/\ä/ " ä silent! %s/ö/\ö/ " ö silent! %s/ü/\ü/ " ü silent! %s/Ä/\Ä/ " Ä " silent! %s/Ã&#xxx;/\Ö/ " Ö silent! %s/Ü/\Ü/ " Ü silent! %s/ß/\ß/ " ß silent! %s/€/€/ " € endfunction " find all non-extern functions in h-files function FindDeclaration() let bmsk_sw = g:bmsk_sw let bmsk_header = g:bmsk_header let bios_header = g:bios_header let id = '(\\ *[a-zA-Z0-9_]+\\ *)' let not_extern = '([^x]*\\ +)' let start = not_extern . '*' let type = '(' . id . '\\ +)' let declarator = '(' . id . ')' let parameter = '(' . id . ')(\\ +' . id .',?\\ *)?' let parlist = '(' . parameter . '+)' let bracket = '(\\(' . parlist . '\\))' let definition = '(\\ *({.*)?)' let declaration = '(\\ *;.*)' let end = definition "let end = definition . declaration . '?' execute ':Hgrep -x '' . start . type . declarator . bracket . end . ''' endfunction " indent a wordNum to position command -range -nargs=+ IndentWordNum call IndentWords(<f-args>, <line1>, <line2>) " handle range function IndentWords(wordNum, pos, fromline, toline) let cursorLine = line(".") let cursorCol = col(".") if (a:fromline > 1) call cursor(a:fromline-1, 255) else call cursor(a:fromline, 1) endif let line_nr = a:fromline while (line_nr <= a:toline) call cursor(line_nr, 1) call IndentWordNum(a:wordNum, a:pos) let line_nr = line_nr + 1 endwhile call cursor(cursorLine, cursorCol) endfunction " handle one line function IndentWordNum(wordNum, pos) " store cursor postion let cursorLine = line(".") let cursorCol = col(".") " echo 'IndentWordNum' cursorLine cursorCol a:wordNum a:pos getline(line(".")) " go to word at pos execute 'normal 0' . a:wordNum . 'w' if (line(".") == cursorLine) if (virtcol('.') > a:pos) " word has to be undented " go to end of previous word execute 'normal ge' if (virtcol('.') < a:pos-1) " ok, only whitespace to delete " echo 'undent' col(".") execute 'normal ' . a:pos . '|dw' else " delete as much as possible " echo 'remove' col(".") execute 'normal ldwi ' endif else " word has to be indented " echo 'indent' col(".") execute 'normal h' while (virtcol('.') < a:pos-1) " indent word execute "normal a\<TAB>\<ESC>" endwhile endif else " echo 'kein' a:wordNum '. Wort in Zeile' cursorLine endif " restore cursor position call cursor(cursorLine, cursorCol) endfunction " mark lines longer as textwidth command MarkLongLines call MarkLongLines('on') command MarkLongLinesOff call MarkLongLines('off') function MarkLongLines(onoff) " echo a:onoff if (a:onoff=='on') let markline = &textwidth + 1 let longline='"\%' . markline . 'v.*"' " execute('let @/ = ' . longline) execute 'syntax match toLong ' . longline . ' containedin=ALL' highlight toLong guibg=red else " execute 'normal :nohlsearch<CR>' syntax clear toLong highlight clear toLong endif endfunction command SynaxShowGroup execute('echo synIDattr(synID(line("."), col("."), 1), "name")') " ---------------- " Find Ugly C Code " ---------------- "function s:SingleChar(x, ...) " if a:0 > 0 " let a = a:1 " else " let a = a:x " endif " if a:0 > 1 " let b = a:2 " else " let b = a:x " endif " let string = '[' . a . ']\@<!' . a:x . '[' . b . ']\@!' " return string "endfunction " "function s:SpaceAround(x) " let string = '\%(\%(^\| \)\@<!' . a:x . '\)\|\%(' . a:x . ' \@!\)' " return string "endfunction command FindUglyC call FindUglyC() function FindUglyC() let KeyWords = ['if', 'for', 'while', 'switch', 'return', '[&|=]'] let KeyWordString = join(KeyWords, '\|') let SpaceBeforeParenthesis = '\(' . KeyWordString . '\)\zs(' let NoSpaceBeforeParenthesis = '\(' . KeyWordString . '\|\(^\s*\)' . '\)\@<! (' let NoSpaceAfterKomma = ',\zs[^ ]' let SpaceAfterOpenParenthesis = '(\zs ' let SpaceBeforeCloseParenthesis = ' )' let SpaceBeforeBracket = ' \[' let SpaceAtLineend = '\s\+$' let ReturnWithParenthesis = 'return\s*\zs(.*)\s*;' " let Operator1 = ['+', '-', '\*', '\/', '|', '&'] " let Operator1a = [] " for x in Operator1 " let Operator1a += [s:SpaceAround(s:SingleChar(x, x . '/\*', x . '=/\*-'))] " endfor " let Operator1String = join(Operator1a, '\|') " let Operator2 = [] " for x in Operator1 " let Operator2 += [s:SpaceAround(x . x)] " let Operator2 += [s:SpaceAround(x . '=')] " endfor " let Operator2String = join(Operator2, '\|') let UglyCstring = '\%(' . join([ \ SpaceBeforeParenthesis, \ NoSpaceBeforeParenthesis, \ NoSpaceAfterKomma, \ SpaceBeforeBracket, \ SpaceAfterOpenParenthesis, \ SpaceBeforeCloseParenthesis, \ SpaceAtLineend, \ ReturnWithParenthesis, \ ], '\)\|\%(') . '\)' let @/ = UglyCstring set hlsearch execute '/' . UglyCstring endfunction " options for Vimball let g:vimball_home = expand(g:vimsuite . '/vimfiles') " GetLatestVimScripts command GetLatestVimScriptsThroughProxy call s:GetLatestVimScriptsThroughProxy() function s:GetLatestVimScriptsThroughProxy() " Get Proxy data let proxy = input('Proxy: ', 'proxy.muc:8080') let user = input('User: ', 'qx13468') let password = inputsecret('Password: ') let $http_proxy = 'http://' . user . ':' . password . '@' . proxy " Set HOME for autoinstall let home = $HOME let $HOME=g:vimsuite " Get the scripts GetLatestVimScripts " reset HOME let $HOME = home endfunction let g:GetLatestVimScripts_wget = g:wget let g:GetLatestVimScripts_mv = g:mv " merge command -nargs=+ Merge call Merge(<args>) function Merge(...) let args = a:0 if a:0 != 4 echo 'usage: Merge first,second,root,out' else let first = fnamemodify(bufname(a:1), ':p:8') let second = fnamemodify(bufname(a:2), ':p:8') let root = fnamemodify(bufname(a:3), ':p:8') let out = fnamemodify(bufname(a:4), ':p:8') echo 'root-buffer :' root echo 'first-buffer :' first echo 'second-buffer:' second echo 'output-buffer:' out execute '!'. g:diff . ' ' . root . ' '. first . ' | ' . g:patch . ' --force ' . second . ' --output="' . out execute bufwinnr(4) . 'wincmd w' execute 'edit' execute 'wincmd =' endif endfunction " ------------- " abbreviations " ------------- "iabbreviate li !IST_LIEBL: */<Left><Left><Left> " --------- " templates " --------- command InsertCHeader call Insert_Header('file_c.tpl') command InsertHHeader call Insert_Header('file_h.tpl') command InsertKGSHeader call Insert_Header('file_kgs.tpl') command InsertFHeader call Insert_Header('funct.tpl') command InsertHTMLHeader call Insert_Header('html.tpl') function Insert_Header(file) let file = g:vimfiles . '/templates/' . a:file execute ':read ' . file " expand template let l:filename = expand('%:t') execute ':%s/%filename/' . l:filename . '/e' let l:basename = substitute(expand('%:t:r'), '.*', '\U\0', '') execute ':%s/%basename/' . l:basename . '/e' let l:date = strftime("%d.%m.%Y") execute ':%s/%date/' . l:date . '/e' if !exists("g:DoxygenToolkit_authorName") let g:DoxygenToolkit_authorName = input("Enter name of the author (gernarally yours...) : ") endif execute ':%s/%author/' . g:DoxygenToolkit_authorName . '/e' endfunction " ------- " Outlook " ------- command OutlookBugfix call s:OutlookBugfix() function s:OutlookBugfix() silent execute ':%s$^\(\%([^,]*,\)\{55}\)"\/o[^,]*\"\(,"EX","[^(]*(\)\([^)]*\)\()",\)$\1"\3"\2\3\4$c' silent execute ':%s$^\(\%([^,]*,\)\{47}\)"\/o[^,]*\"\(,"EX","[^(]*(\)\([^)]*\)\()",\)$\1"\3"\2\3\4$c' endfunction " --------- " VC plugin " --------- let g:vc_ignore_repos="-git" let g:vc_browse_cach_all = 1 " ------- " Tail -f " ------- command TailOn let g:TailTimer = timer_start(500, 'Tail', {'repeat': -1}) command TailOff call timer_stop(g:TailTimer) function Tail(timer) silent edit silent normal G endfunction EchoDebug 'loaded tools.vim'