thlorenz / replpad

Pipes content of files to a node repl whenever they change to enable a highly interactive coding experience.
http://thlorenz.github.com/replpad/
MIT License
213 stars 19 forks source link

replpad build status

become a patron

Pipes content of files to a node repl whenever they change to enable a highly interactive coding experience.

Adds keymaps, doc access, vim binding and maps and prints highlighted source of functions right in the repl.

tty

Check out the replpad home page for demos and tutorials.

Features

Table of Contents generated with DocToc

Installation

npm install -g replpad

Usage

replpad [path/to/root]

If path/to/root is omitted then no files are watched.

Example: replpad . watches current directory and all sub directories.

API

You can use replpad inside of your application and specify repl start options:

var replpad = require('replpad');

var repl = replpad({
    prompt          :  'my-prompt >'
  , input           :  process.stdin
  , output          :  process.stdout
  , ignoreUndefined :  true
  , useColors       :  true
  , useGlobal       :  true
  , terminal        :  true
});

Commands

Some commands were added to the built in repl commands. Here is a list of all of them:

pad > .help

.append         Appends the last entered parsable chunk of code or the last line to the last file that was sourced in the repl

.clear          Break, and also clear the local context

.compact        [on] Toggles if code is compacted before being sourced to the repl

.depth          [2] Sets the depth to which an object is traversed when printed to the repl

.exit           Exit the repl

.help           Show this list of repl commands

.hidden         [off] Set whether hidden properties are included during traversal of an object that is printed to the
repl

.highlight      [off] Toggles if syntax highlighted code is printed to the repl before being sourced

.load           Load JS from a file into the REPL session

.pack           Load your package.json dependencies and devDependencies into the repl context

.save           Save all evaluated commands in this REPL session to a file

Note: commands that toggle a setting like .compact take a second parameter: on|off. If it is ommitted the state is toggled, i.e if it was on it is turned off and vice versa.

Note: when code is syntax highlighted, it is still followed by the compacted code which is necessary in order to have the repl evaluate it.

You can add commands to the repl in real time via $repl.defineCommand

$repl.define('sayhi', { 
    help: 'Says hi via .sayhi'
  , action: function () { console.log('Hi!') }
})

Keyboard Shortcuts

Smart Append

When the .append command or the append keyboard shortcut is executed, replpad will attempt to find a parsable chunk of code to append. If the last line is parsable or no parsable chunk is found, it will append the last line.

Example:

Assume we entered:

2 + 3
function foo() {
  var a = 2;
  return a;
}

The first valid JavaScript are the last 4 lines combined. Therefore the entire function foo will be appended. This is makes more sense than appending just } for instance.

Additionally the code is reformatted with 2 space indents.

Plugins

Plugins can be enabled/disabled in the lower portion of the replpad config file (default.

The following plugins are available.

Vim

Vim Bindings

If enabled, a subset of vim bindings are added to replpad via readline-vim.

Consult its readme for available vim bindings.

Vim like key maps

replpad allows you to specify keymaps.

imap is used to map keys in insert mode and nmap to map keys in normal mode.

// map 'ctrl-t' to 'esc', allowing to switch to normal mode via 'ctrl-t'
$repl.imap('ctrl-t', 'esc'); 

// go forward in history via 'ctrl-space' in normal mode
$repl.nmap('ctrl-space', 'j')

You can list all registered mappings via: $repl.maps.

These are handled by readline-vim, so in order to learn more please read this section.

You can also declare mappings to be applied at startup by including them inside the map section of your config file as explained in configuring replpad.

Limitations

Mappings are limited by what the underlying nodejs readline supports. Consult this section for more information.

In general I found that only a few mappings in normal mode have the desired effect. In insert mode things are somewhat better.

match token

If enabled, it will match parens, braces, brackets and quotes by jumping the cursor to the matching token emacs style.

Using replpad with the Vim Editor

Configuring replpad

replpad is fully configurable.

When launched for the first time it creates a config file at ~/.config/replpad/config.js. Initially this is a copy of the default-config, but you can edit it to change these defaults.

Reading the comments in that file should give you enough information to tweak it.

Roadmap