feat(shell): add support for integration with NuShell

This commit is contained in:
Alexandre Pasmantier 2025-03-19 22:18:47 +01:00 committed by Alexandre Pasmantier
parent d3bb3b0a56
commit d2f5341f78
4 changed files with 49 additions and 0 deletions

View File

@ -86,3 +86,7 @@ source_command = "sed '1!G;h;$!d' ${HISTFILE:-${HOME}/.bash_history}"
[[cable_channel]]
name = "fish-history"
source_command = "fish -c 'history'"
[[cable_channel]]
name = "nu-history"
source_command = "nu -c 'history'"

View File

@ -158,6 +158,7 @@ pub enum Shell {
Fish,
PowerShell,
Cmd,
Nu,
}
#[allow(clippy::unnecessary_wraps)]

View File

@ -11,6 +11,7 @@ pub enum Shell {
Fish,
PowerShell,
Cmd,
Nu,
}
impl Default for Shell {
@ -77,6 +78,7 @@ impl From<CliShell> for Shell {
CliShell::Fish => Shell::Fish,
CliShell::PowerShell => Shell::PowerShell,
CliShell::Cmd => Shell::Cmd,
CliShell::Nu => Shell::Nu,
}
}
}
@ -89,6 +91,7 @@ impl From<&CliShell> for Shell {
CliShell::Fish => Shell::Fish,
CliShell::PowerShell => Shell::PowerShell,
CliShell::Cmd => Shell::Cmd,
CliShell::Nu => Shell::Nu,
}
}
}
@ -96,6 +99,7 @@ impl From<&CliShell> for Shell {
const COMPLETION_ZSH: &str = include_str!("shell/completion.zsh");
const COMPLETION_BASH: &str = include_str!("shell/completion.bash");
const COMPLETION_FISH: &str = include_str!("shell/completion.fish");
const COMPLETION_NU: &str = include_str!("shell/completion.nu");
// create the appropriate key binding for each supported shell
pub fn ctrl_keybinding(shell: Shell, character: char) -> Result<String> {
@ -103,6 +107,7 @@ pub fn ctrl_keybinding(shell: Shell, character: char) -> Result<String> {
Shell::Bash => Ok(format!(r"\C-{character}")),
Shell::Zsh => Ok(format!(r"^{character}")),
Shell::Fish => Ok(format!(r"\c{character}")),
Shell::Nu => Ok(format!(r"Ctrl-{character}")),
_ => anyhow::bail!("This shell is not yet supported: {:?}", shell),
}
}
@ -112,6 +117,7 @@ pub fn completion_script(shell: Shell) -> Result<&'static str> {
Shell::Bash => Ok(COMPLETION_BASH),
Shell::Zsh => Ok(COMPLETION_ZSH),
Shell::Fish => Ok(COMPLETION_FISH),
Shell::Nu => Ok(COMPLETION_NU),
_ => anyhow::bail!("This shell is not yet supported: {:?}", shell),
}
}
@ -177,4 +183,13 @@ mod tests {
let result = ctrl_keybinding(shell, character);
assert!(result.is_err());
}
#[test]
fn test_nushell_ctrl_keybinding() {
let character = 's';
let shell = Shell::Nu;
let result = ctrl_keybinding(shell, character);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "Ctrl-s");
}
}

View File

@ -0,0 +1,29 @@
def tv_smart_autocomplete [] {
let current_prompt = $env.PROMPT # Fetch the current prompt input
let output = (tv --autocomplete-prompt $current_prompt | str trim)
if ($output | str length) > 0 {
let needs_space = not ($current_prompt | str ends-with " ")
let new_prompt = if $needs_space { $"($current_prompt) " + $output } else { $current_prompt + $output }
# Update the line editor with the new prompt
$env.PROMPT = $new_prompt
}
}
def tv_shell_history [] {
let current_prompt = $env.PROMPT
let output = (tv nu-history --input $current_prompt | str trim)
if ($output | str length) > 0 {
$env.PROMPT = $output
}
}
# Bind custom keybindings
$env.config = ($env.config | upsert keybindings [
{ name: "tv_completion", modifier: none, keycode: "{tv_smart_autocomplete_keybinding}", mode: "vi_normal", action: { send: "tv_smart_autocomplete" } }
{ name: "tv_history", modifier: none, keycode: "{tv_shell_history_keybinding}", mode: "vi_normal", action: { send: "tv_shell_history" } }
])