1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//! Rucline, the Rust CLI Line reader, or simply "recline", is a cross-platform, UTF-8 compatible
//! line reader that provides hooks for autocompletion and tab suggestion. It supports advanced
//! editing [`actions`] and hooks for customizing the line reader behavior making it more flexible
//! than simply reading from `stdin`.
//!
//! ### Basic usage:
//!
//! ```no_run
//! use rucline::Outcome::Accepted;
//! use rucline::prompt::{Builder, Prompt};
//!
//! if let Ok(Accepted(string)) = Prompt::from("What's you favorite website? ")
//! // Add some tab completions (Optional)
//! .suggester(vec![
//! "https://www.rust-lang.org/",
//! "https://docs.rs/",
//! "https://crates.io/",
//! ])
//! //Block until value is ready
//! .read_line()
//! {
//! println!("'{}' seems to be your favorite website", string);
//! }
//! ```
//!
//! # Actions
//!
//! Rucline's behavior can be customized and composed with use of [`actions`].
//!
//! There is a built-in set of default [`actions`] that will be executed upon user interaction.
//! These are meant to feel natural when coming from the default terminal, while also adding further
//! functionality and editing commands. For example, a few of the built-ins:
//! * `Tab`: cycle through completions
//! * `Shift` + `Tab`: cycle through completions in reverse
//! * `CTRL` + `W`: delete the current word
//! * `CTRL` + `J`: delete until the beginning of the word
//! * `CTRL` + `K`: delete until the end of the word
//! * `CTRL` + `U`: delete the whole line
//! * `CTRL` + `H`: delete until the beggining of the line
//! * `CTRL` + `L`: delete until the end of the line
//!
//! > See [`Action`] for the full default behavior specification
//!
//! The default behavior can be customized by overriding user [`events`] with [`actions`]. Which
//! in turn can be serialized, stored, and loaded at run-time.
//!
//!
//! ### Overriding key bindings
//!
//! ```no_run
//! use rucline::Outcome::Accepted;
//! use rucline::actions::{Action, Event, KeyBindings, KeyCode, Range};
//! use rucline::prompt::{Builder, Prompt};
//!
//! let mut bindings = KeyBindings::new();
//!
//! // Accept the full suggestions if `right` is pressed
//! bindings.insert(Event::from(KeyCode::Right), Action::Complete(Range::Line));
//!
//! if let Ok(Accepted(string)) = Prompt::from("What's you favorite website? ")
//! // Add some likely values as completions
//! .completer(vec![
//! "https://www.rust-lang.org/",
//! "https://docs.rs/",
//! "https://crates.io/",
//! ])
//! // Set the new key bindings as an override
//! .overrider(bindings)
//! //Block until value is ready
//! .read_line()
//! {
//! println!("'{}' seems to be your favorite website", string);
//! }
//! ```
//!
//! [`actions`]: actions/enum.Action.html
//! [`Action`]: actions/index.html#default-behavior
//! [`events`]: actions/type.Event.html
pub use Buffer;
pub use Outcome;
pub use crossterm;
/// Alias to `crossterm::ErrorKind` from [`crossterm`](https://docs.rs/crossterm/).
pub use ErrorKind as Error;