32

我正在将 xterm.js 用于一个项目,但我无法让它接受输入。每当我尝试在终端中输入时,什么都没有发生,也没有说明如何完成此操作的文档或示例。

这就是我所拥有的:

const term = new XTerm({
    cols: 100,
    cursorBlink: true,
    rows: 120
});
term.open(document.getElementById('terminal-window'), true)
term.fit()
term.writeln('Hello World!')
4

2 回答 2

59

xtermjs 是一个公开 api 的库,它允许我们构建完全基于 xterm 的终端仿真器。但是对于每个终端功能,您都需要通过 api 来实现它。使用事件监听器。并处理它们。并将其与其他软件包结合起来取决于您想要实现的目标。

对于输入,这里有一些方法:

term.on('key', (key, ev) => {
        console.log(key.charCodeAt(0));
        if (key.charCodeAt(0) == 13)
            term.write('\n');
        term.write(key);
});

另一个了解您需要如何操作以及如何实现目标的示例是:

term.textarea.onkeypress = function (e) {
        term.write(String.fromCharCode(e.keyCode));
}

这里是与终端功能相关的 api 链接: https://xtermjs.org/docs/api/terminal/#onevent-callback`

例如,您可以使用清除终端term.clear();

这是一个展示on data 事件如何工作的示例

term.on('data', (data) => {
        term.write(data);
   });

您将看到通过该事件,您可以处理发送到终端的数据。比如打字的时候。

现在确定这一切都很好。但这不是真正的应用程序的帮助。为了更好地了解情况,我建议阅读这些文章和链接:

让你马上开始!知道 pty(pseudotty = 伪终端),这里的 node-pty 允许我们生成一个终端进程。并有一个对象允许我们写入终端并操作该终端。然后使用 xterm 我们将能够将数据写入 pty 并从 pty 获取数据。(你可以这样看:pty 是运行的真正终端的灵魂。而 xterm 是允许我们暴露灵魂并因此得以看到的主体。) xterm 和 pty 都提供数据事件。它变得如此简单:

var os = require('os');
var pty = require('node-pty');
var Terminal = require('xterm').Terminal;

// Initialize node-pty with an appropriate shell
const shell = process.env[os.platform() === 'win32' ? 'COMSPEC' : 'SHELL'];
const ptyProcess = pty.spawn(shell, [], {
  name: 'xterm-color',
  cols: 80,
  rows: 30,
  cwd: process.cwd(),
  env: process.env
});

// Initialize xterm.js and attach it to the DOM
const xterm = new Terminal();
xterm.open(document.getElementById('xterm'));

// Setup communication between xterm.js and node-pty
xterm.on('data', (data) => {
  ptyProcess.write(data);
});
ptyProcess.on('data', function (data) {
  xterm.write(data);
});

查看如何使用 on data 事件。当向 ptyProcess 写入内容时。我们在 xterm 中编写它。当在 xterm 上写入某些内容时,我们将其写入 ptyProcess。请注意,这是针对电子应用程序的。所以一切都是直截了当的!

现在,如果您正在做的不是电子,那是服务器终端的浏览器。xterm 将驻留在客户端,处理将在服务器上运行。在这种情况下,使用 node-pty 意味着我们将使用 nodejs。那么我们需要一些额外的东西。和websockets。原理保持不变,但我们需要通过 websocket 链接 xterm 和 pty。就是这样的想法。上面的示例在第二个链接中提供表达得很好。该项目分为后端和前端两部分,main.js 指前端,app.js 指后端,xterm 将在 main.js 和 app.js 中包含 node-pty。注意该演示中所做的所有事情。我建议通读一遍,自己进行测试,并运行相同的演示,查看和比较您简单实现的目标和演示的不同之处。

现在第三个链接,一篇好文章,后端不是nodejs。另外可能还有更多细节,因为它是一个教程,而不仅仅是一个演示。如果不熟悉这里的后端语言也没关系。留下来很好地了解您如何完成工作。即使前两个链接可能就足够了,甚至更多。毕竟是由维护这两个项目的人编写的。

对于 websockets 及其原理如下: 在客户端和服务器之间设置一个套接字通信。您在服务器中初始化 pty。和客户端中的 xterm。然后在服务器中,当 pty 获取数据时,您将该数据推送到客户端,然后将其获取并写入 xterm。就像客户端一样,每当 xterm 获取数据时,您将其发送到服务器,在那里您获取数据并将其写入 pty。现在这就是所有简单的事情。还有更多细节。就像处理列和行以及重新维度一样。第二个链接的演示很好地展示了这一点。希望能帮助您入门,这很有帮助。

如果你喜欢冒险,看看一些实施了这样的终端没有更好的项目,即使这样的项目也可能更复杂。对于一些站点,有 Visual Studio 代码 => 在项目中搜索 node-pty。你会找到你的路。但这里是你需要去剪掉它的地方: src/vs/workbench/parts/terminal。有超https://github.com/zeit/hyper。这里是更多项目的列表: https ://github.com/xtermjs/xterm.js/#real-world-uses

您还可以加载实现终端或 ide 的站点之一,并尝试查看它们如何在服务器端实现 xterm。它可以给你很大的洞察力。示例:https ://aws.amazon.com/cloud9/

为什么您可能需要查看更多项目,这与亲和力有关,以及您如何配置 xterm、应用所有附加组件、操作字体、调整大小、搜索。和不同的东西。祝你好运!快乐编码!

于 2018-03-16T22:19:56.257 回答
8

对于较新的版本(xterm.js 4.13),API 已更改为以下内容:

term.onKey(e => {
    console.log(e.key);
    term.write(e.key);
    if (e.key == '\r')
        term.write('\n');
})
于 2021-07-05T02:13:25.593 回答