From: Peter Baumann Date: Tue, 17 Oct 2006 08:22:47 GMT Subject: Re: [PATCH] nice ftplugin for vim, that shows the commited diff in a split'ed buffer. Message-ID: <802d21790610170122j6191ba51l2c39d3bc6a3475b@mail.gmail.com> In-Reply-To: <11610450701082-git-send-email-madcoder@debian.org> 2006/10/17, Pierre Habouzit : > Signed-off-by: Pierre Habouzit > --- > contrib/vim/README | 6 ++++ > contrib/vim/ftplugin/gitcommit.vim | 61 ++++++++++++++++++++++++++++++++++++ > 2 files changed, 67 insertions(+), 0 deletions(-) > > diff --git a/contrib/vim/README b/contrib/vim/README > index 9e7881f..26c1682 100644 > --- a/contrib/vim/README > +++ b/contrib/vim/README > @@ -6,3 +6,9 @@ To syntax highlight git's commit message > $ cat >>$HOME/.vimrc <<'EOF' > autocmd BufNewFile,BufRead COMMIT_EDITMSG set filetype=gitcommit > EOF > + > +To use the fancy split-view with the currently commited diff, you need to: > + 1. Copy ftplugin/gitcommit.vim to vim's ftplugin directory: > + $ mkdir -p $HOME/.vim/ftplugin > + $ cp ftplugin/gitcommit.vim $HOME/.vim/ftplugin > + 2. Auto-detect the editing of git commit files (see above). > diff --git a/contrib/vim/ftplugin/gitcommit.vim b/contrib/vim/ftplugin/gitcommit.vim > new file mode 100644 > index 0000000..f9efd59 > --- /dev/null > +++ b/contrib/vim/ftplugin/gitcommit.vim > @@ -0,0 +1,61 @@ > +if exists("b:did_ftplugin") > + finish > +endif > + > +let b:did_ftplugin = 1 > + > +setlocal tw=74 > +setlocal nowarn nowb > + > +"{{{ function Git_diff_windows > + > +function! Git_diff_windows() > + let i = 0 > + let list_of_files = '' > + > + " drop everything until '# (will commit)' and the next empty line > + while i <= line('$') > + let line = getline(i) > + if line =~ '^#\s*(will commit)$' > + let i = i + 2 > + break > + endif > + > + let i = i + 1 > + endwhile > + > + " read file names until we have EOF or an empty line > + while i <= line('$') > + let line = getline(i) > + if line =~ '^#\s*[a-z ]*:.*->.*$' > + let file = substitute(line, '\v^#[^:]*:.*->\s*(.*)\s*$', '\1', '') > + let list_of_files = list_of_files . ' '.file > + let file = substitute(line, '\v^#[^:]*:\s*(.*)\s*->.*$', '\1', '') > + let list_of_files = list_of_files . ' '.file > + elseif line =~ '^#\s*[a-z ]*:' > + let file = substitute(line, '\v^#[^:]*:\s*(.*)\s*$', '\1', '') > + let list_of_files = list_of_files . ' '.file > + elseif line =~ '^#\s*$' > + break > + endif > + > + let i = i + 1 > + endwhile > + > + if list_of_files == "" > + return > + endif > + > + rightbelow vnew I find it confusing that you split vertically, especially if I work in small terminals. I would prefere a horizontal split, thats why I changed it to the way to the way it is handled in the svn.vim commit case: below new > + silent! setlocal ft=diff previewwindow bufhidden=delete nobackup noswf nobuflisted nowrap buftype=nofile > + exe 'normal :r!LANG=C cd ..; git diff HEAD -- ' . list_of_files . "\n1Gdd" > + exe 'normal :r!LANG=C cd ..; git diff HEAD -- ' . list_of_files . " \| git apply --stat\no\1GddO\" Why changing directory? I had to remove the cd .. to make it work. Otherwise git diff couldn't find the repository. Greetings, Peter