threads / discuss / 15397

Extremely simple Vim interface for Git

Subject: Extremely simple Vim interface for Git

## tl;dr

11 messages between Sep 6, 2008 and Sep 9, 2008.

replies: 10people: 5as markdown or json

Teemu Likonen· Sep 6, 2008, 19:37 UTC · lore

Here's a very simple idea for using Git from Vim editor. Add these lines to your ~/.vimrc file:

    command! -complete=file -nargs=* Git   call s:RunShellCommand('git '.<q-args>)
    command! -complete=file -nargs=* Svn   call s:RunShellCommand('svn '.<q-args>)
    command! -complete=file -nargs=+ Shell call s:RunShellCommand(<q-args>)
    let $EDITOR = '/usr/bin/gvim --nofork'
    function! s:RunShellCommand(cmdline)
        botright new
        setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile
        setlocal nowrap
        call setline(1,a:cmdline)
        call setline(2,substitute(a:cmdline,'.','=','g'))
        execute 'silent 2read !'.escape(a:cmdline,'()%#')
        setlocal nomodifiable
        1
    endfunction

Now, command :Git works just like "git" from shell except that the output is displayed in a Vim scratch buffer/window. The buffer will be wiped out from memory when the window is closed. Filename completion and piping works. Examples:

    :Git diff --cached
    :Git help merge
    :Git branch | column

(I am aware that there are VCS plugins for Vim. I happen like this approach better because it works just like the command line Git which I'm familiar with.)

As a "side effect" this also adds similar :Svn command as well as :Shell command which can be used to run any shell command and have its output displayed in a Vim window. Using the first two letters of :Shell is enough in my system because I don't have other custom commands which start with letters "Sh".

    :Sh ls -l
Michael Wookey· Sep 7, 2008, 10:32 UTC · re: Teemu Likonen · lore

Re: Extremely simple Vim interface for Git

Show 20 quoted lines
> Here's a very simple idea for using Git from Vim editor. Add these lines
> to your ~/.vimrc file:
>
>
>    command! -complete=file -nargs=* Git   call s:RunShellCommand('git '.<q-args>)
>    command! -complete=file -nargs=* Svn   call s:RunShellCommand('svn '.<q-args>)
>    command! -complete=file -nargs=+ Shell call s:RunShellCommand(<q-args>)
>
>    let $EDITOR = '/usr/bin/gvim --nofork'
>
>    function! s:RunShellCommand(cmdline)
>        botright new
>        setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile
>        setlocal nowrap
>        call setline(1,a:cmdline)
>        call setline(2,substitute(a:cmdline,'.','=','g'))
>        execute 'silent 2read !'.escape(a:cmdline,'()%#')
>        setlocal nomodifiable
>        1
>    endfunction
If you alter the RunShellCommand() function to the following -
  function! s:RunShellCommand(cmdline)
      botright new
      setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile
      setlocal nowrap
      if stridx(a:cmdline, "diff") > 0
          set filetype=diff
      endif
      execute 'silent 0read !'.escape(a:cmdline,'%#')
      setlocal nomodifiable
      1
  endfunction

Then Vim will apply diff syntax highlighting to the scratch buffer when a "diff" command is executed.

For example:
  :Git diff
  :Git diff --cached
etc..
Teemu Likonen· Sep 7, 2008, 13:13 UTC · re: Michael Wookey · lore

Re: Extremely simple Vim interface for Git

Michael Wookey wrote (2008-09-07 20:32 +1000):
> If you alter the RunShellCommand() function to the following -
>       if stridx(a:cmdline, "diff") > 0
>           set filetype=diff
>       endif
> Then Vim will apply diff syntax highlighting to the scratch buffer
> when a "diff" command is executed.
Good idea. I implemented the same thing this way:
    if match(a:cmdline,'\v^(git|hg|svn|bzr) diff') >= 0
        setlocal filetype=diff
    endif
Teemu Likonen· Sep 7, 2008, 17:46 UTC · re: Teemu Likonen · lore

Re: Extremely simple Vim interface for Git

Teemu Likonen wrote (2008-09-07 16:13 +0300):
Show 8 quoted lines
> > Then Vim will apply diff syntax highlighting to the scratch buffer
> > when a "diff" command is executed.
> 
> Good idea. I implemented the same thing this way:
> 
>     if match(a:cmdline,'\v^(git|hg|svn|bzr) diff') >= 0
>         setlocal filetype=diff
>     endif
Or even better, detect by the content:
    if search('\m\C^--- .*\n+++ .*\n@@','n')
        setlocal filetype=diff
    endif

It works with things like "git show" and "git log -p" too. Here's updated version for those who are interested:

    command! -complete=file -nargs=* Git call s:RunShellCommand('git '.<q-args>)
    " To run any shell command:
    "command! -complete=file -nargs=+ Shell call s:RunShellCommand(<q-args>)
    " Additional $VCS commands:
    "command! -complete=file -nargs=* Hg call s:RunShellCommand('hg '.<q-args>)
    "command! -complete=file -nargs=* Svn call s:RunShellCommand('svn '.<q-args>)
    "command! -complete=file -nargs=* Bzr call s:RunShellCommand('bzr '.<q-args>)
    " In case a shell command wants to open $EDITOR we use something
    " that works from inside Vim.
    let $EDITOR = '/usr/bin/gvim --nofork'
    function! s:RunShellCommand(cmdline)
        botright new
        setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
        call setline(1,a:cmdline)
        call setline(2,substitute(a:cmdline,'.','=','g'))
        execute 'silent $read !'.escape(a:cmdline,'()%#')
        setlocal nomodifiable
        if search('\m\C^--- .*\n+++ .*\n@@','n')
            setlocal filetype=diff
        endif
        1
    endfunction
Michael Wookey· Sep 7, 2008, 22:47 UTC · re: Teemu Likonen · lore

Re: Extremely simple Vim interface for Git

Show 14 quoted lines
>> If you alter the RunShellCommand() function to the following -
>
>>       if stridx(a:cmdline, "diff") > 0
>>           set filetype=diff
>>       endif
>
>> Then Vim will apply diff syntax highlighting to the scratch buffer
>> when a "diff" command is executed.
>
> Good idea. I implemented the same thing this way:
>
>    if match(a:cmdline,'\v^(git|hg|svn|bzr) diff') >= 0
>        setlocal filetype=diff
>    endif

Vim 7.2 provides a better alternative. If the command is specifically 'git' then setting the filetype to 'git' also provides the correct syntax highlighting.

For example,
  if v:version >= 702
      if stridx(a:cmdline, "git") == 0
          setlocal filetype=git
      endif
  endif
Syntax highlighting is displayed correctly for several commands including:
  :Git diff
  :Git show
  :Git log

And possibly others. If Vim (7.2) is your default editor when performing a "git commit" then there is also a new built in Vim command -

  :DiffGitCached

This opens a preview window with the contents of "git diff --cached". The :DiffGitCached command is only available when filetype=gitcommit.

Perhaps some of these ideas should be added to the Vim wiki...
http://vim.wikia.com/wiki/Display_shell_commands%27_output_on_Vim_window
Teemu Likonen· Sep 8, 2008, 05:26 UTC · re: Michael Wookey · lore

Re: Extremely simple Vim interface for Git

Michael Wookey wrote (2008-09-08 08:47 +1000):
> Vim 7.2 provides a better alternative.  If the command is specifically
> 'git' then setting the filetype to 'git' also provides the correct
> syntax highlighting.

Thanks, I didn't know that. Definitely better. I see filetype "git" is already in my Vim 7.1.314 (Debian Etch backports).

> Perhaps some of these ideas should be added to the Vim wiki...
> 
> http://vim.wikia.com/wiki/Display_shell_commands%27_output_on_Vim_window

This Vim tip was originally written by me. I extended it with the version control tools.

Thomas Adam· Sep 7, 2008, 13:23 UTC · re: Teemu Likonen · lore

Re: Extremely simple Vim interface for Git

Hi --
2008/9/6 Teemu Likonen <tlikonen@iki.fi>:
Show 7 quoted lines
> Here's a very simple idea for using Git from Vim editor. Add these lines
> to your ~/.vimrc file:
>
>
>    command! -complete=file -nargs=* Git   call s:RunShellCommand('git '.<q-args>)
>    command! -complete=file -nargs=* Svn   call s:RunShellCommand('svn '.<q-args>)
>    command! -complete=file -nargs=+ Shell call s:RunShellCommand(<q-args>)
Looks interesting.  Have you seen this though:
http://code.google.com/p/vcscommand/
-- Thomas Adam
Teemu Likonen· Sep 7, 2008, 13:59 UTC · re: Thomas Adam · lore

Re: Extremely simple Vim interface for Git

Thomas Adam wrote (2008-09-07 14:23 +0100):
Show 12 quoted lines
> 2008/9/6 Teemu Likonen <tlikonen@iki.fi>:
> > Here's a very simple idea for using Git from Vim editor. Add these lines
> > to your ~/.vimrc file:
> >
> >
> >    command! -complete=file -nargs=* Git   call s:RunShellCommand('git '.<q-args>)
> >    command! -complete=file -nargs=* Svn   call s:RunShellCommand('svn '.<q-args>)
> >    command! -complete=file -nargs=+ Shell call s:RunShellCommand(<q-args>)
> 
> Looks interesting.  Have you seen this though:
> 
> http://code.google.com/p/vcscommand/

I have tried it but I made my own because I'm familiar with git's command line interface and want to use it inside Vim without (too many) restrictions. I find this approach easier because I don't need to learn another interface layer.

I'd like to add a hint that Vim command line expands % to current file name. Examples:

    :Git add %
    :Git blame -C %
Thomas Adam· Sep 7, 2008, 14:11 UTC · re: Teemu Likonen · lore

Re: Extremely simple Vim interface for Git

Hello --
2008/9/7 Teemu Likonen <tlikonen@iki.fi>:
Show 5 quoted lines
> I'd like to add a hint that Vim command line expands % to current file
> name. Examples:
>
>    :Git add %
>    :Git blame -C %

I will certainly try this plugin of yours when I am at work next since it does look cool. Thanks.

-- Thomas Adam
Bob Hiestand· Sep 8, 2008, 17:41 UTC · re: Thomas Adam · lore

Re: Extremely simple Vim interface for Git

On Sun, Sep 7, 2008 at 8:23 AM, Thomas Adam <thomas.adam22@gmail.com> wrote:
> Looks interesting.  Have you seen this though:
>
> http://code.google.com/p/vcscommand/
On this mailing list you should use this link instead:
http://repo.or.cz/w/vcscommand.git
Peter Valdemar Mørch (Lists)· Sep 9, 2008, 06:26 UTC · re: Bob Hiestand · lore

Re: Extremely simple Vim interface for Git

Bob Hiestand bob.hiestand-at-gmail.com |Lists| wrote:
Show 7 quoted lines
>> Looks interesting.  Have you seen this though:
>>
>> http://code.google.com/p/vcscommand/
> 
> On this mailing list you should use this link instead:
> 
> http://repo.or.cz/w/vcscommand.git

I personally have the opposite preference. The home page gives an overview and a link to the repository. The repository has no overview or easy-to-find link to the home page. Therefore I'd almost always perfer a link to the project home page to get an idea. For 9 out of 10 projects I wouldn't download the code anyway.

But who are we to impose our preferences on another poster?
Peter
-- 
Peter Valdemar Mørch
http://www.morch.com

← back to recent threads