如何编写与 GNU Emacs 一起使用的 Node.js REPL?

问题描述 投票:0回答:1

我有一个名为 LIPS 的 JavaScript 方案解释器。我有可执行文件,它可以在终端仿真器中运行,但在 GNU Emacs 劣等模式下损坏(使用

run-scheme
函数)。

我使用 Readline 通过这个简单的 Node.js REPL 重现了该问题:

var prompt = 'lips> ';
var continuePrompt = '... ';
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: prompt,
    terminal: !!process.stdin.isTTY // true in Emacs
});
if (process.stdin.isTTY) {
    rl.prompt();
}

rl.on('line', function(line) {
    if (process.stdin.isTTY) {
        rl.prompt();
    }
});

第一个问题是,当我输入某些内容时,输出是重复的,它是文字命令行 echo:

lips> 10
10
10
lips> '(1 2 3)
'(1 2 3)
(1 2 3)
lips>

我找到了解决方案,其中:

(setq comint-process-echoes t)

但另一个问题是,在调整大小时,它会不断附加提示。所以我有这个:

lips> lips> lips> lips> lips>

这是提示,因为如果我设置:

(setq comint-prompt-read-only t)

我无法删除该文本。

编辑:

如果我调用(read)也使用 readline 来获取输入,也会发生同样的情况,它会不断添加空格。

我正在阅读Node.js源代码,它也使用readline,并且在使用

run-js
运行时工作正常,Kawa计划解释器工作正常,但它不使用readline:

 (setq inferior-js-program-command "node --interactive")
 (run-js)

这有效,它不是运行方案,但它是相同的模式,我也尝试使用我的方案解释器运行相同的

run-js
代码,并且在调整大小时它也显示相同的提示重复。

 (setq inferior-js-program-command "/home/kuba/projects/jcubic/lips/bin/lips.js")
 (run-js)
javascript node.js emacs scheme readline
1个回答
3
投票

在 Emacs devel 邮件列表中得到 答案,解决方案是在 Emacs 中关闭 readline:

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: prompt,
    terminal: !!process.stdin.isTTY && !(process.env.EMACS || process.env.INSIDE_EMACS)
});

很多口译员都做同样的事情。例如:Bash。

© www.soinside.com 2019 - 2024. All rights reserved.