我正在为项目使用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!')
最佳答案
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();
清除终端这是一个暴露数据事件上的如何工作的示例
term.on('data', (data) => {
term.write(data);
});
您将看到,通过该事件,您可以处理发送给终端的数据。例如键入时。
现在确定这一切都很好。但这不是gona真正应用程序所能提供的帮助。为了更好地掌握事物的状况,我建议阅读以下文章和链接:
让您立即开始!知道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。另外,可能还有更多详细信息,因为它是教程,而不仅仅是演示。
如果不熟悉后端语言,也可以。留下来可以很好地说明您如何完成工作。即使前两个链接可能已足够,甚至更多。毕竟是由维护两个项目的人写的。
有关网络套接字及其原理,如下所示:
您在客户端和服务器之间设置套接字通信。您在服务器中初始化pty。和xterm在客户端。然后在服务器上,当pty获取数据时,将数据推送到客户端,然后将其接收并写入xterm。就像在客户端中一样,只要xterm获取数据,就将其发送到服务器,在服务器上获取数据并将其写入pty。现在,这就是所有简单的事情。还有更多细节。像处理列和行并重新定义维度。第二个链接中的演示很好地展示了这一点。
希望能帮助您入门,这对您有所帮助。
如果您喜欢冒险,可以看看一些实现了这样的终端的项目并没有更好的选择,即使这样的项目也可能更加复杂。要找到一些站点,可以使用Visual Studio代码=>在项目中搜索node-pty。你会找到你的路。但是在这里您需要删除它:
src/vs/workbench/parts/terminal
。有hyper https://github.com/zeit/hyper。
这是更多项目的列表:
https://github.com/xtermjs/xterm.js/#real-world-uses
您还可以加载实现终端或ide的站点之一,并尝试查看它们如何在服务器端实现xterm。它可以为您提供很多见识。例如:https://aws.amazon.com/cloud9/
为什么您可能需要查看更多项目,这与亲和力以及配置xterm,应用所有附加组件,操纵字体以及调整大小,搜索有关。和不同的东西。祝你好运!祝您编码愉快!
关于javascript - 如何使xterm.js接受输入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44447473/