diff options
Diffstat (limited to 'src/command/init.rs')
| -rw-r--r-- | src/command/init.rs | 104 |
1 files changed, 84 insertions, 20 deletions
diff --git a/src/command/init.rs b/src/command/init.rs index 7faff036..585a8281 100644 --- a/src/command/init.rs +++ b/src/command/init.rs @@ -1,7 +1,20 @@ -use clap::Parser; +use clap::{Parser, ValueEnum}; #[derive(Parser)] -pub enum Cmd { +pub struct Cmd { + shell: Shell, + + /// Disable the binding of CTRL-R to atuin + #[clap(long)] + disable_ctrl_r: bool, + + /// Disable the binding of the Up Arrow key to atuin + #[clap(long)] + disable_up_arrow: bool, +} + +#[derive(Clone, Copy, ValueEnum)] +pub enum Shell { /// Zsh setup Zsh, /// Bash setup @@ -10,27 +23,78 @@ pub enum Cmd { Fish, } -fn init_zsh() { - let full = include_str!("../shell/atuin.zsh"); - println!("{full}"); -} +impl Cmd { + fn init_zsh(&self) { + let base = include_str!("../shell/atuin.zsh"); -fn init_bash() { - let full = include_str!("../shell/atuin.bash"); - println!("{full}"); -} + println!("{base}"); -fn init_fish() { - let full = include_str!("../shell/atuin.fish"); - println!("{full}"); -} + if std::env::var("ATUIN_NOBIND").is_err() { + const BIND_CTRL_R: &str = "bindkey '^r' _atuin_search_widget"; + const BIND_UP_ARROW: &str = "bindkey '^[[A' _atuin_up_search_widget +bindkey '^[OA' _atuin_up_search_widget"; + if !self.disable_ctrl_r { + println!("{BIND_CTRL_R}"); + } + if !self.disable_up_arrow { + println!("{BIND_UP_ARROW}"); + } + } + } -impl Cmd { - pub fn run(&self) { - match self { - Self::Zsh => init_zsh(), - Self::Bash => init_bash(), - Self::Fish => init_fish(), + fn init_bash(&self) { + let base = include_str!("../shell/atuin.bash"); + println!("{base}"); + + if std::env::var("ATUIN_NOBIND").is_err() { + const BIND_CTRL_R: &str = r#"bind -x '"\C-r": __atuin_history'"#; + const BIND_UP_ARROW: &str = r#"bind -x '"\e[A": __atuin_history --shell-up-key-binding' +bind -x '"\eOA": __atuin_history --shell-up-key-binding'"#; + if !self.disable_ctrl_r { + println!("{BIND_CTRL_R}"); + } + if !self.disable_up_arrow { + println!("{BIND_UP_ARROW}"); + } + } + } + + fn init_fish(&self) { + let full = include_str!("../shell/atuin.fish"); + println!("{full}"); + + if std::env::var("ATUIN_NOBIND").is_err() { + const BIND_CTRL_R: &str = r"bind \cr _atuin_search"; + const BIND_UP_ARROW: &str = r"bind -k up _atuin_bind_up +bind \eOA _atuin_bind_up +bind \e\[A _atuin_bind_up"; + const BIND_CTRL_R_INS: &str = r"bind -M insert \cr _atuin_search"; + const BIND_UP_ARROW_INS: &str = r"bind -M insert -k up _atuin_bind_up +bind -M insert \eOA _atuin_bind_up +bind -M insert \e\[A _atuin_bind_up"; + + if !self.disable_ctrl_r { + println!("{BIND_CTRL_R}"); + } + if !self.disable_up_arrow { + println!("{BIND_UP_ARROW}"); + } + + println!("if bind -M insert > /dev/null 2>&1"); + if !self.disable_ctrl_r { + println!("{BIND_CTRL_R_INS}"); + } + if !self.disable_up_arrow { + println!("{BIND_UP_ARROW_INS}"); + } + println!("end"); + } + } + pub fn run(self) { + match self.shell { + Shell::Zsh => self.init_zsh(), + Shell::Bash => self.init_bash(), + Shell::Fish => self.init_fish(), } } } |
