Files

35 lines
1.3 KiB
Python

"""TUI 辅助: 中文输入收集
vue-tui 的 useInput 在 raw mode 下不支持 IME, 中文输入必须走 Python cooked-mode input()。
调用方 (TUI) 会先把 vue-tui 输入监听暂停 (isActive=false), 本脚本独占 tty:
- 终端从 raw 临时切回 cooked+echo 供 input()/IME 使用, 结束后恢复
- prompt 写 stderr (继承终端直接显示), 答案 JSON 写 stdout (管道回传 TUI)
用法: python ask.py <提示词> [默认值] -> stdout 输出 JSON {"answer": "..."}
"""
import json
import sys
import termios
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
new[3] |= termios.ICANON | termios.ECHO # 开行缓冲 + 回显 (cooked mode)
termios.tcsetattr(fd, termios.TCSANOW, new)
try:
prompt = sys.argv[1] if len(sys.argv) > 1 else "输入"
default = sys.argv[2] if len(sys.argv) > 2 else ""
# prompt 走 stderr: 继承终端直接显示 (stdout 管道是给 TUI 解析 JSON 的)
sys.stderr.write(f"{prompt} [{default}]: ")
sys.stderr.flush()
try:
answer = sys.stdin.readline().rstrip("\n")
except EOFError:
answer = ""
if not answer:
answer = default
finally:
termios.tcsetattr(fd, termios.TCSANOW, old)
print()
print(json.dumps({"answer": answer}, ensure_ascii=False))