Как написать Node.js REPL, который работает с GNU Emacs? - PullRequest
2 голосов
/ 02 апреля 2020

У меня есть интерпретатор Scheme в JavaScript, который называется LIPS. У меня есть исполняемый файл, он работает в эмуляторе терминала, но он не работает в низком режиме GNU Emacs (с использованием функции run-scheme).

Я воспроизвел проблему с этим простым Node.js REPL с использованием Readline:

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 для получения ввода, он продолжает добавлять пробелы.

Я читал Node.js исходный код и он также использует readline, и он отлично работает при запуске с использованием run-js, Kawa Scheme Interpreter работает правильно, но не использует readline:

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

Это работает, это не схема выполнения, но это в том же режиме я также пытался запустить тот же код run-js, но с моим интерпретатором Scheme, и он также показывает такое же дублирование при изменении размера.

 (setq inferior-js-program-command "/home/kuba/projects/jcubic/lips/bin/lips.js")
 (run-js)

1 Ответ

2 голосов
/ 19 апреля 2020

Получил ответ в списке рассылки Emacs devel, решение состоит в том, чтобы отключить readline, когда внутри Emacs:

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

Многие интерпретаторы делают то же самое. например: Bash.

...