diff options
| author | Jonas Maier <> | 2026-05-03 09:15:04 +0200 |
|---|---|---|
| committer | Jonas Maier <> | 2026-05-03 09:15:04 +0200 |
| commit | d5953e52f0df8ca6727e71fa07f147467a7369c1 (patch) | |
| tree | cffbb58207d2aa81fc6d765b005b1225914fb268 /src/run/builtin.rs | |
| parent | a9bf864158e67353f57047cdc4d6b0e325d73eae (diff) | |
| download | pish-d5953e52f0df8ca6727e71fa07f147467a7369c1.tar.gz | |
complete keybind overhaul, not working, afraid to loose it
Diffstat (limited to 'src/run/builtin.rs')
| -rw-r--r-- | src/run/builtin.rs | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/run/builtin.rs b/src/run/builtin.rs index f5dff81..507759f 100644 --- a/src/run/builtin.rs +++ b/src/run/builtin.rs @@ -601,3 +601,128 @@ impl Builtin for terminfo { Ok(()) } } + +pub struct bind; +impl Builtin for bind { + fn name(&self) -> &str { + "bind" + } + + fn io( + &self, + session: Arc<Mutex<Session>>, + args: &[BString], + _stdin: &mut dyn Read, + stdout: &mut dyn Write, + ) -> Result { + let mut usage = || { + writeln!( + stdout, + "usage: bind ti NAMED_KEYBIND COMMAND | bind key KEY COMMAND" + )?; + Err(Error::Exit(1)) + }; + + if args.len() < 3 { + return usage(); + } + + let kind = &args[0]; + let key = &args[1]; + let cmd = &args[2]; + let args = &args[3..]; + + let mut se = session.lock().unwrap(); + + let map = match &kind[..] { + b"ti" => &mut se.ti_keybinds, + b"key" => &mut se.ascii_keybinds, + _ => return usage(), + }; + + map.insert( + key.clone(), + crate::parse::Command { + cmd: cmd.clone(), + args: args.to_vec(), + }, + ); + + Ok(()) + } +} + +pub struct exit; +impl Builtin for exit { + fn name(&self) -> &str { + "exit" + } + + fn special(&self, _session: Arc<Mutex<Session>>, args: &[BString]) { + let exit_code: i32 = loop { + let Some(arg) = args.get(0) else { + break 0; + }; + let Ok(arg) = String::from_utf8(arg.clone()) else { + break 1; + }; + let Ok(num) = arg.parse() else { + break 1; + }; + break num; + }; + + std::process::exit(exit_code); + } + + fn io( + &self, + _session: Arc<Mutex<Session>>, + _args: &[BString], + _stdin: &mut dyn Read, + _stdout: &mut dyn Write, + ) -> Result { + Ok(()) + } +} + +/// control terminal +pub struct ct; +impl Builtin for ct { + fn name(&self) -> &str { + "ct" + } + + fn io( + &self, + session: Arc<Mutex<Session>>, + args: &[BString], + _stdin: &mut dyn Read, + _stdout: &mut dyn Write, + ) -> Result { + let Some(arg) = args.get(0) else { + return Err(Error::Exit(-1)); + }; + + let mut se = session.lock().unwrap(); + + match &arg[..] { + b"cursor_begin" => se.move_to_begin(), + b"cursor_end" => se.move_to_end(), + b"cursor_right" => se.cursor_right(), + b"cursor_left" => se.cursor_left(), + b"cursor_right_word" => se.cursor_right_word(), + b"cursor_left_word" => se.cursor_left_word(), + b"prompt_clear" => se.prompt_clear(), + b"complete" => { + drop(se); + Session::complete(session) + } + b"history_previous" => se.history_up(), + b"history_next" => se.history_down(), + _ => return Err(Error::Exit(-2)), + } + + Ok(()) + } +} |
