使用转义序列获取终端大小时输入框残留内容的解决方法
解决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
相关产品推荐
相关产品推荐

