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

使用转义序列获取终端大小时输入框残留内容的解决方法

解决VS Code SSH终端执行终端大小查询转义序列后输入框残留代码的问题

问题场景

通过VS Code的SSH终端执行以下命令时,输入框会出现残留代码:

my@my:~$ echo -e "\033[18t"

my@my:~$ ;23;140t

但使用Termius等其他终端应用SSH连接同一机器时,输入框保持干净:

my@my:~$ echo -e "\033[18t"

my@my:~$ 

背景:项目移植一款Shell,不支持ioctl()方法,采用\033[18t转义序列获取终端大小,但导致VS Code输入框出现残留内容,尝试用\b清除无效。

解决方案

方法1:捕获终端响应序列而非直接输出

\033[18t是查询终端大小的ANSI转义序列,终端会返回\033[;行数;列数t格式的响应。VS Code终端会把这个响应直接输出到输入区域,而正常终端会解析该序列不显示。可以用read命令捕获响应,避免残留:

# 发送查询转义序列(-n 不自动换行)
echo -ne "\033[18t"
# 捕获响应,以;为分隔符,直到遇到t停止
IFS=';' read -r -d 't' -a term_size
# 提取行数和列数(数组第1、2位对应行数和列数)
rows=${term_size[1]}
cols=${term_size[2]}
# 可选:输出获取到的终端大小
echo "终端大小:${rows}行 × ${cols}列"

方法2:在自定义Shell中处理响应序列

如果是自己开发Shell,需要在发送查询序列后,监听标准输入流,捕获返回的\033[;...t序列,解析出行数和列数,并且不要将该序列输出到终端,从根源避免残留。

临时 workaround:清除当前行

如果只是临时清除残留,可以在执行查询命令后,发送清除当前行的转义序列:

echo -e "\033[18t" && echo -ne "\033[2K"

不过这个方法无法捕获终端大小,仅能清除显示残留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:00:55