如何在 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'));
};
键入“定义”以将其显示为蓝色。
这在 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'));
};
键入“定义”以将其显示为蓝色。