cursesjs icon indicating copy to clipboard operation
cursesjs copied to clipboard

An implementation of ncurses for the web browser

curses.js

curses.js is an attempt at porting the ncurses library to the web browser. ncurses is a library that allows a terminal application to make use of some "visual" settings: color, text alignment on screen, more interactive user input, etc. Examples of applications that use ncurses are Emacs and Vim.

For now, only Firefox and Google Chrome are supported.

This project is still under development. As such, the API is still subject to change.

Goal

The goal was to make the syntax as close to that of the original ncurses library, where possible. This means, among other things, using C-like naming conventions, and duplicating the original function names where possible.

Example

Here is a quick example to get started with curses.js and ES6:

// Initialize curses.
curses.initscr({
  container: document.getElementById("my-canvas"),
  height: 25,
  width: 80,
  font: {
    type: "bmp",
    name: "myfont.png",
    height: 16,
    width: 9,
    line_spacing: 0,
    use_char_cache: true,
  },
});
// Define colors we can use later.
curses.init_pair(1, COLOR_RED, COLOR_BLACK);
// Main loop
while (1) {
  // Clear the screen.
  curses.clear();
  // Tell the user what to do.
  curses.addstr(0, 0, "Please hit ");
  curses.addstr("any key", COLOR_PAIR(1) | A_BOLD);
  curses.addstr(" to have fun.");
  curses.refresh();
  // Wait for the user to press a key.
  const c = await getch();
  // Do something depending on which key was pressed.
  curses.move(2, 0);
  if (c == KEY_F) {
    curses.addstr("F is for the ");
    curses.addstr("friends", A_UNDERLINE);
    curses.addstr(" that do stuff together.");
  }
  else {
    curses.addstr("I don't know about that key.");
  }
}

Compiling & Running

This project contains a Gruntfile.js, which allows automation of tasks for this project, assuming the grunt-cli package is installed from the npm. As root, you can run:

npm install -g webpack-cli
npm install

The source files are distributed in the src/ directory, and the compiled, unminified JavaScript is in the dist/ directory. In order to recompile the source files after a change, you may run the command:

webpack
webpack --optimize-minimize