如何让 xterm.js 接受输入?
Posted
技术标签:
【中文标题】如何让 xterm.js 接受输入?【英文标题】:How to make xterm.js accept input? 【发布时间】:2017-11-10 20:42:00 【问题描述】:我正在将 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!')
【问题讨论】:
【参考方案1】:对于较新的版本(xterm.js 4.13),API 已更改为以下内容:
term.onKey(e =>
console.log(e.key);
term.write(e.key);
if (e.key == '\r')
term.write('\n');
)
【讨论】:
【参考方案2】: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);
);
您将看到,通过该事件,您可以处理发送到终端的数据。比如打字的时候。
现在确定这一切都很好。但这不是真正的应用程序的帮助。为了更好地了解情况,我建议阅读这些文章和链接:
https://github.com/Tyriar/node-pty/blob/master/examples/electron/renderer.js https://github.com/xtermjs/xterm.js/tree/master/demo http://hostiledeveloper.com/2017/05/02/something-useless-terminal-in-your-browser.html让您立即开始!知道 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、应用所有插件、操作字体、调整大小和搜索。和不同的东西。祝你好运!编码愉快!
【讨论】:
非常感谢您提供了一个简单的 node-pty 集成示例。它看起来很容易绑定到 shell :) 谢谢。很高兴听到这个。这些项目的开发人员让它变得轻而易举。编码愉快! 我对这一切真的很陌生(我是 C/C++/Java/Python 开发人员)并且努力掌握 xterm.js 你能提供一些“完整的食谱”吗?目前我坚持“找不到要求”。我试图在<head><script src="t>node_modules/node-pty"></script>...
中添加一些行,但我一无所获。欢迎指点。
node-pty 是一个节点模块!它旨在用于服务器端! nodejs的一部分!而require是nodejs的导入函数(commonjs模块)!你不要在前端和 HTML 中使用它! (当它是电子时,可以使用它!)你想做什么?浏览器中的终端!或者你正在使用电子!?以上是关于如何让 xterm.js 接受输入?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 SK Learn 分类器接受 2D 数组作为预测的输入?
如何使用 xterm.js 创建基于 Web 的终端以通过 ssh 连接到本地网络上的系统