Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding color to repl prompt (node)

I find that adding color to the prompt in repl really helps to separate the outputs. I achieved this by using NPM's chalk, but this adds a bunch of space between the prompt and the cursor.

var term = repl.start({
    prompt: chalk.blue('goose> '),
    eval: function(cmd, context, filename, cb){
        ...
    }
});

The prompt comes out like this ('|' is the cursor):

goose>              |

Any ideas on how to fix?

like image 696
Bill Johnston Avatar asked May 09 '14 16:05

Bill Johnston


2 Answers

It turns out to be very simple:

var prompt = 'My fancy prompt >>> ';
rl.setPrompt(chalk.blue(prompt), prompt.length);

You need to specify the count of characters because readline doesn't understand that escape sequences are really displayed as zero width.

(This is based on Felix's answer.)

like image 115
mik01aj Avatar answered Oct 24 '22 16:10

mik01aj


Run this before repl.start():

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);
  }
};

Dependencies: npm install has-ansi strip-ansi

like image 41
Felix Rabe Avatar answered Oct 24 '22 17:10

Felix Rabe