RustyLine

Build Status Build Status dependency status Docs

Readline implementation in Rust that is based on Antirez' Linenoise

Supported Platforms * Unix (tested on FreeBSD, Linux and macOS) * Windows * cmd.exe * Powershell

Note: * Powershell ISE is not supported, check issue #56 * Mintty (Cygwin/MinGW) is not supported

Example

```rust extern crate rustyline;

use rustyline::error::ReadlineError; use rustyline::Editor;

fn main() { // () can be used when no completer is required let mut rl = Editor::<()>::new(); if rl.loadhistory("history.txt").iserr() { println!("No previous history."); } loop { let readline = rl.readline(">> "); match readline { Ok(line) => { rl.addhistoryentry(line.asstr()); println!("Line: {}", line); }, Err(ReadlineError::Interrupted) => { println!("CTRL-C"); break }, Err(ReadlineError::Eof) => { println!("CTRL-D"); break }, Err(err) => { println!("Error: {:?}", err); break } } } rl.savehistory("history.txt").unwrap(); } ```

crates.io

You can use this package in your project by adding the following to your Cargo.toml:

toml [dependencies] rustyline = "5.0.1"

Features

Actions

For all modes:

Keystroke | Action --------- | ------ Home | Move cursor to the beginning of line End | Move cursor to end of line Left | Move cursor one character left Right | Move cursor one character right Ctrl-C | Interrupt/Cancel edition Ctrl-D, Del | (if line is not empty) Delete character under cursor Ctrl-D | (if line is empty) End of File Ctrl-J, Ctrl-M, Enter | Finish the line entry Ctrl-R | Reverse Search history (Ctrl-S forward, Ctrl-G cancel) Ctrl-T | Transpose previous character with current character Ctrl-U | Delete from start of line to cursor Ctrl-V | Insert any special character without performing its associated action (#65) Ctrl-W | Delete word leading up to cursor (using white space as a word boundary) Ctrl-Y | Paste from Yank buffer Ctrl-Z | Suspend (Unix only) Ctrl-_ | Undo

Emacs mode (default mode)

Keystroke | Action --------- | ------ Ctrl-A, Home | Move cursor to the beginning of line Ctrl-B, Left | Move cursor one character left Ctrl-E, End | Move cursor to end of line Ctrl-F, Right| Move cursor one character right Ctrl-H, Backspace | Delete character before cursor Ctrl-I, Tab | Next completion Ctrl-K | Delete from cursor to end of line Ctrl-L | Clear screen Ctrl-N, Down | Next match from history Ctrl-P, Up | Previous match from history Ctrl-X Ctrl-U | Undo Ctrl-Y | Paste from Yank buffer (Meta-Y to paste next yank instead) Meta-< | Move to first entry in history Meta-> | Move to last entry in history Meta-B, Alt-Left | Move cursor to previous word Meta-C | Capitalize the current word Meta-D | Delete forwards one word Meta-F, Alt-Right | Move cursor to next word Meta-L | Lower-case the next word Meta-T | Transpose words Meta-U | Upper-case the next word Meta-Y | See Ctrl-Y Meta-Backspace | Kill from the start of the current word, or, if between words, to the start of the previous word Meta-0, 1, ..., - | Specify the digit to the argument. starts a negative argument.

Readline Emacs Editing Mode Cheat Sheet

vi command mode

Keystroke | Action --------- | ------ $, End | Move cursor to end of line . | Redo the last text modification ; | Redo the last character finding command , | Redo the last character finding command in opposite direction 0, Home | Move cursor to the beginning of line ^ | Move to the first non-blank character of line a | Insert after cursor A | Insert at the end of line b | Move one word or token left B | Move one non-blank word left c | Change text of a movement command C | Change text to the end of line (equivalent to c$) d | Delete text of a movement command D, Ctrl-K | Delete to the end of the line e | Move to the end of the current word E | Move to the end of the current non-blank word f | Move right to the next occurrence of char F | Move left to the previous occurrence of char h, Ctrl-H, Backspace | Move one character left l, Space | Move one character right Ctrl-L | Clear screen i | Insert before cursor I | Insert at the beginning of line +, j, Ctrl-N | Move forward one command in history -, k, Ctrl-P | Move backward one command in history p | Insert the yanked text at the cursor (paste) P | Insert the yanked text before the cursor r | Replaces a single character under the cursor (without leaving command mode) s | Delete a single character under the cursor and enter input mode S | Change current line (equivalent to 0c$) t | Move right to the next occurrence of char, then one char backward T | Move left to the previous occurrence of char, then one char forward u | Undo w | Move one word or token right W | Move one non-blank word right x | Delete a single character under the cursor X | Delete a character before the cursor y | Yank a movement into buffer (copy)

vi insert mode

Keystroke | Action --------- | ------ Ctrl-H, Backspace | Delete character before cursor Ctrl-I, Tab | Next completion Esc | Switch to command mode

Readline vi Editing Mode Cheat Sheet

Terminal codes (ANSI/VT100)

Wine

sh $ cargo run --example example --target 'x86_64-pc-windows-gnu' ... Error: Io(Error { repr: Os { code: 6, message: "Invalid handle." } }) $ wineconsole --backend=curses target/x86_64-pc-windows-gnu/debug/examples/example.exe ...

Terminal checks

sh $ # current settings of all terminal attributes: $ stty -a $ # key bindings: $ bind -p

Similar projects

Library | Lang | OS | Term | Unicode | History | Completion | Keymap | Kill Ring | Undo | Colors | Hint/Auto suggest | -------- | ---- | -- | ---- | ------- | ------- | ---------- | ------- | --------- | ---- | ------ | ----------------- | go-prompt | Go | Ux/win | ANSI | Yes | Yes | any | Emacs/prog | No | No | Yes | Yes | Haskeline | Haskell | Ux/Win | Any | Yes | Yes | any | Emacs/vi/conf | Yes | Yes | ? | ? | linefeed | Rust | Ux/Win | Any | | Yes | any | Emacs/conf | Yes | No | ? | No | linenoise | C | Ux | ANSI | No | Yes | only line | Emacs | No | No | Ux | Yes | linenoise-ng | C | Ux/Win | ANSI | Yes | Yes | only line | Emacs | Yes | No | ? | ? | Liner | Rust | Ux | ANSI | | No inc search | only word | Emacs/vi/prog | No | Yes | Ux | History based | prompttoolkit | Python | Ux/Win | ANSI | Yes | Yes | any | Emacs/vi/conf | Yes | Yes | Ux/Win | Yes | rb-readline | Ruby | Ux/Win | ANSI | Yes | Yes | only word | Emacs/vi/conf | Yes | Yes | ? | No | replxx | C/C++ | Ux/Win | ANSI | Yes | Yes | only line | Emacs | Yes | No | Ux/Win | Yes | Rustyline | Rust | Ux/Win | ANSI | Yes | Yes | any | Emacs/vi/bind | Yes | Yes | Ux/Win 10+ | Yes | terminalcli | Rust | Ux | ANSI | ? | No | only line | ? | No | No | ? | ? |

Multi line support

This is a very simple feature that simply causes lines that are longer than the current terminal width to be displayed on the next visual line instead of horizontally scrolling as more characters are typed. Currently this feature is always enabled and there is no configuration option to disable it.

This feature does not allow the end user to hit a special key sequence and enter a mode where hitting the return key will cause a literal newline to be added to the input buffer.