steer_tui/tui/handlers/
bash.rs1use crate::error::Result;
2use crate::tui::Tui;
3use ratatui::crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
4use tui_textarea::CursorMove;
5
6impl Tui {
7 pub async fn handle_bash_mode(&mut self, key: KeyEvent) -> Result<bool> {
8 if matches!(key.code, KeyCode::Char('c' | 'd'))
10 && key.modifiers.contains(KeyModifiers::CONTROL)
11 {
12 if self.is_processing {
13 self.client.cancel_operation().await?;
15 } else {
16 self.input_mode = self.default_input_mode();
18 self.input_panel_state
19 .textarea
20 .set_placeholder_text("Type your message here...");
21 }
22 return Ok(false);
23 }
24
25 if key.code == KeyCode::Esc {
27 self.input_mode = self.default_input_mode();
29 self.input_panel_state
30 .textarea
31 .set_placeholder_text("Type your message here...");
32 } else if key.modifiers == KeyModifiers::ALT {
34 match key.code {
35 KeyCode::Left => {
36 self.input_panel_state
37 .textarea
38 .move_cursor(CursorMove::WordBack);
39 }
40 KeyCode::Right => {
41 self.input_panel_state
42 .textarea
43 .move_cursor(CursorMove::WordForward);
44 }
45 _ => {
46 let input = tui_textarea::Input::from(key);
48 self.input_panel_state.handle_input(input);
49 }
50 }
51 } else if (key.code == KeyCode::Enter
52 && (key.modifiers == KeyModifiers::SHIFT
53 || key.modifiers == KeyModifiers::ALT
54 || key.modifiers == KeyModifiers::CONTROL))
55 || (key.code == KeyCode::Char('j') && key.modifiers == KeyModifiers::CONTROL)
56 {
57 let input = tui_textarea::Input::from(KeyEvent::new(
59 KeyCode::Char('\n'),
60 KeyModifiers::empty(),
61 ));
62 self.input_panel_state.handle_input(input);
63 } else if key.code == KeyCode::Enter {
64 let command = self.input_panel_state.content();
66 if !command.trim().is_empty() {
67 self.client.execute_bash_command(command).await?;
68 self.input_panel_state.clear(); self.input_mode = self.default_input_mode();
70 self.input_panel_state
71 .textarea
72 .set_placeholder_text("Type your message here...");
73 }
74 } else {
75 let input = tui_textarea::Input::from(key);
77 self.input_panel_state.handle_input(input);
78 }
79 Ok(false)
80 }
81}