blob: 86c04dc2cd01f40bbdaa836aa79a69df3173c5e2 [file] [log] [blame]
//! Customize line editor
use std::default::Default;
/// User preferences
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Config {
/// Maximum number of entries in History.
max_history_size: usize, // history_max_entries
history_duplicates: HistoryDuplicates,
history_ignore_space: bool,
completion_type: CompletionType,
/// When listing completion alternatives, only display
/// one screen of possibilities at a time.
completion_prompt_limit: usize,
/// Duration (milliseconds) Rustyline will wait for a character when
/// reading an ambiguous key sequence.
keyseq_timeout: i32,
/// Emacs or Vi mode
edit_mode: EditMode,
/// If true, each nonblank line returned by `readline` will be
/// automatically added to the history.
auto_add_history: bool,
/// if colors should be enabled.
color_mode: ColorMode,
}
impl Config {
pub fn builder() -> Builder {
Builder::new()
}
/// Tell the maximum length (i.e. number of entries) for the history.
pub fn max_history_size(&self) -> usize {
self.max_history_size
}
/// Tell if lines which match the previous history entry are saved or not
/// in the history list.
///
/// By default, they are ignored.
pub fn history_duplicates(&self) -> HistoryDuplicates {
self.history_duplicates
}
/// Tell if lines which begin with a space character are saved or not in
/// the history list.
///
/// By default, they are saved.
pub fn history_ignore_space(&self) -> bool {
self.history_ignore_space
}
pub fn completion_type(&self) -> CompletionType {
self.completion_type
}
pub fn completion_prompt_limit(&self) -> usize {
self.completion_prompt_limit
}
pub fn keyseq_timeout(&self) -> i32 {
self.keyseq_timeout
}
pub fn edit_mode(&self) -> EditMode {
self.edit_mode
}
/// Tell if lines are automatically added to the history.
///
/// By default, they are not.
pub fn auto_add_history(&self) -> bool {
self.auto_add_history
}
/// Tell if colors should be enabled.
///
/// By default, they are except if stdout is not a tty.
pub fn color_mode(&self) -> ColorMode {
self.color_mode
}
}
impl Default for Config {
fn default() -> Config {
Config {
max_history_size: 100,
history_duplicates: HistoryDuplicates::IgnoreConsecutive,
history_ignore_space: false,
completion_type: CompletionType::Circular, // TODO Validate
completion_prompt_limit: 100,
keyseq_timeout: -1,
edit_mode: EditMode::Emacs,
auto_add_history: false,
color_mode: ColorMode::Enabled,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum HistoryDuplicates {
AlwaysAdd,
/// a line will not be added to the history if it matches the previous entry
IgnoreConsecutive,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CompletionType {
/// Complete the next full match (like in Vim by default)
Circular,
/// Complete till longest match.
/// When more than one match, list all matches
/// (like in Bash/Readline).
List,
}
/// Style of editing / Standard keymaps
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum EditMode {
Emacs,
Vi,
}
/// Colorization mode
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ColorMode {
Enabled,
Forced,
Disabled,
}
/// Configuration builder
#[derive(Debug, Default)]
pub struct Builder {
p: Config,
}
impl Builder {
pub fn new() -> Builder {
Builder {
p: Config::default(),
}
}
/// Set the maximum length for the history.
pub fn max_history_size(mut self, max_size: usize) -> Builder {
self.p.max_history_size = max_size;
self
}
/// Tell if lines which match the previous history entry are saved or not
/// in the history list.
///
/// By default, they are ignored.
pub fn history_ignore_dups(mut self, yes: bool) -> Builder {
self.p.history_duplicates = if yes {
HistoryDuplicates::IgnoreConsecutive
} else {
HistoryDuplicates::AlwaysAdd
};
self
}
/// Tell if lines which begin with a space character are saved or not in
/// the history list.
///
/// By default, they are saved.
pub fn history_ignore_space(mut self, yes: bool) -> Builder {
self.p.history_ignore_space = yes;
self
}
/// Set `completion_type`.
pub fn completion_type(mut self, completion_type: CompletionType) -> Builder {
self.p.completion_type = completion_type;
self
}
/// The number of possible completions that determines when the user is
/// asked whether the list of possibilities should be displayed.
pub fn completion_prompt_limit(mut self, completion_prompt_limit: usize) -> Builder {
self.p.completion_prompt_limit = completion_prompt_limit;
self
}
/// Timeout for ambiguous key sequences in milliseconds.
/// Currently, it is used only to distinguish a single ESC from an ESC
/// sequence.
/// After seeing an ESC key, wait at most `keyseq_timeout_ms` for another
/// byte.
pub fn keyseq_timeout(mut self, keyseq_timeout_ms: i32) -> Builder {
self.p.keyseq_timeout = keyseq_timeout_ms;
self
}
/// Choose between Emacs or Vi mode.
pub fn edit_mode(mut self, edit_mode: EditMode) -> Builder {
self.p.edit_mode = edit_mode;
match edit_mode {
EditMode::Emacs => self.p.keyseq_timeout = -1, // no timeout
EditMode::Vi => self.p.keyseq_timeout = 500,
};
self
}
/// Tell if lines are automatically added to the history.
///
/// By default, they are not.
pub fn auto_add_history(mut self, yes: bool) -> Builder {
self.p.auto_add_history = yes;
self
}
/// Forces colorization on or off.
///
/// By default, colorization is on except if stdout is not a tty.
pub fn color_mode(mut self, color_mode: ColorMode) -> Builder {
self.p.color_mode = color_mode;
self
}
pub fn build(self) -> Config {
self.p
}
}