问题简单,答案也简单。

How to keep the output after git log exit

Question

通常 git log 和 git diff 命令返回之后它们的屏幕输出会被清除,这一特性在 mac 和 linux 中比较常见,这是因为默认时它们的输出被隐含地管道输出给 less 命令接管。

Reason

less 命令本身支持标准输入的接管和全屏幕显示,然后在 less 退出时自动清屏以退出全屏显示,这是 linux Terminal/Tty 的一种不成文的规定,原因可以追溯到古早时期,清屏的目的是为了将终端显示屏幕给弄干净啰,不然的话光标说不定在屏幕正中,隐藏在一片文字之中,难免让人无法找到其坐标。为此当时人们的基操是退出全屏 CLI 程序后就回车多次,然后扫视屏幕变化从而找到光标位置。于是乎后来就干脆让全屏 CLI 程序总是在运行开始时请求全屏幕控制,具体参考 ANSI Color Sequences 规范,然后在运行结束前除了归还全屏控制之外也自动清屏。

less 命令已经 man 命令我以前曾经专门介绍过它们的使用特色,请阅读:

Solution

所以,让 less 在退出时保留屏幕输出的办法是增加命令行参数 -XSee Here

而让 git 自动引用这一变动的方法是:

1
git config --global --replace-all core.pager "less -iRFX"

其中的参数作用为:

  • -i - ignore case when searching (but respect case if search term contains uppercase letters)
  • -R - raw control chars / 遇到控制字符时输出为 ^X 样式
  • -F - exit if text is less then one screen long / 如果输出内容不足一屏那就直接退出,而不进入全屏模式
  • -X - do not clear screen on exit / 保留输出文字

然后你就可以愉快地玩耍了。

由于 git loggit diff 都会使用操作系统环境变量 PAGER 的参数,所以上述方法同时作用于这些命令。而且,如果你想要临时变更而不是永久变更的话,也可以这样:

1
2
$ PAGER='less -iRFX' git log
$ PAGER='less -iRFX' git diff

使用 delta

为了让 git diff 在命令行中的输出更有参考性,你可能已经定制了 git config core.pager 去使用 delta 这个第三方工具。

delta 是一个 less 的替代品,它用在 git log/diff/blame 场景中的主要亮点在于:

  • 语法高亮
  • 带有行号
  • 可以导航(即如同 less 一样的全屏模式)
  • 支持 diff 的双列显示
  • 自适应 dark/light 主题色

等等。

好,我不是要带货推广,delta 的使用很容易,直接去 官网 阅读就好。

这里只给出一个快捷方式,为了保留屏幕输出,你可以给 delta 加上 –pager 参数。是不是很熟悉?这样就可以沿用前文所给出的 less 解决方案了。所以当你使用 delta 作为 git 的 pager 时,就这么定制一下:

1
git config --global --replace-all core.pager "delta --dark -n --navigate --pager 'less -iRFX'"

然后就继续愉快地玩耍吧。

一个效果图如下:

Screenshot 2024-02-05 at 10.20.10

结束语

很多事情都很奇妙。

这次只是一个简单的记录,因为确实发现记忆力减退了。

🔚

留下评论