'less -F' 可以有效地与 termcap 初始化结合使用吗?

mus*_*iKk 7 less

less -F如果内容适合一个屏幕,则关闭较少。但是,如果我使用 termcap 初始化,即我使用-X并且文件适合屏幕,则不会打印任何内容,因为 less 显示内容,注意到它们适合屏幕,在取消初始化期间退出并清除屏幕。

这可以证明如下(假设为空LESS变量):

$ echo foo > new_file
$ cat new_file
foo
$ less -X -F new_file
foo
$ less -F new_file
$
Run Code Online (Sandbox Code Playgroud)

我喜欢 termcap 功能,它允许使用鼠标滚轮进行滚动,所以我绝对不想使用-X. 如果内容适合屏幕(并且基本上表现得像cat),还有没有办法减少退出?

K3-*_*rnc 6

这是less“常见问题解答”的相关摘录:

退出时可以少离开屏幕吗?

当less 开始时,它向终端发送“ti” termcap 字符串,当它退出时,它发送“te”字符串。“te”字符串的确切作用取决于您使用的系统、终端类型以及您的 termcap 版本。在某些系统上,它什么也不做;在其他情况下,它会将屏幕恢复到 less 启动时的状态,从而从屏幕上擦除 less 正在查看的文件的最后一页。

如果您不喜欢系统上“te”的行为,您可以通过使用 -X 选项调用 less 来禁用“ti”和“te”字符串的发送。不幸的是,这有时会产生其他副作用,因为“ti”/“te”字符串可能会做其他需要的事情。例如,在某些终端上,禁用“ti”和“te”会导致箭头键停止工作。

如果您希望“te”做一些不同的事情(例如,如果屏幕还没有这样做,则恢复屏幕),您必须弄清楚如何更改系统上终端的 termcap 或 terminfo。不幸的是,这在不同的系统上是不同的,所以你必须检查你的系统的文档。

研究导致“ti”和“te”termcap 功能在terminfo 中被命名为“smcup”和“rmcup”,这是一个更现代的termcap 等效项。

您可以看到您的终端 ( $TERM, 可能xterm) 是如何配置的:

infocmp -1  # which will print out capabilites one per line
Run Code Online (Sandbox Code Playgroud)

您可以借助VT100 控制字符参考来解读序列的含义。

如果您从终端中去除“smcup”和“rmcup”功能:

infocmp -1 | sed -r '/[sr]mcup.*/d' > new-terminfo-for-$TERM
Run Code Online (Sandbox Code Playgroud)

然后让 terminfo 库知道这是 $TERM 的新的首选功能规范,

tic new-terminfo-for-$TERM
# you reverse this with `rm -ri ~/.terminfo`
Run Code Online (Sandbox Code Playgroud)

您会注意到less'替代屏幕不再被清除(因为它从未被输入过)。但是鼠标也不能用了

如果您摆弄“rmcup”控制字符序列并弄清楚,请告诉我!

更新:

一种可行的替代方法是将 less 包装为在文件适合终端高度时运行 cat 的函数(将其放在您的.bashrc 中):

less () {
    # When single file argument, and file small enough, cat it
    if [ $# = 1 ] && [ -f "$1" ] && [ $(wc -l "$1" | cut -d' ' -f1) -le $((${LINES:-0} - 3)) ]; then
        cat "$@"
    else
        command less "$@"
    fi
}
Run Code Online (Sandbox Code Playgroud)