如何在vim中设置彩色git diff作为分页器

10

我无法配置git以按照我的要求进行操作:

  1. 使用vim作为差异分页器
  2. 在交互模式下添加文件时保留差异的颜色

我的~/.gitconfig设置如下:

[color]
    ui = auto
    # diff = false

[pager]
    diff = vim -

使用这个配置后,git add --interactive 的交互模式会像预期一样产生带颜色的输出:

交互式添加

不过这样做的缺点是 vim 中的差异显示会出现问题。请见 git diff 的输出:

在 vim 中使用差异对比

当使用 git diff | vim - 命令时,颜色是正常的,但我懒得输入完整命令。是否有已知的方法可以在两种情况下都保留颜色?


请参考 http://stackoverflow.com/questions/39470081/vim-check-if-running-as-a-pager 了解如何在加载时自动执行 :AnsiEsc。 - 0fnt
3个回答

14

您需要安装AnsiEsc插件,并在加载文件后立即运行:AnsiEsc。您可以将翻页器设置为vim -c AnsiEsc -来执行此操作。

或者,使用vim自己的高亮功能:使用相同的方法(-c command)运行

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

:

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

3
完美,谢谢!我使用了一个稍微改进的版本,在替换后将光标设置在缓冲区顶部。它还会忽略空的差异:diff = "vim -c '%sm/\e.\{-}m//ge' -c 'set ft=diff' -c 'normal gg' -" - Ikar Pohorský
1
我添加了“-c 'setlocal buftype=nofile'”以防止vim在尝试:q时抱怨未保存的更改。 - notlesh

4
你有两个选择:

使用Vimdiff作为Diff工具。

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

使用彩色高亮显示的常规Git差异。

$ git config --global color.ui true

[color]
    ui = true

目前,你的情况有些混乱。当然你可以同时使用两种方式,但是pager会让事情变得混乱。
你看到的^[32m等字符是由于你在尝试读取Vim中的shell颜色。这是不起作用的。


0

尝试使用以下设置:

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

git config --global difftool.prompt false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接