You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Terminal中CLI光标保存恢复及清屏ANSI序列失效问题

问题分析与解决方案

你的代码里的光标保存/恢复序列写法有误,Windows Terminal不识别带空格的\x1B 7和\x1B 8,正确的ANSI序列应该是不带空格的\x1B7(保存光标位置)和\x1B8(恢复光标位置)。

\x1B[0K序列是有效的,它的作用是清除从当前光标位置到行尾的内容,只要光标位置正确就能正常生效。

修正后的代码如下:

import readchar
import sys

print("Reading input: ", end="")
sys.stdout.flush()
s = ""
# 先保存初始光标位置
print("\x1B7", end="")
sys.stdout.flush()

while True:
    # 恢复到保存的光标位置
    print("\x1B8", end="")
    sys.stdout.flush()

    char = readchar.readchar()
    # 清除光标到行尾的内容
    print("\x1B[0K", end="")
    sys.stdout.flush()

    if char == "\r":
        break

    print(char, end="")
    s += char
    # 再次保存当前光标位置
    print("\x1B7", end="")
    # 输出预输入文本
    ahead_text = "#"
    print(ahead_text, end="")
    sys.stdout.flush()

print("\nresult was", s)
sys.stdout.flush()

如果你需要更兼容的备选方案,也可以使用光标位置查询与移动命令:

  • \x1B[6n:查询当前光标位置,终端会返回\x1B[行;列R格式的响应
  • \x1B[行;列H:将光标移动到指定行和列
    不过这种方式需要额外处理终端的响应,实现起来比保存恢复光标更繁琐,优先推荐修正光标序列的写法。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:37:11