Node.js 向repl提示符(节点)添加颜色

Node.js 向repl提示符(节点)添加颜色,node.js,terminal,console,read-eval-print-loop,chalk,Node.js,Terminal,Console,Read Eval Print Loop,Chalk,我发现在repl中为提示符添加颜色确实有助于分离输出。我通过使用NPM的粉笔实现了这一点,但这在提示符和光标之间增加了一些空间 var term = repl.start({ prompt: chalk.blue('goose> '), eval: function(cmd, context, filename, cb){ ... } }); 提示如下(“|”是光标): 关于如何修复有什么想法吗?在repl.start()之前运行此命令。: 依赖项

我发现在repl中为提示符添加颜色确实有助于分离输出。我通过使用NPM的粉笔实现了这一点,但这在提示符和光标之间增加了一些空间

var term = repl.start({
    prompt: chalk.blue('goose> '),
    eval: function(cmd, context, filename, cb){
        ...
    }
});
提示如下(“|”是光标):


关于如何修复有什么想法吗?

repl.start()之前运行此命令。


依赖项:
npm安装有ansi strip ansi

它非常简单:

var prompt = 'My fancy prompt >>> ';
rl.setPrompt(chalk.blue(prompt), prompt.length);
您需要指定字符数,因为
readline
不理解转义序列实际上显示为零宽度


(这是基于Felix的回答。)

找到。提示长度似乎已设置为整个提示字符串,包括转义颜色字符。不确定是否有可能使用repl获得我想要的。您可能应该提到,您必须使用npm安装并剥离ansi才能使其正常工作。除非您真的必须这样做,否则不应使用monkey patch readline library。
var readline = require('readline');
var hasAnsi = require('has-ansi');
var stripAnsi = require('strip-ansi');

var _setPrompt = readline.Interface.prototype.setPrompt;
readline.Interface.prototype.setPrompt = function() {
  if (arguments.length === 1 && hasAnsi(arguments[0])) {
    return _setPrompt.call(this, arguments[0], stripAnsi(arguments[0]).length);
  } else {
    return _setPrompt.apply(this, arguments);
  }
};
var prompt = 'My fancy prompt >>> ';
rl.setPrompt(chalk.blue(prompt), prompt.length);