插入字符 (ICH)

在当前光标位置插入空白字符。

  1. 0x1B
    ESC
  2. 0x5B
    [
  3. ____
    n
  4. 0x40
    @

在当前光标位置插入 n 个空白字符,并将现有 单元格内容右移。

参数 n 必须是大于等于 1 的整数。如果 n 小于 等于 0,则将 n 调整为 1。如果省略 n,则 n 默认为 1。

此序列总是取消待定换行状态。

如果光标位置在 左右边距 之外, 此序列不改变屏幕,但待定换行状态 仍会被重置。

移出右边距之外的现有单元格会被删除。插入的单元格为空白, 其背景色按当前 SGR 状态着色。

如果多单元格字符(如“橋”)因移动而使单元格被拦腰拆分, 多单元格字符可以被裁剪或擦除。典型行为是在 屏幕右边缘裁剪、在右边距处擦除,但两种行为均可接受。

校验

ICH V-1:无滚动区域,适配屏幕

printf "ABC"
printf "\033[1G"
printf "\033[2@"
printf "X"
|XcABC_____|

ICH V-2:SGR 状态

printf "ABC"
printf "\033[1G"
printf "\033[41m"
printf "\033[2@"
printf "X"
|c_ABC_____|

c_ 个单元格都应有红色背景。ABC 个单元格样式应保持不变。

ICH V-3:将内容移出屏幕

cols=$(tput cols)
printf "\033[${cols}G"
printf "\033[2D"
printf "ABC"
printf "\033[2D"
printf "\033[2@"
printf "X"
|_______XcA|

ICH V-4:左/右滚动区域之内

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "\033[?69h" # enable left/right margins
printf "\033[3;5s" # scroll region left/right
printf "\033[3G"
printf "ABC"
printf "\033[3G"
printf "\033[2@"
printf "X"
|__XcA_____|

ICH V-5:左/右滚动区域之外

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "\033[?69h" # enable left/right margins
printf "\033[3;5s" # scroll region left/right
printf "\033[3G"
printf "ABC"
printf "\033[1G"
printf "\033[2@"
printf "X"
|XcABC_____|

ICH V-6:拆分宽字符

cols=$(tput cols)
printf "\033[${cols}G"
printf "\033[1D"
printf "橋"
printf "\033[2D"
printf "\033[@"
printf "X"
|_______Xc_|

在这种情况下,最后一个单元格为空白或对多单元格字符进行裁剪都算有效。xterm 会对该字符进行裁剪,但许多其他终端会擦除该单元格。