【xterm】解决Xterm.js伪终端「vim无配色」问题

【Xterm】解决Xterm.js伪终端「vim无配色」问题

前言

用Vue写了一款Web端的Linux远程伪终端,功能上已较为完善,能够执行串行端口终端下的所有命令,还添加了一些特有的功能,十分灵活:
在这里插入图片描述

现象

美中不足的是,在使用vim功能进行文本编辑的时候,并不能像其他伪终端连接软件那样进行渲染:
在这里插入图片描述
可以看到,shell脚本的内容并没有配色渲染,虽然不影响使用,但是习惯了配色编辑的我还是有点接受不了差异。

分析

除了执行vim命令,像llls这类命令的输出都是能够正常进行配色渲染的,这让我百思不得其解,一开始我思考的重点是我的伪终端前端代码,也就是Vue那一块出了问题,但是调试了半天之后,最终结果完全无差异,才让我的目光转回到了后端,也就是java与linux进行交互的那一块。
简单补充了关于linux终端与伪终端的相关知识后,我发现我使用其他远程连接软件(ZenTermLite)用的伪终端是xterm
在这里插入图片描述
而我的Web端伪终端使用的是vt100:
在这里插入图片描述
那么ZenTermLite的伪终端在使用vim命令的时候是能够正常进行配色渲染的:

在这里插入图片描述

解决方式

问题出在那里很清楚了,我的Web端伪终端想要获得vim的配色渲染,只需要将伪终端的类型由vt100改为xterm即可,这个参数一般是在后端工具包获取Session、建立Channel的时候指定的,默认是vt100
在这里插入图片描述
那由于我所用的的这个工具包里面的相关实现不是抽象类,就是静态方法,对于里面的变量我无法直接修改,只能进行类型强转之后进行设定:
在这里插入图片描述

结果

然后重启后端程序,再次连接终端,使用vim:
在这里插入图片描述
能够进行配色渲染了,问题解决。

后记

根据个人后端使用的远程连接工具包的实现不同,灵活更改各项配置,更重要的是要在使用的时候适当读读源码,有助于解决问题。
希望这篇文章能够帮组到你,有问题留言交流。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
很好的问题!基于 xterm.js 实现 Vue 版本终端 terminal 的方法如下: 1. 安装 xterm.js 使用 npm 安装 xterm.js: ``` npm install xterm ``` 2. 创建 Vue 组件 在 Vue 组件中引入 xterm.js 并创建终端: ``` <template> <div ref="terminal"></div> </template> <script> import { Terminal } from 'xterm'; export default { mounted() { this.terminal = new Terminal({ cursorStyle: 'bar', rows: 30, cols: 100, theme: { background: '#1e1e1e', foreground: '#d4d4d4' } }); this.terminal.open(this.$refs.terminal); } } </script> ``` 3. 实现命令行交互 使用 xterm.js 提供的 API 实现命令行交互: ``` <template> <div ref="terminal"></div> </template> <script> import { Terminal } from 'xterm'; export default { mounted() { this.terminal = new Terminal({ cursorStyle: 'bar', rows: 30, cols: 100, theme: { background: '#1e1e1e', foreground: '#d4d4d4' } }); this.terminal.open(this.$refs.terminal); this.terminal.onData(data => { this.terminal.write(data); }); this.terminal.focus(); } } </script> ``` 这里使用 `onData` 方法监听用户输入并将输入的字符输出到终端中。 4. 添加自定义命令 在 Vue 组件中添加自定义命令: ``` <template> <div ref="terminal"></div> </template> <script> import { Terminal } from 'xterm'; export default { mounted() { this.terminal = new Terminal({ cursorStyle: 'bar', rows: 30, cols: 100, theme: { background: '#1e1e1e', foreground: '#d4d4d4' } }); this.terminal.open(this.$refs.terminal); this.terminal.onData(data => { if (data === '\r') { this.terminal.write('\r\n'); this.terminal.write('Custom command executed!\r\n'); this.terminal.write(this.terminal._core.buffer.translateBufferLineToString(0, true)); this.terminal.write('\r\n'); this.terminal.prompt(); } else { this.terminal.write(data); } }); this.terminal.prompt = () => { this.terminal.write('\r\n$ '); }; this.terminal.writeln('Welcome to Vue Terminal!'); this.terminal.prompt(); this.terminal.focus(); } } </script> ``` 这里添加了一个自定义命令,当用户输入回车时执行。 以上就是基于 xterm.js 实现 Vue 版本终端 terminal 的方法,希望能够帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值