Skip to content
Snippets Groups Projects
README.md 4.6 KiB
Newer Older
# RustyLine
gwenn's avatar
gwenn committed
[![Build Status](https://travis-ci.org/gwenn/rustyline.svg?branch=master)](https://travis-ci.org/gwenn/rustyline)
gwenn's avatar
gwenn committed
[![Build Status](https://ci.appveyor.com/api/projects/status/github/gwenn/rustyline?branch=master&svg=true)](https://ci.appveyor.com/project/gwenn/rustyline)
gwenn's avatar
gwenn committed
[![](http://meritbadge.herokuapp.com/rustyline)](https://crates.io/crates/rustyline)
Main's avatar
Main committed

Main's avatar
Main committed
Readline implementation in Rust that is based on [Antirez' Linenoise](https://github.com/antirez/linenoise)

[Documentation](https://kkawakam.github.io/rustyline)
Main's avatar
Main committed

kkawakam's avatar
kkawakam committed
* Windows
   * cmd.exe
   * Powershell

**Note**: Powershell ISE is not supported, check [issue #56](https://github.com/kkawakam/rustyline/issues/56)
Main's avatar
Main committed
## Build
This project uses Cargo and Rust nightly
Main's avatar
Main committed
```bash
cargo build --release
Main's avatar
Main committed
```
Main's avatar
Main committed

## Example
Main's avatar
Main committed
```rust
Main's avatar
Main committed
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();
Main's avatar
Main committed
    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`:

Main's avatar
Main committed
```toml
Main's avatar
Main committed
[dependencies]
kkawakam's avatar
kkawakam committed
rustyline = "1.0.0"
Main's avatar
Main committed
```

## Features

 - Unicode (UTF-8) (linenoise supports only ASCII)
 - Word completion (linenoise supports only line completion)
 - Filename completion
gwenn's avatar
gwenn committed
 - History search ([Searching for Commands in the History](http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC8))
gwenn's avatar
gwenn committed
 - Kill ring ([Killing Commands](http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#IDX3))
 - Multi line mode
gwenn's avatar
gwenn committed
 - Word commands
gwenn's avatar
gwenn committed
## Actions

Keystroke    | Action
---------    | ------
Ctrl-A, Home | Move cursor to the beginning of line
Ctrl-B, Left | Move cursor one character left
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-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
gwenn's avatar
gwenn committed
Ctrl-J, Ctrl-M, Enter | Finish the line entry
gwenn's avatar
gwenn committed
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-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
Ctrl-W       | Delete word leading up to cursor (using white space as a word boundary)
gwenn's avatar
gwenn committed
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
gwenn's avatar
gwenn committed
Meta-B, Alt-Left | Move cursor to previous word
Meta-C       | Capitalize the current word
Meta-D       | Delete forwards one word
gwenn's avatar
gwenn committed
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
gwenn's avatar
gwenn committed
Meta-BackSpace | Kill from the start of the current word, or, if between words, to the start of the previous word
gwenn's avatar
gwenn committed
 - Show completion list
gwenn's avatar
gwenn committed
 - Undos
 - Read input with timeout to properly handle single ESC key
 - expose an API callable from C
gwenn's avatar
gwenn committed

## 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
...
gwenn's avatar
gwenn committed
```

## Similar projects

 - [copperline](https://github.com/srijs/rust-copperline) (Rust)
gwenn's avatar
gwenn committed
 - [liner](https://github.com/MovingtoMars/liner) (Rust)
gwenn's avatar
gwenn committed
 - [linenoise-ng](https://github.com/arangodb/linenoise-ng) (C++)
 - [liner](https://github.com/peterh/liner) (Go)
 - [readline](https://github.com/chzyer/readline) (Go)
 - [haskeline](https://github.com/judah/haskeline) (Haskell)