commit | 41c551896194c90a78cda66c94d5ca356a45c02c | [log] [tgz] |
---|---|---|
author | Jeff Belgum <belgum@google.com> | Wed Oct 10 15:02:05 2018 -0700 |
committer | Jeff Belgum <belgum@google.com> | Wed Oct 10 15:02:05 2018 -0700 |
tree | 1f535c59a23923235316c6dd172b232ee0ba88aa | |
parent | 8e82f6af6cdf65b916e4b91a63cc2f78ab35a23a [diff] | |
parent | 6acc2f55be91fb1c3febbce369489fa3f4b9d291 [diff] |
Merge remote-tracking branch 'upstream/master' into HEAD * upstream/master: (342 commits) Update TODO list Fix some rustc warnings Fix some Clippy warnings Rustfmt Another fix for stderr support Rustfmt Simplify surrogate pair handling on windows Fix on windows when using stderr. Allow customization of the output stream Ignore all IO errors during completion Prepare 2.1.0 release Fix line refresh/redraw (#149) [unstable] Fix error: scoped lint `...` is experimental Update TODO list Flag ReadlineError, Cmd, KeyPress as non exhaustive Improve key press handling Fix clippy warnings Rename consts.rs to keys.rs Prepare 2.0.1 release Windows: fix enable_raw_mode ... Change-Id: I4a5ea48918ba09f93037b8cabdb259af9edab1f2
Readline implementation in Rust that is based on Antirez' Linenoise
Supported Platforms
Note:
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.load_history("history.txt").is_err() { println!("No previous history."); } loop { let readline = rl.readline(">> "); match readline { Ok(line) => { rl.add_history_entry(line.as_ref()); 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(); }
You can use this package in your project by adding the following to your Cargo.toml
:
[dependencies] rustyline = "2.1.0"
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 perfoming 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 |
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
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 occurance of char |
F | 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 | Move right to the next occurance of char , then one char backward |
T | Move left to the previous occurance 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) |
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
$ 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 ...
$ # current settings of all terminal attributes: $ stty -a $ # key bindings: $ bind -p
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 | ? | ? |
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 | ? | ? |
Linefeed | Rust | Ux/Win | Any | Yes | any | Emacs/conf | Yes | No | ? | No | |
Liner | Rust | Ux | ANSI | No inc search | only word | Emacs/Vi/prog | No | Yes | Ux | History based | |
Prompt-toolkit | 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 |