rustyline-nightly

Crates.iorustyline-nightly
lib.rsrustyline-nightly
version2.0.0-alpha-20180628
sourcesrc
created_at2018-06-29 02:30:37.739423
updated_at2018-06-29 02:30:37.739423
descriptionUnofficial nightly releases of Rustyline
homepage
repositoryhttps://github.com/datafusion-rs/rustyline
max_upload_size
id72179
size283,309
Andy Grove (andygrove)

documentation

http://docs.rs/rustyline

README

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

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();
}

crates.io

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

[dependencies]
rustyline = "1.0.0"

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 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

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 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)

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

$ 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

$ # 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
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
Commit count: 0

cargo fmt