插入行 (IL)

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

  1. 0x1B
    ESC
  2. 0x5B
    [
  3. ____
    n
  4. 0x4C
    L

在当前光标位置插入 n 行,并将现有行下移。

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

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

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

此序列将光标列移动到左边距。

从当前光标行开始向下 n 行,插入按当前 SGR 状态着色的空白行。 插入一行时,所有现有内容向下移动一行。最底行 是下边距。如果内容被移出下边距之外, 则这些内容会丢失;下边距之外的现有内容保持不变且不会移动。

如果设置了 左边距 或 右边距, 则只有边距内(含边距)的单元格会被清空(插入时)或移动。 左边距左侧或右边距右侧的其他现有内容保持不变。

如果多单元格字符会被拆分,则擦除整个多单元格字符。例如, 如果“橋”打印在左边距左侧,而由 IL 导致的行下移会拆分该字符, 则应擦除该单元格。

校验

IL V-1:简单插入行

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC\n"
printf "DEF\n"
printf "GHI\n"
printf "\033[2;2H"
printf "\033[L"
|ABC_____|
|c_______|
|DEF_____|
|GHI_____|

IL V-2:光标在滚动区域之外

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC\n"
printf "DEF\n"
printf "GHI\n"
printf "\033[3;4r" # scroll region top/bottom
printf "\033[2;2H"
printf "\033[L"
|ABC_____|
|DEF_____|
|GHI_____|

IL V-3:顶部/底部滚动区域

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC\n"
printf "DEF\n"
printf "GHI\n"
printf "123\n"
printf "\033[1;3r" # scroll region top/bottom
printf "\033[2;2H"
printf "\033[L"
|ABC_____|
|c_______|
|DEF_____|
|123_____|

IL V-4:左/右滚动区域

printf "\033[1;1H" # move to top-left
printf "\033[0J" # clear screen
printf "ABC123\n"
printf "DEF456\n"
printf "GHI789\n"
printf "\033[?69h" # enable left/right margins
printf "\033[2;4s" # scroll region left/right
printf "\033[2;2H"
printf "\033[L"
|ABC123__|
|Dc__56__|
|GEF489__|
|_HI7____|