Newer
Older
[](https://travis-ci.org/gwenn/rustyline)
[](https://ci.appveyor.com/project/gwenn/rustyline)
[](https://deps.rs/repo/github/gwenn/rustyline)
[](https://crates.io/crates/rustyline)
[](https://docs.rs/rustyline)
Readline implementation in Rust that is based on [Antirez' Linenoise](https://github.com/antirez/linenoise)
**Supported Platforms**
* Unix (tested on FreeBSD, Linux and macOS)
**Note**:
* Powershell ISE is not supported, check [issue #56](https://github.com/kkawakam/rustyline/issues/56)
* Mintty (Cygwin/Mingw) is not supported
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 let Err(_) = rl.load_history("history.txt") {
println!("No previous history.");
}
loop {
let readline = rl.readline(">> ");
match readline {
Ok(line) => {
rl.add_history_entry(&line);
println!("Line: {}", line);
},
Err(ReadlineError::Interrupted) => {
println!("CTRL-C");
break
},
Err(ReadlineError::Eof) => {
println!("CTRL-D");
break
},
Err(err) => {
println!("Error: {:?}", err);
break
}
}
}
rl.save_history("history.txt").unwrap();
}
```
## crates.io
You can use this package in your project by adding the following
to your `Cargo.toml`:
## Features
- Unicode (UTF-8) (linenoise supports only ASCII)
- Word completion (linenoise supports only line completion)
- Filename completion
- History search ([Searching for Commands in the History](http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC8))
- Kill ring ([Killing Commands](http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#IDX3))
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 perfoming its associated action (#65)
Ctrl-W | Delete word leading up to cursor (using white space as a word boundary)
### 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-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-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-C | Capitalize the current word
Meta-D | Delete forwards one 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](http://www.catonmat.net/download/readline-emacs-editing-mode-cheat-sheet.pdf)
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
### 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<movement> | Change text of a movement command
C | Change text to the end of line (equivalent to c$)
d<movement> | 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<char> | Move right to the next occurance of `char`
F<char> | Move left to the previous occurance 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<char> | Move right to the next occurance of `char`, then one char backward
T<char> | Move left to the previous occurance of `char`, then one char forward
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<movement> | 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](http://www.catonmat.net/download/bash-vi-editing-mode-cheat-sheet.pdf)
[Terminal codes (ANSI/VT100)](http://wiki.bash-hackers.org/scripting/terminalcodes)
## 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
```
Library | Lang | OS | Term | Unicode | History | Completion | Keymap | Kill Ring | Undo | Colors |
-------- | ---- | -- | ---- | ------- | ------- | ---------- | ------- | --------- | ---- | ------ |
[Haskeline][] | Haskell | Ux/Win | Any | Yes | Yes | any | Emacs/Vi/conf | Yes | Yes | ? |
[Linenoise][] | C | Ux | ANSI | No | Yes | only line | Emacs | No | No | Ux |
[Linenoise-ng][] | C | Ux/Win | ANSI | Yes | Yes | only line | Emacs | Yes | No | ? |
[Linefeed][] | Rust | Ux/Win | Any | | Yes | any | Emacs/conf | Yes | No | ? |
[Liner][] | Rust | Ux | ANSI | | No inc search | only word | Emacs/Vi | No | Yes | Ux |
[Prompt-toolkit][] | Python | Ux/Win | ANSI | Yes | Yes | any | Emacs/Vi/conf | Yes | Yes | Ux/Win |
[Rb-readline][] | Ruby | Ux/Win | ANSI | Yes | Yes | only word | Emacs/Vi/conf | Yes | Yes | ? |
[Replxx][] | C/C++ | Ux/Win | ANSI | Yes | Yes | only line | Emacs | Yes | No | Ux/Win |
Rustyline | Rust | Ux/Win | ANSI | Yes | Yes | any | Emacs/Vi/bind | Yes | Yes | Ux/Win 10+ |
[Haskeline]: https://github.com/judah/haskeline
[Linefeed]: https://github.com/murarth/linefeed
[Linenoise]: https://github.com/antirez/linenoise
[Linenoise-ng]: https://github.com/arangodb/linenoise-ng
[Liner]: https://github.com/MovingtoMars/liner
[Prompt-toolkit]: https://github.com/jonathanslenders/python-prompt-toolkit
[Rb-readline]: https://github.com/ConnorAtherton/rb-readline