Terminal 终端-清除半屏幕

Terminal 终端-清除半屏幕,terminal,iterm2,Terminal,Iterm2,我知道使用cmd+K可以清除整个屏幕缓冲区。 我想知道有没有办法只清除屏幕缓冲区的一半?cmd+K映射到用于清除可见屏幕(屏幕缓冲区)的菜单项。这不包括回滚(这是一个类似的问题,但不同) iTerm2的首选项和菜单没有显示任何直接清除屏幕一半的方法 然而,iTerm2模拟(像Terminal.app)大多数VT100控制序列。您可以在shell中添加一个绑定(给定您选择的合适键),该绑定告诉shell回显一个从当前光标位置(a)清除到屏幕开始或(b)清除到屏幕结束的控制序列。由于它支持保存/还原

我知道使用cmd+K可以清除整个屏幕缓冲区。 我想知道有没有办法只清除屏幕缓冲区的一半?

cmd+K映射到用于清除可见屏幕(屏幕缓冲区)的菜单项。这不包括回滚(这是一个类似的问题,但不同)

iTerm2的首选项和菜单没有显示任何直接清除屏幕一半的方法

然而,iTerm2模拟(像Terminal.app)大多数VT100控制序列。您可以在shell中添加一个绑定(给定您选择的合适键),该绑定告诉shell回显一个从当前光标位置(a)清除到屏幕开始或(b)清除到屏幕结束的控制序列。由于它支持保存/还原光标控件,如果您知道其大小,甚至可以在屏幕的一半处清晰显示,例如

  • 保存光标位置
  • 跳到屏幕中间
  • 清除(哪一半?)屏幕的一半
  • 恢复光标位置
因为它会使用你的外壳,所以我称之为间接的

如上所述,Terminal.app实现了大部分VT100控制序列。在ncurses中,适当的
术语将是提供VT100样式的保存/还原光标的已知术语。您可以使用从终端数据库中提取
sc
rc
cup
的相应字符串。但是(如果您想擦除到屏幕的开头),您可以提供自己的字符串,因为特定的风格不是termcap/termfo的一部分

您可以在以下文件中找到相关的VT100控制序列:

参考

ESC 7     Save Cursor (DECSC).
ESC 8     Restore Cursor (DECRC).

CSI Ps ; Ps H
          Cursor Position [row;column] (default = [1,1]) (CUP).

CSI Ps J  Erase in Display (ED).
            Ps = 0  -> Erase Below (default).
            Ps = 1  -> Erase Above.
            Ps = 2  -> Erase All.
            Ps = 3  -> Erase Saved Lines (xterm).
# Get ceiling eg: 7/2 = 4
ceiling_divide() {
  ceiling_result=$((($1+$2-1)/$2))
}

clear_rows() {
  POS=$1
  # Insert Empty Rows to push & preserve the content of screen
  for i in {1..$((LINES-POS-1))}; echo
  # Move to POS, after clearing content from POS to end of screen
  tput cup $((POS-1)) 0
}

# Clear quarter
alias ptop='ceiling_divide $LINES 4; clear_rows $ceiling_result'
# Clear half
alias pmid='ceiling_divide $LINES 2; clear_rows $ceiling_result'
# Clear 3/4th
alias pdown='ceiling_divide $((3*LINES)) 4; clear_rows $ceiling_result'