Manpages

NAME 名 称

控 制 终 端 代 码 - Linux 控 制 终 端 转 义 和 控 制 序 列

DESCRIPTION 描 述

Linux控 制 台 实 现 了 VT102和 ECMA-48/ISO 6429/ANSI X3.64终 端 控 制 的 子 集 , 这 个 子 集 很 庞 大 ,当 然 还 有 Linux自 己 私 有 的 控 制 序 列 ,以 改 变 颜 色 配 置 ,字 符 集 映 像 ,等 等 .在 下 面 将 要 给 出 的 表 格 中 ,第 二 列 为 指 定 的 功 能 给 出 了 ECMA-48 或 者 DEC助 记 符 (如 果 是 后 者 会 在 前 面 加 有 DEC前 缀 ).没 有 给 出 助 记 符 的 序 列 既 不 是 ECMA-48也 不 是 VT102字 符 . 在 所 有 标 准 输 出 进 程 执 行 完 毕 ,并 且 一 个 字 符 流 被 送 到 控 制 台 驱 动 程 序 准 备 显 示 出 来 的 时 候 ,所 发 生 的 第 一 件 事 就 是 将 进 程 使 用 的 代 码 转 换 成 显 示 使 用 的 代 码 . 如 果 控 制 台 工 作 于 UTF-8 模 式 ,那 么 输 入 的 字 节 会 首 先 编 码 成 16位 的 Unicode 代 码 .如 果 不 是 UTF-8模 式 ,那 么 每 个 字 节 会 按 照 当 前 的 字 符 映 射 表 完 成 转 换 (转 换 成 Unicode编 码 的 值 ). 参 看 下 面 将 要 讨 论 的 CHARACTER SETS 一 章 . 在 一 般 情 况 下 ,Unicode 代 码 被 转 换 成 为 存 储 在 视 频 存 储 器 中 的 字 体 索 引 ,这 样 对 应 的 具 体 字 符 (字 符 存 储 在 视 频 ROM中 )就 显 示 在 屏 幕 上 了 . 注 意 使 用 Unicode 编 码 允 许 我 们 同 时 使 用 512 种 不 同 的 字 体 (和 计 算 机 硬 件 有 关 ). 如 果 当 前 的 Unicode 代 码 是 一 个 控 制 字 符 ,或 者 系 统 目 前 正 在 处 理 一 个 转 义 序 列 ,处 理 的 方 式 有 些 特 别 .它 不 会 被 转 换 成 字 体 索 引 ,也 不 会 直 接 显 示 在 屏 幕 上 .它 可 能 控 制 光 标 的 移 动 ,或 者 实 现 其 它 控 制 功 能 .参 看 下 面 的 LINUX CONSOLE CONTROLS 一 节 所 进 行 的 讨 论 . 一 般 来 说 直 接 在 程 序 中 插 入 终 端 控 制 字 符 并 不 是 很 好 .Linux 支 持 终 端 兼 容 的 terminfo(5) 数 据 库 . 除 了 直 接 插 入 控 制 和 转 义 序 列 ,也 可 以 使 用 象 ncurses(3), tput(1), 或 者 reset(1). 这 样 的 显 示 库 或 者 工 具 .

LINUX CONSOLE CONTROLS Linux终 端 控 制

这 一 段 描 述 了 所 有 在 Linux控 制 台 下 使 用 的 调 用 特 殊 功 能 的 控 制 字 符 和 转 义 序 列 (例 如 .任 何 不 在 当 前 光 标 处 插 入 可 见 字 符 的 序 列 ).

Control characters 控 制 字 符 当 一 个 字 符 在 通 过 字 符 映 射 表 转 换 之 前 含 有 以 下 14个 代 码 之 一 的 时 候 表 明 它 是 一 个 控 制 字 符 . 00(NUL),07(BEL),08(BS),09(HT),0a(LF),0b(VT), 0c(FF),0d(CR),0e(SO),0f(SI),18(CAN),1a(SUB), 1b(ESC),7f(DEL). 我 们 可 以 通 过 设 置 ’显 示 控 制 字 符 ’ 模 式 (见 下 文 )以 允 许 07,09,0b, 18,1a,7f 像 普 通 字 符 一 样 显 示 在 屏 幕 上 .另 一 方 面 ,在 UTF-8模 式 下 所 有 位 于 00-1f之 间 的 代 码 都 被 认 为 是 控 制 字 符 ,而 不 管 是 否 处 于 ’显 示 控 制 字 符 ’模 式 . 一 个 控 制 字 符 会 立 刻 生 效 ,然 后 被 丢 弃 (即 使 是 在 转 义 序 列 中 间 ), 之 后 转 义 序 列 才 继 续 处 理 下 一 个 字 符 . (在 任 何 情 况 下 ,ESC都 表 示 一 个 新 的 转 义 序 列 的 开 始 ,可 能 导 致 前 一 个 序 列 的 非 正 常 终 止 ,CAN和 SUB 终 止 任 何 转 义 序 列 .) 可 识 别 的 控 制 字 符 是 BEL,BS,HT,LF,VT,FF,CR,SO,SI,CAN, SUB,ESC,DEL,CSI.他 们 的 功 能 如 下 .:

BEL(0x07,^G)铃 声 ;

BS(0x08,^H)后 退 一 格 (在 行 首 不 起 作 用 );

HT(0x09,^I)跳 至 下 一 个 制 表 位 .如 果 后 面 已 没 有 制 表 位 则 跳 至 行 尾 ;

LF(0x0A,^J),VT(0x0B,^K),FF(0x0C,^L)三 者 都 表 示 换 行 ;

CR(0x0D,^M)回 车 并 换 行 ;

SO(0x0E,^N)激 活 G1 字 符 集 , 如 果 设 置 了 LF/NL(新 行 模 式 )还 要 加 上 回 车 换 行 ;

SI(0x0F,^O)激 活 G0 字 符 集 ;

CAN(0x18,^X),SUB(0x1A,^Z)两 者 都 表 示 中 断 转 义 序 列 ;

ESC(0x1B,^[)开 始 一 个 新 的 转 义 序 列 ;

DEL(0x7F)忽 略 ;

CSI(0x9B)等 同 于 ESC [;

ESC- but not CSI-sequences 非 控 制 转 义 序 列

ECMA-48 CSI sequence ECMA-48 CSI 序 列
CSI(或 者 ESC [)后 面 跟 的 参 数 序 列 大 部 分 是 NPAR(16), 就 是 由 分 号 隔 开 的 十 进 制 数 .空 参 数 或 缺 少 的 参 数 以 0处 理 . 可 以 用 一 个 问 号 代 替 参 数 序 列 . 在 任 何 情 况 下 ,系 统 读 取 CSI [(或 者 ESC [ [)后 的 单 个 字 符 , 而 忽 略 整 个 序 列 .(用 于 忽 略 回 显 功 能 键 .)

CSI 序 列 的 动 作 由 其 最 后 一 个 字 符 决 定 .

ECMA-48 Set Graphics Rendition 设 置 图 形 属 性
ECMA-48 SGR 序 列 ESC [ <parameters> m 设 置 显 示 属 性 . 同 样 的 序 列 可 以 设 置 一 个 或 多 个 属 性 .

ECMA-48 Mode Switches ECMA-48模 式 选 择
ESC [ 3 h

DECCRM(默 认 关 闭 ): 显 示 控 制 字 符 .

ESC [ 4 h

DECIM(默 认 关 闭 ): 设 置 插 入 模 式 .

ESC [ 20 h

LF/NL(默 认 关 闭 ): 自 动 在 CR后 加 上 LF,VT 或 者 FF.

ECMA-48 状 态 报 告 命 令 .
ESC [ 5 n 设 备 状 态 报 告 (DSR): 以 ESC [ 0 n 应 答 (终 端 准 备 好 ).
ESC [ 6 n 光 标 位 置 报 告 (CPR): 以 ESC [ y ; x R 应 答 , 这 里 x,y 指 光 标 位 置 .

DEC Private Mode(DECSET/DECRST)sequences DEC私 有 模 式 序 列 . 这 里 给 出 的 序 列 在 ECMA-48中 没 有 描 述 .我 们 列 出 了 设 置 模 式 序 列 ; 用 l替 换 最 后 一 个 h就 是 重 设 模 式 序 列 .
ESC [ ? 1 h

DECCKM(默 认 关 闭 ): 打 开 时 光 标 键 送 出 ESC O 前 缀 , 而 不 是 ESC [.

ESC [ ? 3 h

DECCOLM(默 认 = 80 行 ): 交 替 选 择 80/132 行 模 式 .当 原 显 示 模 式 不 足 以 满 足 要 求 的 时 候 ,象 resizecons(8) 这 样 的 用 户 程 序 会 改 变 终 端 显 示 卡 的 硬 件 注 册 .

ESC [ ? 5 h

DECSCNM(默 认 关 闭 ): 设 置 视 频 反 转 模 式 .

ESC [ ? 6 h

DECOM(默 认 关 闭 ): 打 开 时 ,光 标 位 置 用 相 对 于 滚 动 条 左 上 角 的 位 置 表 示 .

ESC [ ? 7 h

DECAWM(默 认 关 闭 ): 打 开 自 动 换 行 .在 这 种 模 式 下 ,一 行 中 超 过 80列 的 字 符 将 自 动 换 行 (在 DECCOLM打 开 时 是 132列 ).

ESC [ ? 8 h

DECARM(默 认 关 闭 ): 打 开 键 盘 自 动 重 复 .

ESC [ ? 9 h

X10 鼠 标 报 告 (默 认 关 闭 ): 设 置 报 告 模 式 1(或 者 重 设 为 0)- 见 下 文 .

ESC [ ? 25 h

DECCM(默 认 打 开 ): 设 置 光 标 可 见 .

ESC [ ? 1000 h

X11 鼠 标 报 告 (默 认 关 闭 ): 设 置 报 告 模 式 2(或 者 重 设 为 0)- 见 下 文 .

Linux Console Private CSI Sequences Linux控 制 台 私 有 控 制 序 列 下 面 的 序 列 既 不 属 于 ECMA-48 字 符 也 不 属 于 VT102.它 们 只 在 Linux控 制 台 上 使 用 .颜 色 采 用 SGR 参 数 : 0 = 黑 色 ,1 = 红 色 ,2 = 绿 色 ,3 =褐 色 ,4 = 蓝 色 ,5 = 洋 红 ,6 = 孔 雀 蓝 ,7 = 白 色 .

CHARACTER SETS 字 符 集

内 核 可 以 完 成 以 下 四 种 字 符 转 换 ,使 字 符 能 在 屏 幕 上 显 示 . a)Latin1 -> PC,b)VT100 graphics -> PC,c)PC -> PC, d)user-defined(用 户 自 定 义 ). 有 两 种 字 符 集 设 置 ,以 G0 和 G1定 义 ,当 前 字 符 集 必 定 是 其 中 之 一 .(初 始 化 为 G0.)键 入 ^N 使 G1 成 为 当 前 字 符 集 ,键 入 ^O 使 G0 成 为 当 前 设 置 . 变 量 G0 and G1 指 向 字 符 映 射 关 系 表 ,并 且 这 种 指 向 关 系 可 以 由 用 户 改 变 . 系 统 初 始 化 时 它 们 分 别 指 向 表 a)and b). 序 列 ESC( B ,ESC( 0 ,ESC( U 和 ESC( K 分 别 使 G0 指 向 字 符 映 射 表

a),b),c)和 d). 序 列 ESC )B ,ESC )0 ,ESC )U 和 ESC )K 分 别 使 G1 指 向 字 符 映 射 表 a),b),c)和 d). 序 列 ESC c 重 置 一 个 终 端 ,当 屏 幕 显 示 出 现 混 乱 时 可 以 使 用 这 个 序 列 . 另 一 个 序 列 "echo ^V^O" 仅 仅 将 G0设 为 当 前 字 符 集 ,但 并 不 保 证 G0 指 向 映 射 表 a). 有 的 Linux发 行 版 中 提 供 一 个 叫 做 reset(1) 的 程 序 用 来 送 出 序 列 "echo ^[c". 如 果 你 的 系 统 终 端 变 量 没 有 错 误 ( rs1=\Ec), 那 么 使 用 "tput reset"也 可 以 达 到 同 样 效 果 . 用 户 自 定 义 映 射 表 可 以 用 程 序 mapscrn(8). 定 义 .这 个 程 序 工 作 时 会 将 送 入 的 字 符 c通 过 关 系 式 s=map[c]映 射 到 字 符 s然 后 送 入 显 存 .字 符 s所 对 应 的 位 图 放 在 字 符 ROM里 面 ,可 以 使 用 程 序 setfont(8). 来 改 变 .

MOUSE TRACKING 鼠 标 轨 迹

鼠 标 轨 迹 工 具 可 以 返 回 与 xterm 兼 容 的 鼠 标 状 态 报 告 .因 为 控 制 台 驱 动 没 有 办 法 知 道 鼠 标 类 型 ,只 有 当 虚 拟 终 端 驱 动 接 收 到 鼠 标 输 入 输 出 消 息 更 新 时 才 会 将 这 些 报 告 返 回 给 控 制 台 输 入 流 ..这 些 鼠 标 输 入 输 出 消 息 由 gpm(8) 守 护 进 程 产 生 . 所 有 鼠 标 轨 迹 转 义 序 列 参 数 由 xterm 编 码 成 象 value+040 这 样 的 单 一 字 符 形 式 的 数 字 参 数 .比 如 ,’!’ 编 码 成 1.屏 幕 坐 标 系 统 以 ’1’为 基 准 .

X10 兼 容 模 式 在 鼠 标 键 按 下 时 将 按 下 的 键 和 鼠 标 位 置 编 码 后 送 出 . ESC [ ? 9 h 允 许 这 一 动 作 ,ESC [ ? 9 l禁 止 这 一 动 作 . 有 键 按 下 时 ,xterm 送 出 ESC [ M bxy(6 个 字 符 ).这 里 b 代 表 键 -1,而 xy 是 鼠 标 的 x 和 y 坐 标 .这 和 内 核 产 生 的 序 列 相 同 . 常 规 的 轨 迹 模 式 (Linux 2.0.24不 再 支 持 )在 左 右 两 键 同 时 按 下 然 后 释 放 时 送 出 转 义 序 列 .组 合 键 编 码 也 被 送 出 .ESC [ ? 1000 h 允 许 这 个 动 作 而 ESC [ 1000 l 禁 止 这 个 动 作 .当 有 键 按 下 或 者 释 放 时 , xterm 送 出 ESC [ M bxy.b 的 低 两 位 对 按 键 信 息 编 码 : 0=鼠 标 键 1按 下 ,1=鼠 标 键 2 按 下 ,2=鼠 标 键 3 按 下 ,3=释 放 . 高 位 编 码 代 表 组 合 键 ,和 上 述 编 码 一 起 送 出 : 4=Shift,8=Meta(Alt),16=Control(Ctrl).xy为 发 生 鼠 标 事 件 的 x和 y坐 标 .以 左 上 角 为 (1,1).

和 其 它 终 端 的 比 较

我 们 已 经 讨 论 了 几 种 终 端 类 型 ,比 如 Linux 控 制 台 .这 类 终 端 称 为 "VT100兼 容 "的 终 端 .这 里 我 们 再 介 绍 其 他 两 种 重 要 的 终 端 类 型 : DEC VT102 和 xterm(1) 以 及 他 们 和 Linux控 制 终 端 的 区 别 .

Control-character handling 控 制 字 符 处 理
vt102 也 使 用 以 下 控 制 序 列 :

NUL(0x00)忽 略 ;

ENQ(0x05)触 发 应 答 消 息 ;

DC1(0x11,^Q,XON)继 续 传 送 ;

DC3(0x13,^S,XOFF)使 vt100 忽 略 (并 停 止 传 送 ) 除 XOFF and XON 以 外 的 一 切 字 符 .

VT100-like DC1/DC3 进 程 可 以 由 tty 驱 动 激 活 . 程 序 xterm

(在 vt100 模 式 中 )使 用 控 制 序 列 BEL,BS,HT,LF,VT,FF,CR,SO,SI,ESC.

Escape sequences 转 义 序 列
VT100 控 制 台 序 列 不 完 全 支 持 Linux控 制 台 序 列 :

程 序 xterm (vt100 模 式 )承 认 ESC c,ESC # 8,ESC >,ESC =, ESC D,ESC E,ESC H,ESC M,ESC N,ESC O,ESC P ...ESC ESC Z(以 [ ? 1 ; 2 c,’I am a vt100 with advanced video option’回 应 ) 以 及 ESC ^ ...ESC 意 义 同 上 . 接 受 ESC(,ESC ),ESC *,ESC + 后 跟 0,A,B 的 字 符 序 列 ,分 别 代 表 的 DEC 特 殊 字 符 ,画 线 设 置 ,UK 和 US ASCII码 . 接 受 ESC ] 作 为 特 定 资 源 设 置 :

以 下 字 符 的 含 义 略 有 不 同 ::

它 还 接 受 以 下 序 列 :

它 不 识 别 ESC % ...

CSI Sequences CSI 序 列 程 序 xterm (直 到 XFree86 3.1.2G)不 能 识 别 闪 烁 或 者 不 可 见 模 式 的 SGR值 .X11R6 也 不 能 识 别 以 SGRs 为 参 数 设 置 的 色 彩 . xterm 可 以 识 别 其 他 的 ECMA-48 CSI 序 列 ,只 要 Linux可 以 识 别 . 反 之 亦 然 .

xterm 可 以 识 别 以 上 列 出 的 所 有 DEC 私 有 序 列 ,但 是 不 包 括 Linux 私 有 模 式 序 列 . 在 Xterm Control Sequences 中 有 关 于 xterm 的 私 有 模 式 序 列 的 讨 论 .

document by Edward Moy and Stephen Gildea,available with the X distribution.

BUGS

在 版 本 为 2.0.23 的 内 核 中 ,CSI 序 列 的 识 别 有 些 问 题 : 不 能 识 别 转 义 序 列 中 的 NUL.

参 见

console(4), console_ioctl(4), charsets(7)

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh