" =========================================================================== " File: svn.vim " Author: Stefan Liebl (S.Liebl@gmx.de) " Description: handles version controlling with subversion " =========================================================================== if !exists('g:svn') let g:svn = 'svn ' endif let g:SVNlogfile = fnamemodify(tempname(),':h') . '/SVNmessage.log' " -------- " commands " -------- command -nargs=? SVNdiff silent call s:SVNdiff('') command -nargs=? SVNcommit call s:SVNcommit('') command -nargs=0 SVNstatus call s:SVNstatus() command -nargs=0 SVNupdate call s:SVNupdate() command -nargs=0 SVNlog call s:SVNlog() command -nargs=? SVNadd call s:SVNadd('') command -nargs=0 SVNstudio call s:SVNstudio() " ---- " Menu " ---- let s:SVNMenuLocation = 100 let s:SVNmenuname = '&VCS.&SVN.' "------------------------- function s:SVNRedrawMenu() "------------------------- exec 'anoremenu '.s:SVNMenuLocation.'.5 '.s:SVNmenuname. \'&SVNstudio:SVNstudio'. \' :SVNstudio' exec 'anoremenu '.s:SVNMenuLocation.'.10 '.s:SVNmenuname. \'&status:SVNstatus'. \' :SVNstatus' exec 'anoremenu '.s:SVNMenuLocation.'.15 '.s:SVNmenuname. \'&update:SVNupdate'. \' :SVNupdate' exec 'anoremenu '.s:SVNMenuLocation.'.20 '.s:SVNmenuname. \'&diff:SVNdiff'. \' :SVNdiff' exec 'anoremenu '.s:SVNMenuLocation.'.30 '.s:SVNmenuname. \'&commit:SVNcommit'. \' :SVNcommit' exec 'anoremenu '.s:SVNMenuLocation.'.40 '.s:SVNmenuname. \'&log:SVNlog'. \' :SVNlog' exec 'anoremenu '.s:SVNMenuLocation.'.50 '.s:SVNmenuname. \'&add:SVNadd'. \' :SVNadd' endfunction if !exists('nosvnmenu') call s:SVNRedrawMenu() endif "---------------------------- function s:SVNcommit(logfile) "---------------------------- if filereadable(a:logfile) let options = '--file ' . a:logfile elseif a:logfile == '' let options = '' else echoerr 'Messagefile for SVNcommit not found: ' . a:logfile return endif " save all files wa let expression = g:svn . ' commit ' . options echo expression let output = system(expression) echo output let expression = g:svn . ' update' let output = system(expression) echo output if filereadable(a:logfile) call delete(a:logfile) endif endfunction "--------------------- function s:SVNupdate() "--------------------- let expression = g:svn . ' update' let output = system(expression) echo output endfunction "--------------------- function s:SVNstatus() "--------------------- let expression = g:svn . ' status' let output = system(expression) echo output endfunction "--------------------- function s:SVNlog() "--------------------- let expression = g:svn . ' log' let output = system(expression) echo output endfunction "------------------------ function s:SVNdiff(input) "------------------------ " default let revision = '' if a:input == '' " ohne Argument einfach aktuelles File mit Headrevision vergleichen let filename = expand('%:p') else if filereadable(a:input) " mit Filenamen einfach File mit Headrevision vergleichen let filename = a:input elseif str2nr(a:input) == a:input " Argument ist die Revision, mit der verglichen werden soll let revision = '-r '.a:input.' ' let filename = expand('%:p') else echo 'Falsches Argument: '.a:input exit endif endif if filereadable(filename) " open file in new tab execute 'tabnew ' . filename " store filetype let filetype = &filetype " open headrevision let headrevision = tempname() let command = '!' . g:svn . 'cat ' . revision . filename . ' > ' . headrevision silent execute command if winnr()==1 execute 'vsplit ' . headrevision else wincmd h execute 'view ' . headrevision endif " set filetype let &filetype=filetype diffthis wincmd l diffthis elseif isdirectory(filename) echo filename . ' is a directory' else echoerr 'file ' . filename . ' not found' endif endfunction "-------------------------- function s:SVNadd(filename) "-------------------------- if a:filename == '' let filename = expand('%:p') else let filename = a:filename endif let expression = g:svn . ' add ' . filename echo expression let output = system(expression) echo output endfunction "-------------------------------- function SVNgetModifiedFiles(...) "-------------------------------- let files = [] if a:0 > 0 let r1 = a:1 if a:0 > 1 let r2 = a:2 if str2nr(r1) > str2nr(r2) let r = r2 let r2 = r1 let r1 = r endif else let r2 = 'HEAD' endif let expression = g:svn . ' log --verbose --revision ' . r1 . ':' . r2 let re = '^\s\+\([AMR]\)\s\+\S*/\(src/\S*\)\(\s\+.*\)\?' else let expression = g:svn . ' status' let re = '^\([AMR]\)......\s*\(\S*\)' endif let output = system(expression) let lines = split(output, '\n') for line in lines let file = substitute(line, re, '\2', '') if file == line continue endif call add(files, file) endfor for file in files endfor return files endfunction "------------------------------------ function SVNgrepModified(regexp, ...) "------------------------------------ execute 'let files = SVNgetModifiedFiles(' . join(a:000, ',') . ')' if empty(files) echo 'no files changed' else let command = 'vimgrep /'.a:regexp.'/g ' . join(files, ' ') echo command execute command endif endfunction "--------------------- function s:SVNstudio() "--------------------- " Log-Message unten öffnen setlocal splitbelow silent execute '20split' g:SVNlogfile w " Status-Meldung in Temp-File umleiten let tempfile = tempname() " File anzeigen silent execute 'vsplit' tempfile call SVNwriteWindow(tempfile) " Show differences nmap :execute 'SVNdiff' SVNstudioGetFilename(getline(".")) nmap :silent execute '!' . g:svn . 'status > ' . g:SVNlogfile nmap :execute 'SVNcommit' g:SVNlogfile nmap :execute 'SVNadd' g:SVNlogfile nmap :call SVNwriteWindow(expand('%:p')) endfunction "---------------------------- function SVNwriteWindow(file) "---------------------------- normal ggdG normal oSVN studio normal ostatus message is displayed in this window normal oenter log message in right hand window normal o normal o show differences of file under cursor normal o copy status-info to log-window normal o commit changes with logmessage in right window normal o add file under cursor to repository normal o update status window normal o normal o------------------- normal o w let command = '!' . g:svn . 'status >> ' . a:file "echo command silent execute command e endfunction "--------------------------------- function SVNstudioGetFilename(line) "--------------------------------- let filename = substitute(a:line, '.\s\+\(.\+\)', '\1', '') return filename endfunction EchoDebug 'loaded svn.vim'