删除字符 (DCH)

在当前光标位置删除 `n` 个字符并将现有 单元格内容左移。

  1. 0x1B
    ESC
  2. 0x5B
    [
  3. ____
    n
  4. 0x50
    P

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

如果当前光标位置在当前滚动区域之外, 此序列不执行任何动作。光标在以下情况位于当前滚动区域之外: 位于 左边距 左侧,或 右边距 右侧。

此序列会取消待定换行状态。如果光标位置在当前 滚动区域之外,此序列_不会_取消 待定换行状态。这一点必须明确指出,因为该行为 与 插入字符 (ICH) 不同。

只有滚动区域内的单元格会被删除或移动。右边距右侧的 单元格保持不变。 从右边距插入的空白单元格为空白,其背景色按当前 SGR 状态着色。

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

校验

DCH V-1:简单删除字符

printf "ABC123"
printf "\033[3G"
printf "\033[2P"
|AB23____|

DCH V-2:SGR 状态

printf "ABC123"
printf "\033[3G"
printf "\033[41m"
printf "\033[2P"
|AB23____|

最右侧的两个单元格应有红色背景色。

DCH V-3:左/右滚动区域之外

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

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

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC123"
printf "\033[?69h" # enable left/right margins
printf "\033[3;5s" # scroll region left/right
printf "\033[4G"
printf "\033[P"
|ABC2_3__|

DCH V-5:拆分宽字符

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "A橋123"
printf "\033[3G"
printf "\033[P"
|A_123_____|