如何将 xterm.js(在电子中)连接到实际工作的命令提示符?

Use*_*020 5 command-prompt electron xtermjs

我给自己挖了一个很深的兔子洞,试图找出标题说的是什么。如果你对这个问题感到困惑,我会给出更详细的解释:你见过 VSCode 终端吗?还是终点站?好吧,我想做那些应用程序所做的事情。我有一个电子应用程序,为了方便用户,我想在其中包含某种命令提示符。我查看了 xterm.js,但只能找到 SSH 之类的示例,而不是到系统上托管的控制台的直接链接。我要问的是如何将 xterm.js(在电子中)连接到实际工作的命令提示符?我见过能够与 cmd.exe 交互的程序,例如 Windows Terminal。我将用它作为例子。

图片取自进程黑客

在附图中您可以看到三个过程。WindowsTerminal.exe、OpenConsole.exe 和 cmd.exe。在深入研究 Windows 终端的源代码后,我可以看到 OpenConsole.exe 随您创建的每个 cmd 实例一起启动。所以我假设这是与 cmd.exe 交互的程序。现在我知道 Windows Terminal 是使用 UWP 制作的,但你可以看到VSCode发生类似的事情(我打开了一堆终端来演示)

这是另一篇有类似问题的帖子,但没有答案。我希望这个能获得一些关注。

所以如果你能回答的话,谢谢。如果您有点偏离主题,请记住我的问题:如何将 xterm.js(在电子中)连接到实际工作的命令提示符?

抱歉,如果您无法理解我的措辞,我对此不太擅长:P

小智 6

下面的视频对我很有帮助。很快,您需要:

  1. 安装 node-pty 和 electro-rebuild 软件包(除了 xterm 之外)
  2. 将以下代码放置到适当的流程文件中

在主进程(main.js)中:

const os = require('os');
const pty = require('node-pty');

var shell = os.platform() === "win32" ? "powershell.exe" : "bash";
var ptyProcess = pty.spawn(shell, [], {
        name: 'xterm-color',
        cols: 80,
        rows: 24,
        cwd: process.env.HOME,
        env: process.env
    });
    
    ptyProcess.on("data", (data) => {
      mainWindow.webContents.send("terminal-incData", data);
    });

    ipcMain.on("terminal-into", (event, data)=> {
      ptyProcess.write(data);
    })
Run Code Online (Sandbox Code Playgroud)

在渲染器进程中:

const Terminal  =  require('xterm').Terminal;
const FitAddon = require('xterm-addon-fit').FitAddon;

const term = new Terminal();
const fitAddon = new FitAddon();
term.loadAddon(fitAddon);

// Open the terminal in #terminal-container
term.open(document.getElementById('terminal-container'));
term.onData(e => {
    ipcRenderer.send("terminal-into", e);
} );
ipcRenderer.on('terminal-incData', (event, data) => {
    term.write(data);
})

// Make the terminal's size and geometry fit the size of #terminal-container
fitAddon.fit();
Run Code Online (Sandbox Code Playgroud)
  1. 如果出现错误,请运行 electro-rebuild 命令。

当您尝试安装 Electron-rebuild 包时,可能会出现以下错误:

  • MAC 的解决方案error: no template named 'remove_cv_t': .
  • Windows 解决方案:gyp ERR! find Python

  • 嗯,这是...有趣的是,那个对您有帮助的视频是我在找到解决方案后制作的视频,但是我非常感谢您在这篇文章中投入的时间、常见错误的解决方案以及 xterm 终端适合的附加功能 -在。不管怎么说,多谢拉。 (2认同)