From 45a1c7c75d6216f99c28dffde4e16869ecc2b16d Mon Sep 17 00:00:00 2001 From: pagedmov Date: Wed, 25 Feb 2026 01:56:24 -0500 Subject: [PATCH] Added job count prompt escape code, '\j' --- src/expand.rs | 8 ++++++-- src/main.rs | 1 + src/prompt/readline/mod.rs | 5 +++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/expand.rs b/src/expand.rs index 5391d8e..04605a2 100644 --- a/src/expand.rs +++ b/src/expand.rs @@ -12,7 +12,7 @@ use crate::parse::{Redir, RedirType}; use crate::procio::{IoBuf, IoFrame, IoMode, IoStack}; use crate::prompt::readline::markers; use crate::state::{ - LogTab, VarFlags, read_logic, read_vars, write_jobs, write_meta, write_vars, + LogTab, VarFlags, read_jobs, read_logic, read_vars, write_jobs, write_meta, write_vars }; use crate::{jobs, prelude::*}; @@ -1809,6 +1809,7 @@ fn tokenize_prompt(raw: &str) -> Vec { 'n' => tokens.push(PromptTk::Text("\n".into())), 'r' => tokens.push(PromptTk::Text("\r".into())), 't' => tokens.push(PromptTk::RuntimeMillis), + 'j' => tokens.push(PromptTk::JobCount), 'T' => tokens.push(PromptTk::RuntimeFormatted), '\\' => tokens.push(PromptTk::Text("\\".into())), '"' => tokens.push(PromptTk::Text("\"".into())), @@ -2004,7 +2005,10 @@ pub fn expand_prompt(raw: &str) -> ShResult { PromptTk::ExitCode => todo!(), PromptTk::SuccessSymbol => todo!(), PromptTk::FailureSymbol => todo!(), - PromptTk::JobCount => todo!(), + PromptTk::JobCount => { + let count = read_jobs(|j| j.jobs().iter().filter(|j| j.as_ref().is_some_and(|j| j.get_stats().iter().all(|st| matches!(st, WtStat::StillAlive)))).count()); + result.push_str(&count.to_string()); + } PromptTk::Function(f) => { log::debug!("Expanding prompt function: {f}"); let output = expand_cmd_sub(&f)?; diff --git a/src/main.rs b/src/main.rs index 40d8bed..6b6a235 100644 --- a/src/main.rs +++ b/src/main.rs @@ -192,6 +192,7 @@ fn shed_interactive() -> ShResult<()> { } } + readline.update_prompt(get_prompt().unwrap_or_default()); readline.print_line(false)?; // Poll for stdin input diff --git a/src/prompt/readline/mod.rs b/src/prompt/readline/mod.rs index 8636643..f70a303 100644 --- a/src/prompt/readline/mod.rs +++ b/src/prompt/readline/mod.rs @@ -199,6 +199,11 @@ impl ShedVi { self.history.reset(); } + pub fn update_prompt(&mut self, prompt: String) { + self.prompt = prompt; + self.needs_redraw = true; + } + fn should_submit(&mut self) -> ShResult { let input = Arc::new(self.editor.buffer.clone()); self.editor.calc_indent_level();