如何通过shell命令在终端中重置回滚?


41

使用Terminal.app时,可以使用内置的外壳程序clear或按^+ L(Ctrl-L)来清除屏幕。

但是,所有要做的就是将当前屏幕内容后退一个屏幕高度,并在第一行重置光标/输入。意味着您仍然可以向后滚动并看到它。

您还可以通过按+ K(Command-K)重置整个回滚。

完成此操作后,您将无法再向后滚动。

在某些情况下(特别是在运行screen或之前vim),我想在命令实际执行之前重置向后滚动。

是否有clear在OS X中实现的命令(如)允许我执行此操作?考虑到pbcopy和的存在pbpaste,我在想可能会存在类似的情况,使我能够这样做。


正如克里斯·佩奇斯(Chris Pages)在终端使用命令中说的那样:(clear && printf '\e[3J' 您选择了错误的答案作为正确的答案!)
电子人(Cyborg

Answers:


57

终端支持ED(显示擦除)转义序列的扩展,以消除回滚。xterm也支持它。VT100手册中描述的ED命令接受Ps参数的以下值:

电调

参数参数含义

0从有效位置擦除到屏幕末尾
1从屏幕开始擦除到激活位置
2删除所有显示

终端(和xterm)添加:

3擦除后退(又名“已保存的行”)

请注意,这只会删除回滚,而不删除屏幕。这使您可以通过发送两个转义序列来擦除一个或另一个,或两者都擦除。

例如,您可以使用以下shell命令清除屏幕和向后滚动: clear && printf '\e[3J'

(该clear命令会查找适当的顺序以清除当前终端的屏幕,但是“擦除回滚”转义序列是自定义的,必须进行硬编码。如果将其放入您不知道的shell脚本中对于某些将只使用终端上运行,你应该检查$TERM_PROGRAMApple_Terminal发送之前。)


4
这比osascript快得多!
谢尔盖(Sergei)2014年

3
这是一个更好的答案。因此,将其永久保留,添加到您的〜/ .bash_profile中: alias clear="clear && printf '\e[3J'"
汤姆

1
我将此脚本放在了自己的PATH中:echo $'#!/usr/bin/env bash\n/usr/bin/clear\nprintf \'\\e[3J\'' >clr; chmod +x clr
Walker Hale IV

2
@WalkerHaleIV为什么要创建一个可执行文件,而不仅仅是将转义序列打印到stdout?
克里斯Page

1
$ TERM_APPLICATION应该是$ TERM_PROGRAM
pbatey

30

⌘K,“查看>清除后退”的快捷方式。

UPDATE:可以通过以下命令使用AppleScript自动执行此操作:

osascript -e 'tell application "System Events" to keystroke "k" using command down'

…您当然alias可以随心所欲,或将其存储在~/.profile登录脚本中的函数中:)

为了安全起见,即使在后台也可以使用它,而又不会冒给错误的前端应用程序敲击键盘的风险,我建议对它进行以下测试:

if application "Terminal" is frontmost

…为我们提供了以下代码:

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

…依次正确地进行了转义和alias编辑,结束于:

alias clear="osascript -e 'if application \"Terminal\" is frontmost then tell application \"System Events\" to keystroke \"k\" using command down'"

这是您的新clear货!:)


这里的重点是我想在shell的环境中进行设置,以便当我运行命令(例如vim)时,shell在执行vim之前执行“ scrollback reset”。程序化的,不是交互式的。
詹森·萨拉兹

1
@JasonSalaz好的,不好意思,对不起。为此添加了代码。
MattiSG

1
@JasonSalaz如果此答案确实解决了您的问题,请记住进行验证。如果没有,请在评论中回复我们:)请记住,将来的用户将感谢您;)
MattiSG 2011年

你知道那漫画是关于我的。我在科罗拉多州丹佛市(Donver,CO。)做节目(虽然,如果不是,那会很疯狂。)
Jason Salaz

这对我不起作用。据我所知,这相当于打字clear;也就是说,它可以清除屏幕,但是我仍然可以向后滚动。打球Command K正常。
Zev Eisenberg

7

这是适用于macOS终端和iTerm2的代码。它也不需要窗口位于前景中。

printf '\033[2J\033[3J\033[1;1H'

怎么运行的

这是由3个ANSI转义序列组成的,尤其是“控制序列介绍者”命令

\033是一个转义序列,用于对其表示的字符的代码点进行硬编码。前导0表示该序列的其余部分以八进制编码一个八进制值33。十进制值为273 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27)。在ASCII中,代码点27是“ ESC”(转义)字符。

CSI命令以ESC [aka 开头\033[。知道了这一点,我们可以将字符串分成3部分。

  1. CSI 2 J
    • 这是“ ED –擦除显示”命令的实例,其格式为 CSI n J
    • 在这种情况下,该n值设置为2,它调用第二个变量:“如果n为2,则清除整个屏幕(并将光标移至DOS ANSI.SYS的左上方)。”
  2. CSI 3 J
    • 这是“ ED –擦除显示”命令的实例,其格式为 CSI n J
    • 在这种情况下,将n值设置为3,这将调用第三个变体:“如果n为3,请清除整个屏幕并删除保存在回滚缓冲区中的所有行(此功能是为xterm添加的,并且受其他终端应用程序支持)。”
  3. CSI 1 ; 1 H
    • 这是“ ED –擦除显示”命令的实例,其格式为 CSI n ; m H

      将光标移动到行n,列m。值基于1,如果省略,则默认为1(左上角)。如A序列CSI ;5H为同义词CSI 1;5H以及CSI 17;H相同CSI 17H和CSI 17;1H

    • nm值都被设置为1,这意味着该命令将光标移动到顶部,最左边的角。

我可以问你从哪里买的吗?+1从我-它的工作原理呢
rbrtl

1
我不记得了,但这是这些内容的组合: en.wikipedia.org/wiki/ANSI_escape_code
亚历山大–

1
看起来像是“ CSI n J”(其中n = 2)+” CSI n J(其中n = 3)+” CSI n ; m H(其中n,m = 1,1),其翻译为:“ ED-擦除显示”(变体2), “ ED-擦除显示”(变体3),“ CUP-光标位置”(移至1、1)
亚历山大-
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.