答案1
总结
我不明白为什么会这样
less
withoutX
使用备用屏幕显示其输出。如果它由于 而立即退出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
既未指定F
也X
未指定。该工具使用备用屏幕。来自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
也应该放弃。注意链接的答案这样做:它从到FRSX
(R
负责S
换行,与问题无关),即它删除两个都。有一条评论说“删除唯一X
选项就足够了”。我的测试表明这条评论是错误的,它导致了你遇到的问题。