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
94
95
96
97
98
99
use crate::{Prompt, PromptEditMode, PromptHistorySearch, PromptHistorySearchStatus, PromptViMode};
use {
chrono::Local,
std::{borrow::Cow, env},
};
pub static DEFAULT_PROMPT_INDICATOR: &str = "〉";
pub static DEFAULT_VI_INSERT_PROMPT_INDICATOR: &str = ": ";
pub static DEFAULT_VI_NORMAL_PROMPT_INDICATOR: &str = "〉";
pub static DEFAULT_MULTILINE_INDICATOR: &str = "::: ";
#[derive(Clone)]
pub struct DefaultPrompt;
impl Prompt for DefaultPrompt {
fn render_prompt_left(&self) -> Cow<str> {
{
let left_prompt = get_working_dir().unwrap_or_else(|_| String::from("no path"));
Cow::Owned(left_prompt)
}
}
fn render_prompt_right(&self) -> Cow<str> {
{
Cow::Owned(get_now())
}
}
fn render_prompt_indicator(&self, edit_mode: PromptEditMode) -> Cow<str> {
match edit_mode {
PromptEditMode::Default | PromptEditMode::Emacs => DEFAULT_PROMPT_INDICATOR.into(),
PromptEditMode::Vi(vi_mode) => match vi_mode {
PromptViMode::Normal => DEFAULT_VI_NORMAL_PROMPT_INDICATOR.into(),
PromptViMode::Insert => DEFAULT_VI_INSERT_PROMPT_INDICATOR.into(),
},
PromptEditMode::Custom(str) => format!("({})", str).into(),
}
}
fn render_prompt_multiline_indicator(&self) -> Cow<str> {
Cow::Borrowed(DEFAULT_MULTILINE_INDICATOR)
}
fn render_prompt_history_search_indicator(
&self,
history_search: PromptHistorySearch,
) -> Cow<str> {
let prefix = match history_search.status {
PromptHistorySearchStatus::Passing => "",
PromptHistorySearchStatus::Failing => "failing ",
};
Cow::Owned(format!(
"({}reverse-search: {}) ",
prefix, history_search.term
))
}
}
impl Default for DefaultPrompt {
fn default() -> Self {
DefaultPrompt::new()
}
}
impl DefaultPrompt {
pub fn new() -> DefaultPrompt {
DefaultPrompt {}
}
}
fn get_working_dir() -> Result<String, std::io::Error> {
let path = env::current_dir()?;
let path_str = path.display().to_string();
let homedir: String = match env::var("USERPROFILE") {
Ok(win_home) => win_home,
Err(_) => match env::var("HOME") {
Ok(maclin_home) => maclin_home,
Err(_) => path_str.clone(),
},
};
let new_path = if path_str != homedir {
path_str.replace(&homedir, "~")
} else {
path_str
};
Ok(new_path)
}
fn get_now() -> String {
let now = Local::now();
format!("{:>}", now.format("%m/%d/%Y %I:%M:%S %p"))
}