X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=.vim%2Fscript%2Fp4;h=286130b0649b70e83d6f86d1d2795bfc6d59e88a;hb=f323f70672f417e225e7135de8b4c49cf81d3f70;hp=2195813c457dba1d44b09c8ef10222c3f56f2d98;hpb=675a86040ecad6a2712bcc2a0893122af0c081dc;p=profile.git diff --git a/.vim/script/p4 b/.vim/script/p4 index 2195813..286130b 100644 --- a/.vim/script/p4 +++ b/.vim/script/p4 @@ -1,21 +1,91 @@ -: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 + + try + /everything below this line is just the diff/ + + " We are submitting through git p4 so yank the diff. + normal j + normal yG + " Create a new window below the spec and paste the diff. + botright new + normal p + catch + " Get the files in the changelist. + let l:files = system("sed -n 's@^ \\(//.*\\) #.*@\"\\1\"@p' " . bufname("")) + " Create a new window 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 + endtry + + 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 + normal G + ?^Description: + let @/ = "" + + " Set formatting. + se noexpandtab + se ts=8 + 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