jjzjj

javascript - 如何让 xterm.js 接受输入?

coder 2024-05-17 原文

我正在将 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);
   });

您将看到,通过该事件,您可以处理分派(dispatch)到终端的数据。例如打字时。

现在确定这一切都很好。但这对真正的应用程序没有帮助。为了更好地掌握情况,我建议阅读这些文章和链接:
  • 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、应用所有附加组件、操作字体以及调整大小和搜索。和不同的东西。祝你好运!快乐编码!

    关于javascript - 如何让 xterm.js 接受输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44447473/

    有关javascript - 如何让 xterm.js 接受输入?的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    7. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    8. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

      在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

    9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

      我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

    10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

      我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

    随机推荐