Added special case for exit code 130, and fixed colours disappearing in vicmd mode

This commit is contained in:
Jamie Quigley 2022-01-12 01:17:00 +00:00
parent f505324dac
commit c43f95131d
No known key found for this signature in database
GPG Key ID: 8E8FF66E2AE8D970
2 changed files with 106 additions and 23 deletions

View File

@ -10,12 +10,15 @@ use serde::{Deserialize, Serialize};
pub struct CharacterConfig<'a> {
pub format: &'a str,
pub success_symbol: &'a str,
pub cancel_symbol: &'a str,
pub error_symbol: &'a str,
#[serde(alias = "vicmd_symbol")]
pub vimcmd_symbol: &'a str,
pub vimcmd_success_symbol: &'a str,
pub vimcmd_visual_symbol: &'a str,
pub vimcmd_replace_symbol: &'a str,
pub vimcmd_replace_one_symbol: &'a str,
pub vimcmd_cancel_symbol: &'a str,
pub vimcmd_error_symbol: &'a str,
pub disabled: bool,
}
@ -24,11 +27,14 @@ impl<'a> Default for CharacterConfig<'a> {
CharacterConfig {
format: "$symbol ",
success_symbol: "[](bold green)",
cancel_symbol: "[](bold yellow)",
error_symbol: "[](bold red)",
vimcmd_symbol: "[](bold green)",
vimcmd_visual_symbol: "[](bold yellow)",
vimcmd_replace_symbol: "[](bold purple)",
vimcmd_replace_one_symbol: "[](bold purple)",
vimcmd_success_symbol: "[](bold green)",
vimcmd_cancel_symbol: "[](bold yellow)",
vimcmd_error_symbol: "[](bold red)",
disabled: false,
}
}

View File

@ -28,6 +28,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
let exit_code = props.status_code.as_deref().unwrap_or("0");
let keymap = props.keymap.as_str();
let exit_success = exit_code == "0";
let exit_cancel = exit_code == "130";
// Match shell "keymap" names to normalized vi modes
// NOTE: in vi mode, fish reports normal mode as "default".
@ -36,7 +37,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
// The result: in non-vi fish, keymap is always reported as "insert"
let mode = match (&context.shell, keymap) {
(Shell::Fish, "default")
| (Shell::Zsh, "vicmd")
| (Shell::Zsh, "vimcmd")
| (Shell::Cmd | Shell::PowerShell | Shell::Pwsh, "vi") => ShellEditMode::Normal,
(Shell::Fish, "visual") => ShellEditMode::Visual,
(Shell::Fish, "replace") => ShellEditMode::Replace,
@ -45,13 +46,23 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
};
let symbol = match mode {
ShellEditMode::Normal => config.vimcmd_symbol,
ShellEditMode::Visual => config.vimcmd_visual_symbol,
ShellEditMode::Replace => config.vimcmd_replace_symbol,
ShellEditMode::ReplaceOne => config.vimcmd_replace_one_symbol,
ShellEditMode::Normal => {
if exit_success {
config.vimcmd_success_symbol
} else if exit_cancel {
config.vimcmd_cancel_symbol
} else {
config.vimcmd_error_symbol
}
}
ShellEditMode::Insert => {
if exit_success {
config.success_symbol
} else if exit_cancel {
config.cancel_symbol
} else {
config.error_symbol
}
@ -97,6 +108,14 @@ mod test {
assert_eq!(expected, actual);
}
#[test]
fn cancel_status() {
let expected = Some(format!("{} ", Color::Yellow.bold().paint("")));
let actual = ModuleRenderer::new("character").status(130).collect();
assert_eq!(expected, actual);
}
#[test]
fn failure_status() {
let expected = Some(format!("{} ", Color::Red.bold().paint("")));
@ -112,6 +131,7 @@ mod test {
#[test]
fn custom_symbol() {
let expected_fail = Some(format!("{} ", Color::Red.bold().paint("")));
let expected_cancel = Some(format!("{} ", Color::Yellow.bold().paint("")));
let expected_success = Some(format!("{} ", Color::Green.bold().paint("")));
let exit_values = [1, 54321, -5000];
@ -129,6 +149,17 @@ mod test {
assert_eq!(expected_fail, actual);
}
let actual = ModuleRenderer::new("character")
.config(toml::toml! {
[character]
success_symbol = "[➜](bold green)"
cancel_symbol = "[➜](bold yellow)"
error_symbol = "[✖](bold red)"
})
.status(130)
.collect();
assert_eq!(expected_cancel, actual);
// Test success
let actual = ModuleRenderer::new("character")
.config(toml::toml! {
@ -143,25 +174,47 @@ mod test {
#[test]
fn zsh_keymap() {
let expected_vicmd = Some(format!("{} ", Color::Green.bold().paint("")));
let expected_vimcmd_success = Some(format!("{} ", Color::Green.bold().paint("")));
let expected_vimcmd_cancel = Some(format!("{} ", Color::Yellow.bold().paint("")));
let expected_vimcmd_error = Some(format!("{} ", Color::Red.bold().paint("")));
let expected_specified = Some(format!("{} ", Color::Green.bold().paint("V")));
let expected_other = Some(format!("{} ", Color::Green.bold().paint("")));
// zle keymap is vicmd
// zle keymap is vimcmd
let actual = ModuleRenderer::new("character")
.shell(Shell::Zsh)
.keymap("vicmd")
.keymap("vimcmd")
.collect();
assert_eq!(expected_vicmd, actual);
assert_eq!(expected_vimcmd_success, actual);
// specified vicmd character
// Cancel status
let actual = ModuleRenderer::new("character")
.shell(Shell::Zsh)
.keymap("vimcmd")
.status(130)
.collect();
assert_eq!(expected_vimcmd_cancel, actual);
// Failure status
let exit_values = [1, 54321, -5000];
for status in &exit_values {
let actual = ModuleRenderer::new("character")
.shell(Shell::Zsh)
.keymap("vimcmd")
.status(*status)
.collect();
assert_eq!(expected_vimcmd_error, actual);
}
// specified vimcmd character
let actual = ModuleRenderer::new("character")
.config(toml::toml! {
[character]
vicmd_symbol = "[V](bold green)"
vimcmd_success_symbol = "[V](bold green)"
})
.shell(Shell::Zsh)
.keymap("vicmd")
.keymap("vimcmd")
.collect();
assert_eq!(expected_specified, actual);
@ -175,7 +228,9 @@ mod test {
#[test]
fn fish_keymap() {
let expected_vicmd = Some(format!("{} ", Color::Green.bold().paint("")));
let expected_vimcmd_success = Some(format!("{} ", Color::Green.bold().paint("")));
let expected_vimcmd_cancel = Some(format!("{} ", Color::Yellow.bold().paint("")));
let expected_vimcmd_error = Some(format!("{} ", Color::Red.bold().paint("")));
let expected_specified = Some(format!("{} ", Color::Green.bold().paint("V")));
let expected_visual = Some(format!("{} ", Color::Yellow.bold().paint("")));
let expected_replace = Some(format!("{} ", Color::Purple.bold().paint("")));
@ -187,13 +242,33 @@ mod test {
.shell(Shell::Fish)
.keymap("default")
.collect();
assert_eq!(expected_vicmd, actual);
assert_eq!(expected_vimcmd_success, actual);
// specified vicmd character
// Cancel status
let actual = ModuleRenderer::new("character")
.shell(Shell::Fish)
.keymap("default")
.status(130)
.collect();
assert_eq!(expected_vimcmd_cancel, actual);
// Failure status
let exit_values = [1, 54321, -5000];
for status in &exit_values {
let actual = ModuleRenderer::new("character")
.shell(Shell::Fish)
.keymap("default")
.status(*status)
.collect();
assert_eq!(expected_vimcmd_error, actual);
}
// specified vimcmd character
let actual = ModuleRenderer::new("character")
.config(toml::toml! {
[character]
vicmd_symbol = "[V](bold green)"
vimcmd_success_symbol = "[V](bold green)"
})
.shell(Shell::Fish)
.keymap("default")
@ -231,7 +306,7 @@ mod test {
#[test]
fn cmd_keymap() {
let expected_vicmd = Some(format!("{} ", Color::Green.bold().paint("")));
let expected_vimcmd = Some(format!("{} ", Color::Green.bold().paint("")));
let expected_specified = Some(format!("{} ", Color::Green.bold().paint("V")));
let expected_other = Some(format!("{} ", Color::Green.bold().paint("")));
@ -240,13 +315,15 @@ mod test {
.shell(Shell::Cmd)
.keymap("vi")
.collect();
assert_eq!(expected_vicmd, actual);
assert_eq!(expected_vimcmd, actual);
// specified vicmd character
// specified vimcmd character
let actual = ModuleRenderer::new("character")
.config(toml::toml! {
[character]
vicmd_symbol = "[V](bold green)"
vimcmd_success_symbol = "[V](bold green)"
vimcmd_cancel_symbol = "[V](bold yellow)"
vimcmd_error_symbol = "[V](bold red)"
})
.shell(Shell::Cmd)
.keymap("vi")
@ -263,7 +340,7 @@ mod test {
#[test]
fn powershell_keymap() {
let expected_vicmd = Some(format!("{} ", Color::Green.bold().paint("")));
let expected_vimcmd = Some(format!("{} ", Color::Green.bold().paint("")));
let expected_specified = Some(format!("{} ", Color::Green.bold().paint("V")));
let expected_other = Some(format!("{} ", Color::Green.bold().paint("")));
@ -272,13 +349,13 @@ mod test {
.shell(Shell::PowerShell)
.keymap("vi")
.collect();
assert_eq!(expected_vicmd, actual);
assert_eq!(expected_vimcmd, actual);
// specified vicmd character
// specified vimcmd character
let actual = ModuleRenderer::new("character")
.config(toml::toml! {
[character]
vicmd_symbol = "[V](bold green)"
vimcmd_symbol = "[V](bold green)"
})
.shell(Shell::PowerShell)
.keymap("vi")