如何在 Node.js REPL 中突出显示输入文本的语法?

How to have syntax highlighting of input text in Node.js REPL?

这在 Linux 终端中是可能的,因为有 shell 像 fish 对输入文本使用不同的突出显示。在 Node.js 中有没有可能有这样的东西?或者我是否需要使用此功能重新实现 readLine 库。

有人知道如何在 Node.js 中执行此操作吗?我正在检查 fish on GitHub 的代码,该项目似乎使用了 NCurses。我可以在 Node.js 中做同样的事情来让 REPL 的输入文本是彩色的吗?

编辑:

我已经从@MehdiBelbal 解决方案中测试了这段代码:

var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question("lips> ", function(code) {
  console.log('\ncode is ' + code);
  rl.close();
});

rl._writeToOutput = function _writeToOutput(stringToWrite) {
    rl.output.write(stringToWrite.replace(/define/g, '\u001b[1;34mdefine\x1b[0m'));
};

但它不会在您键入后突出显示单词 define,您需要键入 space(或任何字符)并使用返回space将其删除。

如果您指的是控制台,我可以建议扩展 Chalk。 使用粉笔的示例:

const chalk = require("chalk");

//...

console.log(chalk.red("Red text, ") + "normal text");

这将以红色记录“红色文本”。

您可以通过覆盖 _writeToOutput 方法来实现此目的 '\x1b[31m' 是控制台红色 unicode 你需要添加 '\x1b[0m' 是重置, 颜色必须停在这个位置:

rl._writeToOutput = function _writeToOutput(stringToWrite) {
    rl.output.write('\x1b[31m'+stringToWrite+'\x1b[0m');
};

颜色 unicodes:

Black: \u001b[30m.
Red: \u001b[31m.
Green: \u001b[32m.
Yellow: \u001b[33m.
Blue: \u001b[34m.
Magenta: \u001b[35m.
Cyan: \u001b[36m.
White: \u001b[37m.

代码示例:

var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question("code: ", function(code) {
  console.log('\ncode is ' + code);
  rl.close();
});

// force trigger of _writeToOutput on each keystroke
process.stdin.on('keypress', (c, k) => {
    // setTimeout is needed otherwise if you call console.log
    // it will include the prompt in the output
    setTimeout(() => {
        rl._refreshLine();
    }, 0);
});

rl._writeToOutput = function _writeToOutput(stringToWrite) {
    rl.output.write(stringToWrite.replace(/define/g, '\u001b[1;34mdefine\x1b[0m'));
};

键入“定义”以将其显示为蓝色。