XTQMODKEYS — 查询 modifyKeys 当前取值(CSI ? Pp m)
向 xterm 查询当前 modifyKeyboard / modifyCursorKeys / modifyFunctionKeys / modifyOtherKeys 的取值 —— XTMODKEYS 的配套查询。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b[?<Pp>m\\033[
\033[?4m\\e[
\e[?4mESC [
ESC [ ? Pp mhex
1b 5b 3f ... 6d说明
前缀 `?` 让末字节 `m` 从 SGR(不存在 SGR 私有子模式)切换为 XTQMODKEYS,是 XTMODKEYS(`\x1b[><Pp>;<Pv>m`)的读取对偶。`Pp` 选择查询的资源:`0` modifyKeyboard、`1` modifyCursorKeys、`2` modifyFunctionKeys、`4` modifyOtherKeys。回复是 `\x1b[><Pp>;<Pv>m` —— 与 XTMODKEYS 设置命令**形态相同**,相当于终端把当前设置原样回送给调用方。这对希望在变更前保存当前 modifyKeys 状态的库代码很有用:查询 → 变更 → 退出时恢复。多数 CSI u 协议消费者(kitty、ghostty)也能正确回复,但它们底层的键盘模型比 XTMODKEYS 更丰富,回复略有损 —— 已经在 CSI u 体系内的话,请改用 `\x1b[=u`(CSI u flags push)。终端不识别的 `Pp` 取值无任何回复,所以读取需配超时(Unix tty 上 50–100 ms 足够)。XTQMODKEYS 是少数纯状态读取、无副作用的 xterm 查询之一,可安全地插入渲染循环任何位置。
规范出处: xterm-ctlseqs (XTQMODKEYS)
参数
| Pp | 资源选择:`0` modifyKeyboard、`1` modifyCursorKeys、`2` modifyFunctionKeys、`4` modifyOtherKeys。 |
示例
printf '\033[?4m' # query modifyOtherKeys — reply: \x1b[>4;<Pv>m\n# read with: IFS= read -t 0.1 -rN 32 replyimport sys, select\nsys.stdout.write('\x1b[?4m'); sys.stdout.flush()\n# poll stdin: if select() ready in 100ms, parse \x1b[>4;<Pv>mfmt.Print("\x1b[?2m") // query modifyFunctionKeys current valueprocess.stdout.write('\x1b[?0m') // query modifyKeyboard\nprocess.stdin.once('data', buf => { /* parse reply */ })printf("\x1b[?4m"); /* before mutating modifyOtherKeys, snapshot the current value */终端支持
- xterm
- 支持
- Linux console (fbcon)
- 不支持
- macOS Terminal.app
- 不支持
- iTerm2
- 部分
- Windows Terminal
- 部分
- cmd.exe / ConPTY
- 不支持
- kitty
- 支持
- alacritty
- 部分
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 部分
- Konsole
- 部分
- tmux
- 不支持
- GNU screen
- 不支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 不支持 | 不支持 | 部分 | 部分 | 不支持 | 支持 | 部分 | 支持 | 支持 | 部分 | 部分 | 不支持 | 不支持 |