X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=.vim%2Fscript%2Fp4;h=9319906d7a7ac4cc9ed21c6a8b7bf731a4cc94b2;hb=d0d885039e0b7f2242d6db6eb2ba36da132f1b94;hp=2195813c457dba1d44b09c8ef10222c3f56f2d98;hpb=675a86040ecad6a2712bcc2a0893122af0c081dc;p=profile.git diff --git a/.vim/script/p4 b/.vim/script/p4 index 2195813..9319906 100644 --- a/.vim/script/p4 +++ b/.vim/script/p4 @@ -1,21 +1,71 @@ -:if ! &ro -:try - /^# A Perforce Change Spec/,/^$/d - - :set nomod - - :wincmd n - :wincmd J - :r!p4 diff - :1 - :delete - - :setf diff - :set nomod - - :wincmd k - / - :let @/ = "" -:catch -:endtry -:endif +" $Id$ vim: se syntax=vim: +" Define the function we'll use. It's easier to do this than to faff about +" trying to run a sequence of normal mode commands. +fun! P4submit() + " There's no point doing this if the spec is readonly. That probably means + " it's a submitted change. + if ! &ro + " Clear the unnamed register. + let @" = "" + try + " Delete the spec blurb if it exists. + /^# A Perforce Change Spec/,/^$/d + " If the blurb was deleted the text will be in the unnamed register. + if @" != "" + " Allow closing an unmodified spec. + set nomod + + " Get the files in the changelist. + let l:files = system("sed -n 's@^ \\(//.*\\) #.*@\\1@p' " . bufname("")) + " Create a new window, move it below the spec and read in a diff. + botright new + if l:files != "" + exe "r!env P4DIFF= p4 diff -du " . substitute(l:files, "\n", " ", "g") + endif + + setf diff + + " Delete the blank line left above the diff. + 1 + delete + set nobuflisted + set buftype=nowrite + set bufhidden=hide + setlocal noswapfile + file [p4 diff] + + " Switch back to the top window and put the cursor by the description. + wincmd k + resize 10 + exe "normal G" + ? + let @/ = "" + endif + catch + " We get here if no blurb was deleted. This is the case if we aren't + " editing a change. + endtry + endif +endfun + +" Expand the command line window so we don't have to press RETURN later. +let s:cmdheight = &cmdheight +set cmdheight=3 + +" Call and then discard our function. +call P4submit() +delfunction P4submit +" Don't expand tabs in the spec. +set noexpandtab + +" Restore the command window. +exe "set cmdheight=" . s:cmdheight + +" Close the scratch buffer. +if version >= 700 + " Vim 7 lets us close the buffer by number. The changelist is always in #1. + au BufWinLeave qa! +else + " Prior versions can only do it by name. Fall back to a temporary file. + au BufWinLeave /tmp/tmp.*.* qa! +endif