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

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

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

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

$ echo foo > new_file
$ cat new_file
foo
$ less -X -F new_file
foo
$ less -F new_file
$

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

答案1

这是相关摘录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

您可以借助以下方法破译序列的含义VT100控制字符参考

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

infocmp -1 | sed -r '/[sr]mcup.*/d' > new-terminfo-for-$TERM

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

tic new-terminfo-for-$TERM
# you reverse this with `rm -ri ~/.terminfo`

你会注意到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
}

答案2

对于缓慢的输入,例如git log -Gregex,您想要:

A) 行进入时显示在主屏幕上,然后在需要滚动时切换到备用屏幕(因此第一个$LINES输出将始终出现在回滚中);如果是这样,请选择第二个吉尔斯对类似问题的回答

B) 行出现在备用屏幕上,但如果不需要滚动,则退出备用屏幕并将行打印到主屏幕(因此,如果需要滚动,回滚中将不会出现任何输出);如果是这样,看看我对类似问题的回答

答案3

问题中报告的行为已修复less 530版从 2018 年 2 月起:

  • 如果使用 -F 并且文件适合一个屏幕,则不输出终端初始化序列。

这意味着输出会留在屏幕上,无论是否带有-X.

此外,less 598版从 21 月 21 日起,引入了--redraw-on-quit在屏幕上保留最后一个视图的选项,即使有多个屏幕并且使用了备用屏幕:

--redraw-on-quit
       When quitting, after sending the terminal deinitialization string, redraws
       the entire last screen.   On  terminals  whose  terminal  deinitialization
       string  causes the terminal to switch from an alternate screen, this makes
       the last screenful of the current file remain visible after less has quit.

相关内容