Extremely simple Vim interface for Git

11 messages, 5 authors, 2016-06-15 · open the first message on its own page

Extremely simple Vim interface for Git

From: Teemu Likonen <hidden>
Date: 2016-06-15 22:45:19

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

Re: Extremely simple Vim interface for Git

From: Michael Wookey <hidden>
Date: 2016-06-15 22:45:19

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..

Re: Extremely simple Vim interface for Git

From: Teemu Likonen <hidden>
Date: 2016-06-15 22:45:19

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

Re: Extremely simple Vim interface for Git

From: Thomas Adam <hidden>
Date: 2016-06-15 22:45:19

Hi --

2008/9/6 Teemu Likonen [off-list ref]:
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

Re: Extremely simple Vim interface for Git

From: Teemu Likonen <hidden>
Date: 2016-06-15 22:45:19

Thomas Adam wrote (2008-09-07 14:23 +0100):
2008/9/6 Teemu Likonen [off-list ref]:
quoted
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 %

Re: Extremely simple Vim interface for Git

From: Thomas Adam <hidden>
Date: 2016-06-15 22:45:19

Hello --

2008/9/7 Teemu Likonen [off-list ref]:
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

Re: Extremely simple Vim interface for Git

From: Teemu Likonen <hidden>
Date: 2016-06-15 22:45:19

Teemu Likonen wrote (2008-09-07 16:13 +0300):
quoted
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

Re: Extremely simple Vim interface for Git

From: Michael Wookey <hidden>
Date: 2016-06-15 22:45:19

quoted
If you alter the RunShellCommand() function to the following -
quoted
      if stridx(a:cmdline, "diff") > 0
          set filetype=diff
      endif
quoted
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

Re: Extremely simple Vim interface for Git

From: Teemu Likonen <hidden>
Date: 2016-06-15 22:45:19

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.

Re: Extremely simple Vim interface for Git

From: Bob Hiestand <hidden>
Date: 2016-06-15 22:45:19

On Sun, Sep 7, 2008 at 8:23 AM, Thomas Adam [off-list ref] 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

Re: Extremely simple Vim interface for Git

From: Peter Valdemar Mørch (Lists) <hidden>
Date: 2016-06-15 22:45:20

Bob Hiestand bob.hiestand-at-gmail.com |Lists| wrote:
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help