vue xterm.js命令行使用及问题解决

博客主要介绍了xtermjs的安装与配置,包括基础展示、输入、大小设置、自适应大小、全屏等功能。还提及项目代码中Uint8Array对象编解码方法,以及解决窗口大小自适应、连bash时内容覆盖、连sh时上下左右键异常等问题的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xtermjs

安装

npm i xterm --save

配置

基础展示

<template>
    <div class="container">
      <div id="terminal-container"></div>
    </div>
</template>

<script>
import 'xterm/dist/xterm.css
import { Terminal } from 'xterm';

export default {
  mounted(){
    let terminalContainer = document.getElementById('terminal-container')
    let term = new Terminal()
    term.open(terminalContainer)
  }
};
</script>

以下内容都是,在此基础上的添加修改,非单独使用

输入

term.on('key', function(key, ev) {
    console.log("key==========",ev.keyCode);
     term.write(key)//输入
     //term.writeln(key)//输入并换行
 }) 

大小
cols: 92, rows: 22,

let term = new Terminal({
      cols: 92,
      rows: 22,
      cursorBlink: true, // 光标闪烁
      cursorStyle: "underline", // 光标样式  null | 'block' | 'underline' | 'bar'
      scrollback: 800, //回滚
      tabStopWidth: 8, //制表宽度
      screenKeys: true//
    });

自适应大小(使终端的尺寸和几何尺寸适合于终端容器的尺寸) 只是width

import * as fit from 'xterm/lib/addons/fit/fit';

Terminal.applyAddon(fit);  // Apply the `fit` addon

//调用
term.fit(); 

全屏

import 'xterm/dist/addons/fullscreen/fullscreen.css'//如果不成功,请检查路径

import * as fullscreen from 'xterm/lib/addons/fullscreen/fullscreen';
Terminal.applyAddon(fullscreen);  // Apply the `fullscreen` addon

//调用
term.toggleFullScreen();//全屏
term.toggleFullScreen();//正常
term.toggleFullScreen();//全屏

项目代码 基本功能+复制粘贴

<template>
  <div class="container">
    <div id="terminal-container"></div>
  </div>
</template>

<script>
import "xterm/dist/xterm.css";
import { Terminal } from "xterm";
import * as fit from "xterm/lib/addons/fit/fit";
Terminal.applyAddon(fit); // Apply the `fit` addon
export default {
  data() {
    return {
      copy: ""
    };
  },
  mounted() {
    let terminalContainer = document.getElementById("terminal-container");
    let term = new Terminal({
      // 光标闪烁
      cursorBlink: true
    });
    term.open(terminalContainer, true);
    term.fit();

    let websocket = new WebSocket('ws:**********');//地址
    websocket.binaryType = "arraybuffer";
    //连接成功
    websocket.onopen = function(evt) {
      console.log("onopen", evt);
      term.writeln(
        "******************************************************************"
      );
    };
    //输入
    term.on("data", function(data) {
      console.log("data", data);
      websocket.send(new TextEncoder().encode("\x00" + data));
    });
    //返回
    websocket.onmessage = function(evt) {
      let str = new TextDecoder().decode(evt.data);
      term.write(str);
    };
    //关闭
    websocket.onclose = function(evt) {
      console.log("close", evt);
    };
    //错误
    websocket.onerror = function(evt) {
      console.log("error", evt);
    };
    //选中 复制
    term.on("selection", function() {
      if (term.hasSelection()) {
        this.copy = term.getSelection();
      }
    });
    term.attachCustomKeyEventHandler(function(ev) {
      //粘贴 ctrl+v
      if (ev.keyCode == 86 && ev.ctrlKey) {
        websocket.send(new TextEncoder().encode("\x00" + this.copy));
      }
    });
  }
};
</script>
window.onresize = function() {
    term.fit();
    term.scrollToBottom();
};

window.onresize 的多次调用限制,请自行查询.
在项目中 window.onresize只能挂载一次,在多个页面中同时挂载 window.onresize时,只有其中一个 window.onresize会起作用
所以,在终端关闭后 我们要取消resize的监听

window.addEventListener('resize',this.windowChange)

windowChange(){
    this.term.fit();
    this.term.scrollToBottom();
}

// 关闭时,取消监听
websocket.onclose = function(evt) {
      console.log("close", evt);
      window.removeEventListener('resize',this.windowChange)
}; 
  • 3 当连bash 时,会出现输入大量内容 把当强行最前面的内容覆盖的问题
    问题如图所示
    在这里插入图片描述
    测试发现是使用了fit(),或者设置了cols,会发生这种状况.

不设置fit()和cols
在这里插入图片描述
github-issues 找到说法issues连接
在这里插入图片描述
所以根据需求 在请求上添加 cols ,使后台或者服务的大小修改成你窗口的大小.

let height = document.body.clientHeight;
let rows = height/18;//18是字体高度,根据需要自己修改
let term = new Terminal({
    rows:parseInt(rows)
});
term.open(terminalContainer, true);
term.fit();
let socket = new WebSocket(`ws://*******command=env&command=TERM%3Dxterm&command=COLUMNS%3D${term.cols}&command=LINES%3D${rows}&command=/bin/bash&********`,"channel.k8s.io");

.....同上述代码

command=env&command=TERM%3Dxterm&command=COLUMNS%3D${term.cols}&command=LINES%3D${rows}主要是这段代码,什么意思我也不知道- -

windowChange(){
        let height = document.body.clientHeight;
        let rows = height/18;
        this.term.fit();
        this.term.resize(this.term.cols,parseInt(rows))//终端窗口重新设置大小 并触发term.on("resize"
        this.term.scrollToBottom();
}
term.on("resize", function(evt) {
      self.socket.send(
        JSON.stringify({ Op: "resize", Cols: self.term.cols, Rows: self.term.rows })//发送修改大小
      );
});
  • 4连接sh时,上下左右键出现类似^[[A等问题
    bash,上下左右键好使
    经过多次测试研究,发现同时有bash/sh的,(上下左右等)bash好使,sh不好使;只有sh时,(上下左右等)好使
    所以
    都先连bash,若bash连接报错,在连sh

xterm.js 使用及问题【新】

VxWorks系统固件解包打包是指将VxWorks操作系统固件进行解包打包的过程。VxWorks是一种实时操作系统,广泛应用于嵌入式系统中。解包打包固件是为了定制化VxWorks系统,以满足特定的需求。 解包固件的过程主要包括以下几个步骤:首先,解压缩固件文件,取出固件的各个组成部分,如内核、驱动程序、文件系统等。然后,对解压后的文件进行分析和研究,了解各个文件的作用和关系。接下来,根据自己的需求进行修改和定制,可以修改内核参数、添加、删除或更新驱动程序、增加新功能等。最后,重新打包修改后的文件,生成新的固件打包固件的过程与解包相反,主要包括以下几个步骤:首先,收集和准备好所有需要的文件,包括修改后的内核、驱动程序、文件系统、配置文件等。然后,将这些文件按照一定的规则进行整理和安排,确保文件的正确性和完整性。接下来,根据固件的格式和结构,将这些文件按照一定的方式进行打包和压缩。最后,生成新的固件文件,可以用于烧录到嵌入式设备中。 总的来说,VxWorks系统固件解包打包是一个定制化VxWorks系统的过程,可以根据需求进行修改和定制,以满足特定的应用场景和功能要求。通过解包打包固件,我们可以对VxWorks系统进行灵活的定制和优化,系统的性能和功能。
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值