git 日志-不能与 LESS 环境变量结合使用

git 日志-不能与 LESS 环境变量结合使用

我希望git loggit diff在退出时清除屏幕。我遵循说明并添加export LESS="FR"到我的.bashrc,因此git不会X向 less 命令添加选项(请参阅寻呼机配置git log)。当我运行或 时,它按预期工作git log -10

但是,只要我运行git log -6(或更低的运行速度),就不会再输出任何内容。原因似乎是模式quit-if-one-screen。但我不明白为什么会发生这种情况。

答案1

总结

我不明白为什么会这样

lesswithoutX使用备用屏幕显示其输出。如果它由于 而立即退出F,则备用屏幕会显示很短的时间(如果有的话),就像根本没有输出一样。


相关片段man 1 less

(在我的 Debian 9 中)

-F或如果整个文件可以在第一个屏幕上显示则自动退出--quit-if-one-screen
less

-X--no-init
禁用将 termcap 初始化和取消初始化字符串发送到终端。如果取消初始化字符串执行了不必要的操作(如清除屏幕),则有时需要这样做。


初步说明

  • 引文没有明确说明行为或“初始化和取消初始化字符串”取决于TERM环境变量。一般来说,最好假设任何超出简单读取或回显的交互都依赖于TERM。如果less确实依赖于;例如,TERM=vt100您很可能看不到X选项和缺少选项之间的区别,而您要求“退出时清除屏幕”将不是X可以通过“不向命令添加选项”来解决less
  • 我的测试是用 完成的TERM=screen。我预计许多其他终端类型也会有类似的行为。我相信您的问题是因为您的终端的行为与我的终端相似,并且我的其余答案也适用。
  • 逐字尝试以下命令时,应确保您的终端不太小也不太大。我的测试是在 30 行的终端中完成的。

情况 1:既不F也不X

当我做

seq 1 2 | LESS= less

或者

seq 1 100 | LESS= less

既未指定FX未指定。该工具使用备用屏幕。来自man 1 xterm

在 VTxxx 模式下,有转义序列用于激活和停用备用屏幕缓冲区,该缓冲区的大小与窗口的显示区域相同。激活后,当前屏幕将被保存并替换为备用屏幕。在恢复正常屏幕之前,将无法保存从窗口顶部滚动出来的行。

我需要按下q离开less备用屏幕并退出。从备用屏幕返回到我的正常屏幕的行为负责隐藏 的输出less。很简单:输出存在于备用屏幕缓冲区中,但不存在于正常屏幕缓冲区中。


情况 2:X

当我做

seq 1 2 | LESS=X less
# equivalent to
seq 1 2 | LESS= less -X

或者

seq 1 100 | LESS=X less
# equivalent to
seq 1 100 | LESS= less -X

该工具不会向终端发送通常会切换缓冲区的“初始化和取消初始化字符串”。所有输出都进入正常屏幕。我仍然需要按q退出。


情况 3:两种选择,F以及X

当我做

seq 1 2 | LESS=FX less
# equivalent to
seq 1 2 | LESS= less -FX

或者

seq 1 100 | LESS=FX less
# equivalent to
seq 1 100 | LESS= less -FX

正常屏幕也会被使用。如果行数太少,该工具将立即退出。好像我q立即击中了– 工作原理如下F。工具退出后,其输出仍然可见,因为这是我一直看到的正常屏幕。

您链接到的答案指出 Git 使用的默认选项是FRSX您链接到的配置读作FRX(答案发布后发生了变化?或者答案从一开始就有点错误)。无论如何,毫无疑问这是 Git 默认使用的情况。


情况 4:F

当我做

seq 1 2 | LESS=F less
# equivalent to
seq 1 2 | LESS= less -F

或者

seq 1 100 | LESS=F less
# equivalent to
seq 1 100 | LESS= less -F

使用了备用屏幕(如第一种情况),但如果行数足够少,less则会立即退出,就像我q立即点击一样(如第三种情况)。实际上,如果行数足够少,我根本看不到输出,因为正常屏幕会立即显示。我不会注意到备用屏幕;或者也许我的终端仿真器或视频硬件根本不会显示它,我会一直在显示器上看到正常屏幕。输出不存在于正常屏幕缓冲区中。这就是您所经历的。


结论

你说得对,F(或quit-if-one-screen)在这里至关重要。如果你放弃X,你F也应该放弃。注意链接的答案这样做:它从到FRSXR负责S换行,与问题无关),即它删除两个都。有一条评论说“删除唯一X选项就足够了”。我的测试表明这条评论是错误的,它导致了你遇到的问题。

相关内容