如何让 xterm.js 接受输入?
How to make xterm.js accept input?
我正在使用 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));
}
此处link到api,与终端功能相关:
https://xtermjs.org/docs/api/terminal/#onevent-callback`
例如,您可以使用 term.clear();
清除终端
这里是一个示例,展示了 on 数据事件 是如何工作的
term.on('data', (data) => {
term.write(data);
});
您将看到,通过该事件,您可以处理发送到终端的数据。例如打字时。
现在确定这一切都很好。但这不是 gona 对真正的应用程序的帮助。为了更好地了解事情是怎样的,我建议阅读这些文章和 links:
- 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 允许我们生成一个终端进程。并有一个 object 允许我们写入终端并因此操作该终端。然后使用 xterm 我们将能够将数据写入 pty 并从 pty 获取数据。 (你可以这样看:pty 是灵魂 运行 的真正终端。而 xterm 是 body 允许我们暴露那个灵魂并因此看到。) xterm 和 pty prov ide 数据事件。它变得如此简单:
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 link xterm 和 pty。就是 idea。上面的例子 provided 在 second link 中表达得很好。该项目分为后端和前端两部分,main.js 指前端,app.js 指后端,xterm 将在 main.js 和 app.js 包含 node-pty。注意该演示中所做的所有事情。我建议通读一遍,自己测试,也可以 运行 同一个演示,查看并比较您简单实现的内容与演示的不同之处。
现在第三篇link,好文章,后台不是nodejs。另外可能会有更多详细信息,因为它是教程而不仅仅是演示。
如果不熟悉这里的 back-end 语言也没关系。留下来给 idea 一个很好的关于你如何完成工作的。尽管前两个 link 可能就足够了,甚至更多。毕竟都是由维护这两个项目的人编写的。
关于websockets及其原理如下:
您在客户端和服务器之间设置套接字通信。您在服务器中初始化 pty。和客户端中的 xterm。然后在服务器中,当 pty 获取数据时,您将该数据推送到客户端,然后将其写入 xterm。与在客户端中一样,每当 xterm 获取数据时,您将其发送到服务器,您从服务器获取数据并将其写入 pty。现在这就是所有简单的事情。还有更多细节。比如处理列和行以及 re-dimension。第二个 link 的演示很好地展示了这一点。
希望对您有所帮助。
如果你喜欢冒险,看看一些项目,其中实现了这样的终端,没有更好的,即使这样的项目也可能更复杂。要找到一些网站,有 visual studio 代码 => 在项目中搜索 node-pty。你会找到你的路。但这里是你需要去剪掉它的地方:
src/vs/workbench/parts/terminal
。
有超 https://github.com/zeit/hyper。
这里是更多项目的列表:
https://github.com/xtermjs/xterm.js/#real-world-uses
您还可以加载实现终端或 ide 的站点之一,并尝试查看它们如何在服务器 side 中实现 xterm。它可以给你很多洞察力。示例:https://aws.amazon.com/cloud9/
为什么您可能需要查看更多项目,这是关于亲和力,以及您如何配置 xterm、应用所有 add-ons、操纵字体、调整大小、搜索。和不同的东西。祝你好运!编码愉快!
对于较新的版本 (xterm.js 4.13),API 已更改为以下内容:
term.onKey(e => {
console.log(e.key);
term.write(e.key);
if (e.key == '\r')
term.write('\n');
})
我正在使用 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));
}
此处link到api,与终端功能相关: https://xtermjs.org/docs/api/terminal/#onevent-callback`
例如,您可以使用 term.clear();
这里是一个示例,展示了 on 数据事件 是如何工作的
term.on('data', (data) => {
term.write(data);
});
您将看到,通过该事件,您可以处理发送到终端的数据。例如打字时。
现在确定这一切都很好。但这不是 gona 对真正的应用程序的帮助。为了更好地了解事情是怎样的,我建议阅读这些文章和 links:
- 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 允许我们生成一个终端进程。并有一个 object 允许我们写入终端并因此操作该终端。然后使用 xterm 我们将能够将数据写入 pty 并从 pty 获取数据。 (你可以这样看:pty 是灵魂 运行 的真正终端。而 xterm 是 body 允许我们暴露那个灵魂并因此看到。) xterm 和 pty prov ide 数据事件。它变得如此简单:
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 link xterm 和 pty。就是 idea。上面的例子 provided 在 second link 中表达得很好。该项目分为后端和前端两部分,main.js 指前端,app.js 指后端,xterm 将在 main.js 和 app.js 包含 node-pty。注意该演示中所做的所有事情。我建议通读一遍,自己测试,也可以 运行 同一个演示,查看并比较您简单实现的内容与演示的不同之处。
现在第三篇link,好文章,后台不是nodejs。另外可能会有更多详细信息,因为它是教程而不仅仅是演示。 如果不熟悉这里的 back-end 语言也没关系。留下来给 idea 一个很好的关于你如何完成工作的。尽管前两个 link 可能就足够了,甚至更多。毕竟都是由维护这两个项目的人编写的。
关于websockets及其原理如下: 您在客户端和服务器之间设置套接字通信。您在服务器中初始化 pty。和客户端中的 xterm。然后在服务器中,当 pty 获取数据时,您将该数据推送到客户端,然后将其写入 xterm。与在客户端中一样,每当 xterm 获取数据时,您将其发送到服务器,您从服务器获取数据并将其写入 pty。现在这就是所有简单的事情。还有更多细节。比如处理列和行以及 re-dimension。第二个 link 的演示很好地展示了这一点。 希望对您有所帮助。
如果你喜欢冒险,看看一些项目,其中实现了这样的终端,没有更好的,即使这样的项目也可能更复杂。要找到一些网站,有 visual studio 代码 => 在项目中搜索 node-pty。你会找到你的路。但这里是你需要去剪掉它的地方:
src/vs/workbench/parts/terminal
。
有超 https://github.com/zeit/hyper。
这里是更多项目的列表:
https://github.com/xtermjs/xterm.js/#real-world-uses
您还可以加载实现终端或 ide 的站点之一,并尝试查看它们如何在服务器 side 中实现 xterm。它可以给你很多洞察力。示例:https://aws.amazon.com/cloud9/
为什么您可能需要查看更多项目,这是关于亲和力,以及您如何配置 xterm、应用所有 add-ons、操纵字体、调整大小、搜索。和不同的东西。祝你好运!编码愉快!
对于较新的版本 (xterm.js 4.13),API 已更改为以下内容:
term.onKey(e => {
console.log(e.key);
term.write(e.key);
if (e.key == '\r')
term.write('\n');
})