aboutsummaryrefslogtreecommitdiffstats
path: root/src/run/mod.rs
diff options
context:
space:
mode:
authorJonas Maier <>2026-05-03 11:29:42 +0200
committerJonas Maier <>2026-05-03 11:29:42 +0200
commit110b179e3651570f6ede3090e2e8f304dac7024d (patch)
treef8af54954d0845132d5ee3affed167b06fbc853e /src/run/mod.rs
parentd5953e52f0df8ca6727e71fa07f147467a7369c1 (diff)
downloadpish-110b179e3651570f6ede3090e2e8f304dac7024d.tar.gz
keybinds seem to work somewhat
Diffstat (limited to 'src/run/mod.rs')
-rw-r--r--src/run/mod.rs21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/run/mod.rs b/src/run/mod.rs
index a31ff1a..f727b01 100644
--- a/src/run/mod.rs
+++ b/src/run/mod.rs
@@ -202,6 +202,7 @@ impl Executor {
) -> SpawnedCmd {
match cmd {
CommandKind::Builtin(builtin) => {
+ let mut builtin = builtin.clone_box();
builtin.special(self.se.clone(), &args[1..]);
let cloned_session = self.se.clone();
let handle = wait::spawn(move || {
@@ -532,7 +533,7 @@ type BuiltinResult = Result<(), BuiltinError>;
pub trait Builtin: Send + Sync {
fn name(&self) -> &str;
- fn special(&self, session: Arc<Mutex<Session>>, args: &[BString]) {}
+ fn special(&mut self, session: Arc<Mutex<Session>>, args: &[BString]) {}
fn io(
&self,
@@ -543,7 +544,17 @@ pub trait Builtin: Send + Sync {
) -> BuiltinResult;
}
-const BUILTINS: &[&'static dyn Builtin] = &[
+pub trait BuiltinClone : Builtin {
+ fn clone_box(&self) -> Box<dyn Builtin>;
+}
+
+impl<T: 'static + Builtin + Clone> BuiltinClone for T {
+ fn clone_box(&self) -> Box<dyn Builtin> {
+ Box::new(self.clone())
+ }
+}
+
+const BUILTINS: &[&'static dyn BuiltinClone] = &[
&builtin::cd,
&builtin::clear,
#[cfg(debug_assertions)]
@@ -565,12 +576,12 @@ const BUILTINS: &[&'static dyn Builtin] = &[
#[cfg(debug_assertions)]
&builtin::debug,
&builtin::terminfo,
- &builtin::bind,
+ &builtin::bind::new(),
&builtin::exit,
&builtin::ct,
];
-pub fn builtin_map() -> HashMap<BString, &'static dyn Builtin> {
+pub fn builtin_map() -> HashMap<BString, &'static dyn BuiltinClone> {
let mut map = HashMap::new();
for &b in BUILTINS {
map.insert(b.name().as_bytes().to_vec(), b);
@@ -580,7 +591,7 @@ pub fn builtin_map() -> HashMap<BString, &'static dyn Builtin> {
#[derive(Clone)]
pub enum CommandKind {
- Builtin(&'static dyn Builtin),
+ Builtin(&'static dyn BuiltinClone),
Fun(Block),
Path(PathBuf),
}