Ikar Pohorský
Ikar Pohorský

Reputation: 5039

How to setup coloured git diff with vim as a pager

I am unable to configure git to follow my requests:

  1. use vim as a diff pager
  2. keep colours for diff when adding files in interactive mode

My ~/.gitconfig setup:

[color]
    ui = auto
    # diff = false

[pager]
    diff = vim -

With this configuration the interactive mode for git add --interactive produces coloured output as expected:

interactive adding

The downside of this is that diff in vim is corrupted. See the output of git diff:

diff using vim

When using git diff | vim - the colours are OK but I'm too lazy to type the full command. Is there any known method that preserves colours in both cases?

Upvotes: 10

Views: 4943

Answers (3)

ZyX
ZyX

Reputation: 53604

You need to install AnsiEsc plugin and run :AnsiEsc just after loading file. You can set pager to vim -c AnsiEsc - to do this.

Alternatively, use vim own highlighting: using the same method (-c command) run

%sm/\e.\{-}m//g
set ft=diff

:

    diff = "vim -c '%sm/\\e.\\{-}m//g' -c 'set ft=diff' -"

Upvotes: 14

timss
timss

Reputation: 10260

You have two alternatives here.

Use Vimdiff as a difftool

$ git config --global diff.tool vimdiff
$ git config --global difftool.prompt false
$ git config --global alias.d difftool

[diff]
    tool = vimdiff
[difftool]
    prompt = false
[alias]
    d = difftool # Not needed, just a convenience. $ git difftool, still works.

Regular Git diff, but with color highlithing.

$ git config --global color.ui true

[color]
    ui = true

Right now, you have a weird mix. You can of course use both, but the pager is messing up things.
The reason you get ^[32m etc is because you're trying to read shell colors in Vim. This doesn't work.

Upvotes: 4

Fredrik Pihl
Fredrik Pihl

Reputation: 45634

Try these settings:

git config --global diff.tool vimdiff
git config --global merge.tool vimdiff

git config --global difftool.prompt false

Upvotes: 0

Related Questions