xterm遇到的问题及解决方案

news/2024/12/27 16:21:39/

xterm遇到的问题及解决方案

/r插入终端导致的之后插入的数据覆盖了改行头部的数据

问题说明

如图所示,当在一行输入的候,输入的l插入到了改行的头部。
在这里插入图片描述

查看ws返回数据
在这里插入图片描述

可见ws返回的信息存在\r字符,在xterm.js\r是回车字符的意思,但是\r并不会让xterm.js中的光标到下一行,而是让光标到当前行的起始位置,所以就会导致当前行的头部数据被覆盖。

问题分析

xterm.js的issus中找到一个相似的问题,Xterm overwrites comands on same line if its longer #1359。
分析结果为,当前端xterm.js渲染的终端列数大于后端终端的列数就会出现这样的问题。

假设xterm.js渲染的终端列数和后端的终端列数一致,当输入到这一行的最后一个列数后再输入就会返回\r,但是如果列数相同,xterm.js会自动换行显示,会新起一行,这时候再插入\r会将光标移动到新起一行的开头插入数据,则不会有影响。
假设xterm.js渲染的终端列数和后端的终端列数不一致,当前端输入还没有自动换行,还没有新起一行则接收到了\r,所以光标移动到开头插入则会覆盖头部的数据。

解决方案

一般这种情况是前端使用了xterm-addon-fit插件来将整个终端盛满父容器,但是盛满后没有将终端的rowcol返回给后端设置终端大小导致的。

解决方法分为两种:
1、在xterm.js初始化时和在窗口大小改变时将row和col返回给后端进行设置。
2、取消使用xterm-addon-fit插件初始化设置终端大小和后端一致。

xterm主屏幕缓冲区和备用屏幕缓冲区切换

问题说明

需求是通过xterm.js实现一个终端,上方存在下拉框可以切换容器,但是切换的时候不清空上次终端操作的内容。
其实在切换终端的时候我们什么都不做处理就可以实现保留上次终端的内容。
但是会有一个问题,就是如果通过vim命令进入编辑状态,这时候切换终端,新的终端返回的内容会在vim编辑状态的最上面显示。
在这里插入图片描述

如图所示,新进入的终端的内容没有插入到了vim编辑状态的上面。

问题分析

因为终端分为主屏幕缓冲区和备用屏幕缓冲区,当切换终端的时候没有退出上一次终端的备用屏幕缓冲区,导致新进入的终端内容插入到了备用屏幕缓冲区。

解决方案

通过ws接收信息,如果内容存在\u001b[?1049h则为进入备用屏幕缓冲区,如果内容存在\u001b[?1049l则为进入主屏幕缓冲区。
可以创建一个变量来判断当前是否处于备用屏幕缓冲区,如果处于备用屏幕缓冲区切换终端是先退出备用屏幕缓冲区再创建ws进入终端。

spare = false
handleSocketMessage(data) {
// 进入备用屏幕缓冲区if (content.includes('\u001b[?1049h')) {this.spare = true;}// 退出备用屏幕缓冲区if (content.includes('\u001b[?1049l')) {this.spare = false;}
}
// 进入终端
intoTerminal() {// 是否处于备用屏幕缓冲区if (this.term?.element && this.spare) {// 退出备用屏幕缓冲区this.term.write('\u001b[?1049l');// 设置备用屏缓冲区状态this.spare = false;}
}

通过write插入内容,后插入的内容太多会导致之前插入的数据丢失

问题说明

通过write插入内容,后插入的内容太多会导致之前插入的数据丢失。

问题分析

缓冲区大小限制太小。

解决方案

初始化终端的时候配置缓冲区大小。

let term = new Terminal({scrollback: 100000, // 终端缓冲区大小
});

http://www.ppmy.cn/news/1558566.html

相关文章

RTMW:实时多人2D和3D 全人体姿态估计

单位:上海AI实验室 代码:mmpose/tree/main/projects/rtmpose 系列文章目录 RTMO: 面向高性能单阶段的实时多人姿态估计 目录 系列文章目录摘要一、背景二、相关工作2.1 自上而下的方法。2.2 坐标分类。2.3 3D Pose 3 实验方法3.1.1 任务限制3.1.3训练技…

利用 Python 编写一个 VIP 音乐下载脚本

在这篇博客中,我们将介绍如何使用 Python 编写一个简单的 VIP 音乐下载脚本,利用网页爬虫技术从一个音乐网站下载歌曲。通过解析网页,获取歌曲的真实下载链接,并将音乐文件保存到本地。我们将使用 requests 和 BeautifulSoup 库来实现这个过程。 目标 本脚本的主要功能是…

裴蜀定理和扩展欧几里得定理

文章目录 裴蜀定理什么是裴蜀定理裴蜀定理证明如下例题思路代码 扩展欧几里得什么是扩展欧几里得定理扩展欧几里得证明如下模板例题思路代码 裴蜀定理 什么是裴蜀定理 若a,b为整数,且gcd(a,b)d,那么对于任…

sql-DQL(持续更新中...)

完整执行顺序总结 FROM:选择数据源并应用连接。WHERE:过滤记录。GROUP BY:分组数据。HAVING:过滤分组结果。SELECT:提取所需列并计算表达式。ORDER BY:对结果排序。LIMIT / OFFSET:限制返回记录…

第二章 并行为什么有时会慢?

第2章 2.1 速度的障碍 我们把计算实体称为进程,比如snow包中的worker。 并行计算中主要有两个性能相关的问题: 通信开销 负载平衡 2.2 性能和硬件结构 多处理器系统 就像它的名字所说一样,有两个或多个处理器, 例如&#xff…

3D架构图软件 iCraft Editor 正式发布 @icraftplayer-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生

介绍 icraft/player-react 是 iCraft Editor 全新推出的 React 组件库,专为简化3D数字孪生场景的前端集成而设计。通过该组件,开发者可以轻松地将 iCraft Editor 制作的3D场景无缝嵌入到 React 项目中,并获得丰富的交互能力和实时数据集成特…

Ubuntu系统部署Mysql8.0后设置不区分大小写

部署MySQL # 更新系统软件包列表 sudo apt update# 安装MySQL Server sudo apt install mysql-server# 在安装时,系统会自动进行初始化,安装完成后MySQL已经处于运行状态# MySQL常见命令 #启动MySQL sudo systemctl start mysql#停止MySQL sudo systemc…

车载网关性能 --- 缓存buffer划分要求

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…