如何阻止`clear`清除回滚缓冲区

sti*_*ray 8 command-line gnome-terminal 16.04

最初我认为无限滚动不适用于 16.04 上的终端应用程序。我没有选中“限制回滚到”选项。有时它会向后滚动,有时它不会。然后我意识到当我使用clear命令时它不会回滚。它只向后滚动一个屏幕。

我经常使用 clear(几乎每 3 个命令一次)。

clear 的手册页指向 terminfo。terminfo 上有一些选项,但我找不到可以在其中定义选项的配置文件。/lib/terminfo/ 下的所有文件似乎都在读取它的配置,这些文件都是编译格式,我不理解它们。

我在 14.04 之前没有看到这个问题(猜测)。

任何帮助是极大的赞赏。

谢谢。

小智 12

这花了我一段时间才弄明白,所以我想我应该分享一下我是如何让它工作的。

如果你输入“man clear”,你会看到手册上写着:

如果可能,clear 会清除您的屏幕,包括其回滚缓冲区(如果定义了扩展的“E3”功能)。

我们将删除此 E3 功能:

首先,找出您的终端类型:

echo $TERM
Run Code Online (Sandbox Code Playgroud)

对我来说,这导致了“xterm-256color”。不管它输出什么,记住它。

现在输入命令:

infocmp -x xterm-256color > tempfile
Run Code Online (Sandbox Code Playgroud)

显然,您将 xterm-256color 替换为第一个命令的输出。这将输出此终端类型的扩展功能到“tempfile”。

现在编辑这个新创建的文件。您正在寻找:

E3=\E[3J,
Run Code Online (Sandbox Code Playgroud)

找到它并删除它。整个事情,所以如果它看起来像:

    ...
    Cs=\E]12;%p1%s\007, E3=\E[3J,
    Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
    ...
Run Code Online (Sandbox Code Playgroud)

它现在应该是这样的:

    ...
    Cs=\E]12;%p1%s\007,
    Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q,
    ...
Run Code Online (Sandbox Code Playgroud)

保存文件。并从您的终端执行:

sudo tic -x tempfile
Run Code Online (Sandbox Code Playgroud)

这将加载您修改后的 terminfo 并存储它。重新启动终端并清除现在应该不再删除滚动缓冲区

  • 您可以在没有“sudo”的情况下执行 tic 命令,它将结果存储在 ~/.terminfo 而不是全局。 (3认同)

bas*_*lam 11

你想要的是输入CTRL+L而不是clear.

这将向终端发送“Form Feed”。基本上它会将所有内容向上移动到终端窗口的高度以清除屏幕而不会影响您的回滚。


ynn*_*ynn 7

简短的回答:如果您有相对较新的版本clear,您可以避免通过选项清除滚动缓冲区-x


长答案

clearcommans 是 的一部分ncurses

根据变更日志

20130622
        + 修改clear程序以考虑 E3 扩展
           功能,以清除终端的回滚缓冲区(
           Miroslav Lichvar 的补丁,Redhat #815790)。

因此OP的猜测

我在 14.04 之前没有看到这个问题(猜测)。

也许是对的。变更日志还说

20170819
        +-x在clear/tput 中添加选项以使E3 扩展成为可选
           (参见:20130622)。

-x因此,如果发布日期ncurses等于或晚于 2017-08-19,则可以使用选项。这可以通过命令检查clear -V。例如,

$ clear -V
ncurses 6.1.20180127
Run Code Online (Sandbox Code Playgroud)

这可以理解为“ncurses 6.1发布于2018-01-27”。

我确认,就我使用的官方存储库而言,该过程在

  • Arch Linux

  • Arch Linux ARM

  • Linut Mint 19

  • Ubuntu 20.04

  • Raspbian Buster Lite

并且无效于

  • Raspbian Stretch Lite(这比 更旧Buster。)


the*_*les 5

这个答案建立在黄貂鱼的答案之上(他做了一些非常好的工作)并且旨在完成它。

1 - 要在不丢失回滚的情况下进行清除,请在控制台中输入以下命令(不需要按照 stringray 的答案中的建议使用 python):

printf '\33[H\33[2J'
Run Code Online (Sandbox Code Playgroud)

2 - 为避免记住这一点,您可以编辑 .bashrc 文件为其创建别名。我会称别名为clear。在 bash 中,输入:

nano ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

并在最后添加这一行:

alias clean="printf '\33[H\33[2J'"
Run Code Online (Sandbox Code Playgroud)

我还想添加 div(用于分隔符):

alias div='echo;echo "------------------------------------------------------------------------------";echo;echo;echo;echo;echo;echo;echo;echo;echo;echo;echo;echo "------------------------------------------------------------------------------";clean'
Run Code Online (Sandbox Code Playgroud)

这使得当你执行 div 命令时,它进入两个分隔符,它们之间有 10 个新行,然后是一个干净的命令。这将使当您向后滚动时,您将确切知道您使用 div 的位置。

您可以通过在我列出的过程之前执行 sudo su 来更改 sudo bash 行为。

我会推荐这个超过 bashBedlam 使用 tic 的答案,作为编辑 .bashrc:

1) 它不需要 sudo 权限,可以随时随地轻松使用。

2)只影响你的用户(不是所有的用户都会想要修改后的清除功能)

3) 将在通常不涉及 bashrc 的更新中幸存下来


小智 5

如上所述,clear -x确实有窍门。

但是,如果您像我一样,习惯性地clear每天输入数百次,并且不希望不训练您的手指,那么您可能需要创建一个简单的别名.bashrc(或等效项),如下所示: alias clear='clear -x'