A simple library for creating CLI REPLs in Dart.
Example Usage:
/// Echoes all entered lines
for (var line in new Repl().run()) {
print(line);
}
By passing a validator
to the Repl
constructor, you can tell the REPL
whether some entered text is a complete statement or not. The REPL calls this
whenever a newline is entered to determine whether to yield a complete statement
or continue it on a new line. The default validator returns true for all text.
By default, the REPL gives no prompt to the user when asking for a statement.
You can change this by passing a prompt
to the Repl
constructor. By default,
statement continuations on a new line will start with whitespace equal to the
length of the prompt
. You can override this by passing in continuation
.
See example/example.dart
for a demonstration of statement
validation and custom prompts.
A history of entered lines is stored. History entries are modified when edited.
By default, a maximum of 50 entries are stored. You can change this by passing
maxHistory
into the Repl
constructor.
Left
/Ctrl-B
: Move left one characterRight
/Ctrl-F
: Move right one characterHome
/Ctrl-A
: Move to start of lineEnd
/Ctrl-E
: Move to end of lineCtrl-L
: Clear the screenCtrl-D
: If there is text, delete the character under the cursor. If there is no text, exit.Ctrl-F
: Moves forward one characterCtrl-B
: Moves backward one characterCtrl-U
: Kill (cut) to start of lineCtrl-K
: Kill (cut) to end of lineCtrl-Y
: Yank (paste) previously killed text, inserting at cursorUp
/Down
: Navigate within history
If running without a terminal, the input will be printed along with the prompts, allowing you to test REPLs made with this library by comparing stdout to the expected log input and output together.
See test/repl_test.dart for an example of this.
If you compile this to JS with Dart 2, you can run it on Node.
There are a couple of behavior differences:
- Node's built-in readline library is used, so the supported navigation and history commands may vary from the Dart version.
- Likewise, line history is managed by Node, and you can't change the maximum number of entries or edit history manually from Dart.
- Only
Repl.runAsync()
works. CallingRepl.run()
will throw an error.