Xterm.js入门官方文档示例详解

目录
  • 前言
  • xterm.js是什么?
    • 安装
    • 初始化
    • 使用插件
  • API文档模块
  • 类 Terminal
    • 构造函数 constructor
    • 接口
  • 插件
    • attach插件
  • 前后端示例
  • 结语

前言

入职的新公司所在的事业部专注于K12的编程教育。公司项目里有使用xterm.js这个库, 并基于master分支做出了一定的修改。为了尽快的熟悉业务以及公司的代码, 所以这里打算学习xterm.js的文档(粗略的翻译, 方便自己查阅, 凡是保留原文的地方, 是我目前还没有明白具体使用场景和用法的地方)

xterm.js是什么?

xterm是一个使用TypeScript编写的前端终端组件。并在Vscode等热门项目中得到了应用

安装

npm install xterm

初始化

// 初始化终端
import { Terminal } from 'xterm'
import 'xterm/dist/xterm.css'
let term = new Terminal()
// 将term挂砸到dom节点上
term.open(document.getElementById('app'))
term.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ')

使用插件

插件为javascript的模块可以扩展Terminal的原型

import { Terminal } from 'xterm';
import * as fit from 'xterm/lib/addons/fit/fit'
// 扩展Terminal
Terminal.applyAddon(fit)
let term = new Terminal()
term.open(document.getElementById('#terminal'))
// 使用fit方法
term.fit()

API文档模块

xterm

这里包含了xterm.js的类型声明文件d.ts

type alias FontWeight

终端的字体粗细

type alias RendererType

终端的渲染方式, dom渲染或者是canvas渲染

类 Terminal

构造函数 constructor

创建一个新的Terminal对象

// 参数类型, 需要ITerminalOptions接口的定义
// 返回Terminal类型
new Terminal(options?: ITerminalOptions): Terminal
  • 属性 cols

终端窗口的列数, 可以在创建Terminal指定cols

// 终端中每一行最多一列
let term = new Terminal({ cols: 1 })
  • 属性 element
// 终端挂载的Dom元素
term.element
  • 属性 markers

终端的所有标记

  • 属性 rows

终端窗口的行数, 可以在创建Terminal指定rows

let term = new Terminal({ rows: 30 })
  • 属性 textarea

返回, 接受终端输入的textarea的dom节点

  • 静态属性 strings

Natural language strings that can be localized.

  • 方法 addCsiHandler

Adds a handler for CSI escape sequences.

  • 方法 addDisposableListener

向终端添加事件监听器, 并返回可用于删除事件监听器的对象, 对象中dispose属性的方法可以取消监听。支持的事件参考off方法的内容。

// 终端添加focus事件的监听, dispose函数可以取消监听
const { dispose } = term.addDisposableListener('focus', function () {
  console.log('focus')
  dispose()
})
  • 方法 addMarker

添加标记, addMarker接受一个数字作为参数, 数字表示当前光标到标记y的偏移量,并返回标记。

let buffer = term.addMarker(cursorYOffset: number): IMarker
let term = new Terminal()
term.open(document.getElementById('app'))
term.write('Hello from \x1B[1;3;31mxterm.js\x1B')
term.addMarker(0)
term.addMarker(1)
// 返回两个标记
console.log(term.markers)
  • 方法 addOscHandler

Adds a handler for OSC escape sequences.

  • 方法 attachCustomKeyEventHandler

Attaches a custom key event handler which is run before keys are processed, giving consumers of xterm.js ultimate control as to what keys should be processed by the terminal and what keys should not.

  • 方法 deregisterCharacterJoiner

Deregisters the character joiner if one was registered. NOTE: character joiners are only used by the canvas renderer.

  • 方法 deregisterLinkMatcher

Deregisters a link matcher if it has been registered.

  • 方法 blur

使终端失焦

  • 方法 clear

清除整个终端, 只保留当前行

  • 方法 selectAll

选择终端内的所有文本

  • 方法 selectLines

选中指定的两个指定行之间的终端文本

term.write('Hello from \x1B[1;3;31mxterm.js\x1B')
term.selectLines(0, 0)

方法 clearSelection 清除当前选择的终端(只是清除选择的内容, 而非清除终端)

方法 destroy 销毁终端, 不推荐使用。推荐使用dispose()

方法 dispose 销毁终端

方法 focus 终端获得焦点

方法 getOption 获取的终端的配置选项, 需要指定配置的key

let term = new Terminal({
  fontWeight: '800',
  fontSize: 20
})
term.open(document.getElementById('app'))
term.write('Hello from \x1B[1;3;31mxterm.js\x1B')
// '800'
console.log(term.getOption('fontWeight'))
// 20
console.log(term.getOption('fontSize'))

详细的类型推导请参考下图

  • 方法 getSelection

获取当前终端选择的内容。(鼠标光标选中的内容)

  • 方法 hasSelection

判断当前终端是否有选中的内容。(鼠标光标选中的内容)

  • 方法 off

删除事件监听, 支持的方法见上图

  • 方法 on

添加事件监听, 支持注册的事件如上图

方法 open 打开终端。(xterm必须挂载dom完成)

方法 refresh 刷新指定两行之间的内容

  • 方法 registerCharacterJoiner

Registers a character joiner, allowing custom sequences of characters to be rendered as a single unit. This is useful in particular for rendering ligatures and graphemes, among other things.

Each registered character joiner is called with a string of text representing a portion of a line in the terminal that can be rendered as a single unit. The joiner must return a sorted array, where each entry is itself an array of length two, containing the start (inclusive) and end (exclusive) index of a substring of the input that should be rendered as a single unit. When multiple joiners are provided, the results of each are collected. If there are any overlapping substrings between them, they are combined into one larger unit that is drawn together.

All character joiners that are registered get called every time a line is rendered in the terminal, so it is essential for the handler function to run as quickly as possible to avoid slowdowns when rendering. Similarly, joiners should strive to return the smallest possible substrings to render together, since they aren’t drawn as optimally as individual characters.

NOTE: character joiners are only used by the canvas renderer.

  • 方法 registerLinkMatcher

Registers a link matcher, allowing custom link patterns to be matched and handled.

方法 reset 重置整个终端

方法 resize 调整终端的大小, 参数为指定的col, row

方法 scrollLines 控制终端滚动条的滚动的行数(正数向下滚动, 负数向上滚动)

方法 scrollPages 滚动的页面树(正数向下滚动, 负数向上滚动)

方法 scrollToBottom 滚动到底部

方法 scrollToLine 滚动到具体的行

方法 scrollToTop 滚动到顶部

方法 setOption 设置终端的配置

具体的配置请参考下图

方法 writeln 向终端写入文本并换行

方法 write 向终端写入文本

静态方法 applyAddon

添加插件到终端的原型上

接口

这里没有什么好翻译的了, Xterm.js是由TypeScript编写。这里定义Xterm内部以及外部参数和返回值的iterface

插件

attach插件

attach可以将终端附加到websocket流中。Terminal实例会捕获所有键盘和鼠标事件并通过socket发送给后端

import * as Terminal from 'xterm';
import * as attach from 'xterm/lib/addons/attach/attach';
// 添加attach插件
Terminal.applyAddon(attach);
var term = new Terminal();
var socket = new WebSocket('wss://docker.example.com/containers/mycontainerid/attach/ws');
term.attach(socket)

方法 attach

// socket socoket实例
// bidirectional 终端是否向套接字发送数据
// bufferred 终端是否缓冲输出获得更好的性能
attach(socket: WebSocket, bidirectional: Boolean, bufferred: Boolean)

方法 detach

// 分离当前终端和scoket
detach(socket)

fit 调整终端的大小以及行和列适配父级元素

fullscreen

fullscreen插件提供了设置全屏终端的toggleFullScreen方法, toggleFullScreen接受Boolean类型的值, 设置是否全屏展示终端

前后端示例

// 前端代码
import { Terminal } from 'xterm'
import 'xterm/dist/xterm.css'
import io from 'socket.io-client';
const socket = io('http://localhost:3000');
let term = new Terminal({
  fontSize: 30
})
term.open(document.getElementById('app'))
socket.on('concat', function (data) {
  socket.emit('run', { xml: `
    #include <iostream>
    using namespace std;
    int main()
    {
        cout << "Nice to meet you.";
        return 0;
    }
  `})
  socket.on('writeIn', function (xml) {
    term.writeln(xml)
  })
})
// 后端代码
const Koa = require('koa')
const Router = require('koa-router')
const app = new Koa()
const router = new Router()
const server = require('http').createServer(app.callback())
const io = require('socket.io')(server)
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
const logger = require('koa-logger')
const config = require('./config')
const routes = require('./routes')
onerror(app)
app.use(bodyparser())
  .use(json())
  .use(logger())
  .use(router.routes())
  .use(router.allowedMethods())
routes(router)
io.on('connection', function (socket) {
  socket.emit('concat');
  socket.on('run', function () {
    socket.emit('writeIn', '编译成功')
    socket.emit('writeIn', '代码运行结束')
  })
})
app.on('error', function(err, ctx) {
  logger.error('server error', err, ctx)
})
module.exports = server.listen(config.port, () => {
  console.log(`Listening on http://localhost:${config.port}`)
})
s

结语

到这里我们大概对Xterm.js这个库有了一个初步的认知, 不至于在接下来的工作中无从下手了

以上就是Xterm.js入门官方文档示例详解的详细内容,更多关于Xterm.js 官方文档的资料请关注我们其它相关文章!

(0)

相关推荐

  • xshell会话批量迁移到mobaxterm的工具(python小工具)

    自己写了一个Python小工具:xshell2mobaxterm,可以将xshell的session转换成mobaxterm的数据文件以导入到mobaxterm中. exe版的编译好了,博客园不支持附件,所以没法上传,需要的话可以评论留下邮箱,我发送给你. Python代码: #!/usr/bin/env python3 # -*- coding: utf-8 -*- # xshell session to mobaxterm session file # Support: TELNET, se

  • MobaXterm的安装和使用及问题小结

    安装 链接: https://pan.baidu.com/s/1YD3u1clg-bbnMp9xA76-kA 提取码: uqns 1 下载网址:https://mobaxterm.mobatek.net/,选择"Download",选择免费版的下载. 2 解压压缩包,双击exe文件安装软件,安装完成后打开软件. 其中的安装步骤没啥说的,下一步就可以了. 安装完成后如下图 如果遇到这个问题,直接点Ignore就可以进入了... 登陆 1 单击左上角的"Session"

  • Xterm.js入门官方文档示例详解

    目录 前言 xterm.js是什么? 安装 初始化 使用插件 API文档模块 类 Terminal 构造函数 constructor 接口 插件 attach插件 前后端示例 结语 前言 入职的新公司所在的事业部专注于K12的编程教育.公司项目里有使用xterm.js这个库, 并基于master分支做出了一定的修改.为了尽快的熟悉业务以及公司的代码, 所以这里打算学习xterm.js的文档(粗略的翻译, 方便自己查阅, 凡是保留原文的地方, 是我目前还没有明白具体使用场景和用法的地方) xter

  • Node.js 应用探索文件解压缩示例详解

    目录 引言 compressing 解压 压缩 archiver adm-zip 压缩 解压缩 总结 引言 今天在使用 node 脚本对文件处理时,需要实现一个功能,要对一个 zip 压缩包解压出来,修改里面的文件后,重新打包成zip包.node 解压缩文件的场景在实际应用中还是比较常见,下面介绍几个用来解压缩文件的库和使用方法. compressing compressing 是一个使用起来方便.功能非常强大的node库,它可以对文件.文件夹进行解压或压缩,支持tar.gzip.tgz.zip

  • Vue.js实现watch属性的示例详解

    目录 1.写在前面 2.watch的实现原理 3.立即执行的watch与回调执行时机 立即执行的回调函数 回调函数的执行时机 4.过期的副作用函数和cleanup 5.写在最后 1.写在前面 在上篇文章中,我们讨论了compted的实现原理,就是利用effect和options参数进行封装.同样的,watch也是基于此进行封装的,当然watch还可以传递第三参数去清理过期的副作用函数.不仅可以利用副作用函数的调度性,去实现回调函数的立即执行,也可以控制回调函数的执行时机. 2.watch的实现原

  • JS代码计算LocalStorage容量示例详解

    目录 LocalStorage 容量 计算总容量 已使用容量 剩余可用容量 LocalStorage 容量 localStorage的容量大家都知道是5M,但是却很少人知道怎么去验证,而且某些场景需要计算localStorage的剩余容量时,就需要我们掌握计算容量的技能了~~ 计算总容量 我们以10KB一个单位,也就是10240B,1024B就是10240个字节的大小,我们不断往localStorage中累加存入10KB,等到超出最大存储时,会报错,那个时候统计出所有累积的大小,就是总存储量了!

  • wasm+js实现文件获取md5示例详解

    目录 引言 本文重点 准备工作 测试代码 纯js测试代码 wasm(go)源码 js+wasm测试代码 测试条件 测试目标 chrome (版本:103.0.5060.114) firefox (版本号:103.0.1 (64 位)) 分段计算测试代码 纯js js+wasm 测试结论 firefox chrome 最终结论 引言 在过去的几年里,wasm的话题那真是从早上聊到晚上,可以说处于异常兴奋的状态,但是几年过去了,它慢慢的被大多数人们忘记,原因比较简单——落地难 今天就wasm能给js

  • php+js实现点赞功能的示例详解

    最近在做一个视频网站,需要实现视频的点赞功能,我是结合ajax和数据库实现的,数据库的格式为有四个字段:文章id,赞,踩,ip.因为需要一个ip只能点赞一次,所以需要一个ip字段存储点赞的ip,这样便于判断该ip是否已经点赞过了: 我将点赞和踩的图片做成两个按钮:具体代码如下: <button style="margin-left:4px" id="vote" rel="<?php echo 文章id;?>"> <i

  • js实现窗口全屏示例详解

    前言 该 demo 包含全屏事件.退出全屏事件以及屏幕状态改变的钩子函数的封装 以下是一个完整示例,只需整体拷贝下来运行即可(注意引入了 jquery) 请在这里查看示例☞ fullscreen示例 示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>demo</title> <script sr

  • js setTimeout opener的用法示例详解

    复制代码 代码如下: $("#saveInfo").show(); setTimeout( '$("#saveInfo").hide();',3000); if(opener&& !opener.closed){ opener.location.reload(true); } setTimeout : 延迟多长时间执行什么方法,具体使用:http://www.jb51.net/article/35535.htm opener: 指parent表示父窗

  • JS运算符优先级与表达式示例详解

    前言 运算符优先级决定了表达式中运算执行的先后顺序,优先级越高的运算符会先执行. 运算符优先级 很多时候由于对运算符优先级的不确定,会用括号来确保表达式的执行顺序.如果搞清楚运算符的优先级,即使不用括号也能确保表达式按照正确的顺序执行. 其实单纯靠运算符的优先级来确定表达式的执行过程并不是一个绝对稳妥的做法,比如 new a()['b'] 这样的表达式就没法套用运算符优先级.当然一般情况下,绝大多数表达式我们都可以利用运算符优先级来判断,如果确实遇到比较复杂的难以直观判断出来的情况还是要查询 E

  • JS实现微信播音效果示例详解

    目录 需要实现的效果 图片切换轮播法 CSS实现 需要实现的效果 图片切换轮播法 这个功能其实是我刚毕业的时候实现的,那也是5年前的事情了,受限于当时的水平,仅仅是实现了,其他啥都不是.相当简单. 当初微信的声音条还是竖状的,所以依旧按照但是的样子来实现. 看下面的这个图片就知道了,甚至于代码都不用贴

随机推荐