You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

130 lines
2.4 KiB

/**
* TTY mixin helpers
*/
var _ = require("lodash");
var readline = require("readline");
var cliWidth = require("cli-width");
var tty = module.exports;
/**
* Remove the prompt from screen
* @param {Number} Extra lines to remove (probably to compensate the "enter" key line
* return)
* @return {Prompt} self
*/
tty.clean = function( extra ) {
_.isNumber(extra) || (extra = 0);
var len = this.height + extra;
while ( len-- ) {
readline.moveCursor(this.rl.output, -cliWidth(), 0);
readline.clearLine(this.rl.output, 0);
if ( len ) readline.moveCursor(this.rl.output, 0, -1);
}
return this;
};
/**
* Move cursor down by `x`
* @param {Number} x How far to go down (default to 1)
* @return {Prompt} self
*/
tty.down = function( x ) {
_.isNumber(x) || (x = 1);
// @bug: Write new lines instead of moving cursor as unix system don't allocate a new
// line when the cursor is moved over there.
while ( x-- ) {
this.write("\n");
}
return this;
};
/**
* Move cursor up by `x`
* @param {Number} x How far to go up (default to 1)
* @return {Prompt} self
*/
tty.up = function( x ) {
_.isNumber(x) || (x = 1);
readline.moveCursor( this.rl.output, 0, -x );
return this;
};
/**
* Move cursor left by `x`
* @param {Number} x How far to go left (default to 1)
* @return {Prompt} self
*/
tty.left = function( x ) {
_.isNumber(x) || (x = 1);
readline.moveCursor (this.rl.output, -x, 0);
return this;
};
/**
* Write a string to the stdout
* @return {Self}
*/
tty.write = function( str ) {
this.rl.output.write( str );
return this;
};
/**
* Hide cursor
* @return {Prompt} self
*/
tty.hideCursor = function() {
return this.write("\x1B[?25l");
};
/**
* Show cursor
* @return {Prompt} self
*/
tty.showCursor = function() {
return this.write("\x1B[?25h");
};
/**
* Remember the cursor position
* @return {Prompt} Self
*/
tty.cacheCursorPos = function() {
this.cursorPos = this.rl._getCursorPos();
return this;
};
/**
* Restore the cursor position to where it has been previously stored.
* @return {Prompt} Self
*/
tty.restoreCursorPos = function() {
if ( !this.cursorPos ) return;
var line = this.rl._prompt + this.rl.line;
readline.moveCursor(this.rl.output, -line.length, 0);
readline.moveCursor(this.rl.output, this.cursorPos.cols, 0);
this.cursorPos = null;
return this;
};