X-Git-Url: http://git.iain.cx/?p=profile.git;a=blobdiff_plain;f=.vim%2Fscript%2Fp4;h=59e28a11259629ae25ce2c353c4c71572f6fdd9b;hp=2195813c457dba1d44b09c8ef10222c3f56f2d98;hb=21daee34ff2d1d0ca13a79abb315e689ba22d2e3;hpb=675a86040ecad6a2712bcc2a0893122af0c081dc diff --git a/.vim/script/p4 b/.vim/script/p4 index 2195813..59e28a1 100644 --- a/.vim/script/p4 +++ b/.vim/script/p4 @@ -1,21 +1,81 @@ -: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 +" 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 + setf perforce + + " Clear the unnamed register. + let @" = "" + try + " Delete the spec blurb if it exists. + /^# A Perforce Change Spec/,/^# *(New changelists only\.)$/d + " If the blurb was deleted the text will be in the unnamed register. + if @" != "" + " Delete the blank line left above the remaining fields. + 1 + delete + + " 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 + + " Change directory so "file [p4 diff]" doesn't try to cd somewhere. + let l:cwd=getcwd() + cd / + file [p4 diff] + cd l:cwd + + " 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