如何编写与 GNU Emacs 一起使用的 Node.js REPL?
How to write Node.js REPL that works with GNU Emacs?
我在 JavaScript 中有一个名为 LIPS 的 Scheme 解释器。我有可执行文件,它可以在终端仿真器中运行,但在 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();
}
});
第一个问题是,当我输入某些内容时,输出是重复的,它是文字命令行回显:
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)
我无法删除该文本。
编辑:
如果我调用也使用 readline 获取输入的 (read),也会发生同样的情况,它会不断添加空格。
我是 reading Node.js source code 它也使用 readline 并且当 运行 使用 run-js
时它工作正常,Kawa Scheme Interpreter 工作正常但它不使用 readline:
(setq inferior-js-program-command "node --interactive")
(run-js)
这有效,它不是 运行-scheme 但它是相同的模式,我也尝试 运行 相同的 run-js
代码但使用我的 Scheme 解释器,它也显示调整大小时出现相同的提示重复。
(setq inferior-js-program-command "/home/kuba/projects/jcubic/lips/bin/lips.js")
(run-js)
在 Emacs 开发邮件列表中得到了答案,解决方案是在 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.
我在 JavaScript 中有一个名为 LIPS 的 Scheme 解释器。我有可执行文件,它可以在终端仿真器中运行,但在 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();
}
});
第一个问题是,当我输入某些内容时,输出是重复的,它是文字命令行回显:
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)
我无法删除该文本。
编辑:
如果我调用也使用 readline 获取输入的 (read),也会发生同样的情况,它会不断添加空格。
我是 reading Node.js source code 它也使用 readline 并且当 运行 使用 run-js
时它工作正常,Kawa Scheme Interpreter 工作正常但它不使用 readline:
(setq inferior-js-program-command "node --interactive")
(run-js)
这有效,它不是 运行-scheme 但它是相同的模式,我也尝试 运行 相同的 run-js
代码但使用我的 Scheme 解释器,它也显示调整大小时出现相同的提示重复。
(setq inferior-js-program-command "/home/kuba/projects/jcubic/lips/bin/lips.js")
(run-js)
在 Emacs 开发邮件列表中得到了答案,解决方案是在 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.