From 36cbfcaafcb8a3b1c47650439531a35c99b203ea Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Sun, 24 May 2026 09:47:29 +0200 Subject: terminal prompt from ps1 module now --- src/lib.rs | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index 6ecbe83..c2b4a4a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,6 +45,7 @@ use crate::ctrlc::CtrlC; use crate::history::HistoryEntry; use crate::line::Line; use crate::parse::{Block, ExpString, Parse, PostExpansion}; +use crate::ps1::Prompt; macro_rules! print { ($($x:tt)*) => {{ @@ -112,24 +113,26 @@ pub struct Session { ascii_keybinds: HashMap>, debug_keystrokes: bool, - loud: bool, /// n before end of history.len() /// 0 == not checking history history_visit: usize, highlighter: syntax_highlighting::Highlighter, + prompt: Prompt, } impl Session { pub fn new_noninteractive() -> Self { + let mut vars = run::Vars::default(); + let prompt = Prompt::new(&mut vars); + Self { raw: None, line: Line::new(), history: Vec::new(), prev_path: b".".into(), builtins: HashMap::new(), - vars: run::Vars::default(), funs: HashMap::new(), aliases: run::Aliases::new(), socket_running: None, @@ -138,9 +141,10 @@ impl Session { ti_keybinds: HashMap::new(), ascii_keybinds: HashMap::new(), debug_keystrokes: false, - loud: false, history_visit: 0, highlighter: syntax_highlighting::Highlighter::new(), + prompt, + vars, } } } @@ -183,17 +187,14 @@ fn pretty_cwd() -> BString { } impl Session { - fn prompt(_this: Arc>) -> BString { - todo!("replace with ps1 module"); - } - fn prompt_clear(&mut self) { self.line.clear_prompt().unwrap(); self.history_visit = 0; } fn reprint_prompt(this: Arc>) { - io::stdout().write_all(&Self::prompt(this.clone())).unwrap(); + let prompt = this.lock().unwrap().prompt.prompt().to_vec(); + io::stdout().write_all(&prompt).unwrap(); let mut this = this.lock().unwrap(); this.line.display_pre(); this.line.display_post(b""); @@ -271,6 +272,23 @@ impl Session { } } + fn reevaluate_prompt_inner(&mut self) -> bool { + if self.prompt.requires_update(&self.vars) { + self.prompt.load_prompt(&mut self.vars); + true + } else { + false + } + } + + fn reevaluate_prompt(se: Arc>) { + if se.lock().unwrap().reevaluate_prompt_inner() { + let mut prompt = se.lock().unwrap().prompt.clone(); + prompt.eval_prompt(se.clone()); + se.lock().unwrap().prompt = prompt; + } + } + fn try_submit_command(session: Arc>) { let mut se = session.lock().unwrap(); let line = se.line.into_bytes(); @@ -291,7 +309,14 @@ impl Session { se.history_visit = 0; se.line.dump(); drop(se); - run::run(session.clone(), parsed); + + let status_string = run::run(session.clone(), parsed); + if !status_string.is_empty() { + println!("{status_string}"); + } + Self::reevaluate_prompt(session.clone()); + Self::reprint_prompt(session); + let _ = std::io::stdout().lock().flush(); } } @@ -371,7 +396,8 @@ pub fn event_loop() { let session = Arc::new(Mutex::new(se)); exec_rc_file(session.clone()); - session.lock().unwrap().loud = true; + Session::reevaluate_prompt(session.clone()); + Session::reprint_prompt(session.clone()); completion::populate_path_cache(session.clone()); -- cgit v1.2.3