diff --git a/docs/configuration/advanced.md b/docs/configuration/advanced.md index 445c031..3320a44 100644 --- a/docs/configuration/advanced.md +++ b/docs/configuration/advanced.md @@ -30,6 +30,9 @@ uda.taskwarrior-tui.style.report.scrollbar=black uda.taskwarrior-tui.style.report.scrollbar=black uda.taskwarrior-tui.scrollbar.indicator=█ uda.taskwarrior-tui.task-report.next.filter=$(task show report.next.filter) +uda.taskwarrior-tui.task-report.auto-insert-double-quotes-on-add=true +uda.taskwarrior-tui.task-report.auto-insert-double-quotes-on-annotate=true +uda.taskwarrior-tui.task-report.auto-insert-double-quotes-on-log=true ``` The `uda.taskwarrior-tui.task-report.next.filter` variable defines the default view at program startup. Set this to any preconfigured report (`task reports`), or create your own report in taskwarrior and specify its name here. diff --git a/src/app.rs b/src/app.rs index 4ccdaa8..c70a944 100644 --- a/src/app.rs +++ b/src/app.rs @@ -285,11 +285,14 @@ impl TaskwarriorTui { app.filter_history.load()?; app.filter_history.add(app.filter.as_str()); app.command_history.load()?; - app.command.update(r#""""#, 1); app.task_background(); Ok(app) } + pub fn reset_command(&mut self) { + self.command.update("", 0) + } + pub fn get_context(&mut self) -> Result<()> { let output = Command::new("task").arg("_get").arg("rc.context").output()?; self.current_context = String::from_utf8_lossy(&output.stdout).to_string(); @@ -533,7 +536,7 @@ impl TaskwarriorTui { ); } Mode::Tasks(Action::Jump) => { - let position = Self::get_position(&self.command); + let (position, cmd) = (0, ""); Self::draw_command( f, rects[1], @@ -569,6 +572,9 @@ impl TaskwarriorTui { ); } Mode::Tasks(Action::Log) => { + if self.config.uda_auto_insert_double_quotes_on_log && self.command.is_empty() { + self.command.update(r#""""#, 1); + }; let position = Self::get_position(&self.command); if self.show_completion_pane { self.draw_completion_pop_up(f, rects[1], position); @@ -590,11 +596,11 @@ impl TaskwarriorTui { ); } Mode::Tasks(Action::Subprocess) => { - let position = Self::get_position(&self.command); + let (position, cmd) = (0, ""); Self::draw_command( f, rects[1], - self.command.as_str(), + cmd, ( Span::styled("Shell Command", Style::default().add_modifier(Modifier::BOLD)), None, @@ -631,6 +637,9 @@ impl TaskwarriorTui { ); } Mode::Tasks(Action::Annotate) => { + if self.config.uda_auto_insert_double_quotes_on_annotate && self.command.is_empty() { + self.command.update(r#""""#, 1); + }; let position = Self::get_position(&self.command); if self.show_completion_pane { self.draw_completion_pop_up(f, rects[1], position); @@ -657,6 +666,9 @@ impl TaskwarriorTui { ); } Mode::Tasks(Action::Add) => { + if self.config.uda_auto_insert_double_quotes_on_add && self.command.is_empty() { + self.command.update(r#""""#, 1); + }; let position = Self::get_position(&self.command); if self.show_completion_pane { self.draw_completion_pop_up(f, rects[1], position); @@ -2824,7 +2836,7 @@ impl TaskwarriorTui { match self.task_subprocess() { Ok(_) => { self.mode = Mode::Tasks(Action::Report); - self.command.update(r#""""#, 1); + self.reset_command(); self.update(true)?; } Err(e) => { @@ -2834,7 +2846,7 @@ impl TaskwarriorTui { } } Key::Esc => { - self.command.update(r#""""#, 1); + self.reset_command(); self.mode = Mode::Tasks(Action::Report); } _ => handle_movement(&mut self.command, input), @@ -2845,7 +2857,7 @@ impl TaskwarriorTui { self.show_completion_pane = false; self.completion_list.unselect(); } else { - self.command.update(r#""""#, 1); + self.reset_command(); self.history_status = None; self.mode = Mode::Tasks(Action::Report); } @@ -2867,7 +2879,7 @@ impl TaskwarriorTui { Ok(_) => { self.mode = Mode::Tasks(Action::Report); self.command_history.add(self.command.as_str()); - self.command.update(r#""""#, 1); + self.reset_command(); self.history_status = None; self.update(true)?; } @@ -2944,7 +2956,7 @@ impl TaskwarriorTui { self.show_completion_pane = false; self.completion_list.unselect(); } else { - self.command.update(r#""""#, 1); + self.reset_command(); self.mode = Mode::Tasks(Action::Report); self.history_status = None; } @@ -2966,7 +2978,7 @@ impl TaskwarriorTui { Ok(_) => { self.mode = Mode::Tasks(Action::Report); self.command_history.add(self.command.as_str()); - self.command.update(r#""""#, 1); + self.reset_command(); self.history_status = None; self.update(true)?; } @@ -3046,18 +3058,18 @@ impl TaskwarriorTui { match self.task_report_jump() { Ok(_) => { self.mode = Mode::Tasks(Action::Report); - self.command.update(r#""""#, 1); + self.reset_command(); self.update(true)?; } Err(e) => { - self.command.update(r#""""#, 1); + self.reset_command(); self.error = Some(e.to_string()); } } } } Key::Esc => { - self.command.update(r#""""#, 1); + self.reset_command(); self.mode = Mode::Tasks(Action::Report); } _ => handle_movement(&mut self.command, input), @@ -3068,7 +3080,7 @@ impl TaskwarriorTui { self.show_completion_pane = false; self.completion_list.unselect(); } else { - self.command.update(r#""""#, 1); + self.reset_command(); self.history_status = None; self.mode = Mode::Tasks(Action::Report); } @@ -3090,7 +3102,7 @@ impl TaskwarriorTui { Ok(_) => { self.mode = Mode::Tasks(Action::Report); self.command_history.add(self.command.as_str()); - self.command.update(r#""""#, 1); + self.reset_command(); self.history_status = None; self.update(true)?; } @@ -3585,14 +3597,30 @@ mod tests { // setup(); app.mode = Mode::Tasks(Action::Add); app.update_completion_list(); - let input = "\"Wash car\" +test"; + let input = "Wash car"; + for c in input.chars() { + app.handle_input(Key::Char(c)).unwrap(); + } + app.handle_input(Key::Right).unwrap(); + let input = " +test"; for c in input.chars() { app.handle_input(Key::Char(c)).unwrap(); } app.handle_input(Key::Char('\n')).unwrap(); app.mode = Mode::Tasks(Action::Add); + app.update_completion_list(); + + let backend = TestBackend::new(50, 15); + let mut terminal = Terminal::new(backend).unwrap(); + terminal + .draw(|f| { + app.draw(f); + app.draw(f); + }) + .unwrap(); + let input = "Buy groceries"; for c in input.chars() { app.handle_input(Key::Char(c)).unwrap(); @@ -3611,6 +3639,16 @@ mod tests { app.mode = Mode::Tasks(Action::Add); app.update_completion_list(); + + let backend = TestBackend::new(50, 15); + let mut terminal = Terminal::new(backend).unwrap(); + terminal + .draw(|f| { + app.draw(f); + app.draw(f); + }) + .unwrap(); + let input = "Buy groceries"; for c in input.chars() { app.handle_input(Key::Char(c)).unwrap(); diff --git a/src/config.rs b/src/config.rs index f86eff2..4b524e0 100644 --- a/src/config.rs +++ b/src/config.rs @@ -48,6 +48,9 @@ pub struct Config { pub rule_precedence_color: Vec, pub uda_priority_values: Vec, pub uda_tick_rate: u64, + pub uda_auto_insert_double_quotes_on_add: bool, + pub uda_auto_insert_double_quotes_on_annotate: bool, + pub uda_auto_insert_double_quotes_on_log: bool, pub uda_prefill_task_metadata: bool, pub uda_task_detail_prefetch: usize, pub uda_task_report_show_info: bool, @@ -93,6 +96,9 @@ impl Config { let rule_precedence_color = Self::get_rule_precedence_color(data); let uda_priority_values = Self::get_uda_priority_values(data); let uda_tick_rate = Self::get_uda_tick_rate(data); + let uda_auto_insert_double_quotes_on_add = Self::get_uda_auto_insert_double_quotes_on_add(data); + let uda_auto_insert_double_quotes_on_annotate = Self::get_uda_auto_insert_double_quotes_on_annotate(data); + let uda_auto_insert_double_quotes_on_log = Self::get_uda_auto_insert_double_quotes_on_log(data); let uda_prefill_task_metadata = Self::get_uda_prefill_task_metadata(data); let uda_task_detail_prefetch = Self::get_uda_task_detail_prefetch(data); let uda_task_report_show_info = Self::get_uda_task_report_show_info(data); @@ -141,6 +147,9 @@ impl Config { rule_precedence_color, uda_priority_values, uda_tick_rate, + uda_auto_insert_double_quotes_on_add, + uda_auto_insert_double_quotes_on_annotate, + uda_auto_insert_double_quotes_on_log, uda_prefill_task_metadata, uda_task_detail_prefetch, uda_task_report_show_info, @@ -435,6 +444,30 @@ impl Config { .unwrap() } + fn get_uda_auto_insert_double_quotes_on_add(data: &str) -> bool { + Self::get_config("uda.taskwarrior-tui.task-report.auto-insert-double-quotes-on-add", data) + .unwrap_or_default() + .get_bool() + .unwrap_or(true) + } + + fn get_uda_auto_insert_double_quotes_on_annotate(data: &str) -> bool { + Self::get_config( + "uda.taskwarrior-tui.task-report.auto-insert-double-quotes-on-annotate", + data, + ) + .unwrap_or_default() + .get_bool() + .unwrap_or(true) + } + + fn get_uda_auto_insert_double_quotes_on_log(data: &str) -> bool { + Self::get_config("uda.taskwarrior-tui.task-report.auto-insert-double-quotes-on-log", data) + .unwrap_or_default() + .get_bool() + .unwrap_or(true) + } + fn get_uda_prefill_task_metadata(data: &str) -> bool { Self::get_config("uda.taskwarrior-tui.task-report.pre-fill-task-meta-data", data) .unwrap_or_default()