Skip to main content

steer_tui/tui/handlers/
bash.rs

1use 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        // Check for Ctrl+C/Ctrl+D
9        if matches!(key.code, KeyCode::Char('c' | 'd'))
10            && key.modifiers.contains(KeyModifiers::CONTROL)
11        {
12            if self.is_processing {
13                // Cancel processing
14                self.client.cancel_operation().await?;
15            } else {
16                // Cancel bash mode and return to normal without clearing text
17                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        // Check for Esc
26        if key.code == KeyCode::Esc {
27            // Return to normal mode without clearing text
28            self.input_mode = self.default_input_mode();
29            self.input_panel_state
30                .textarea
31                .set_placeholder_text("Type your message here...");
32        // Check for Alt+Left/Right for word navigation
33        } 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                    // Convert KeyEvent to Input and let the panel state handle it
47                    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            // Insert a newline for various key combinations
58            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            // Execute the bash command
65            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(); // Clear after executing
69                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            // Convert KeyEvent to Input and let the panel state handle it
76            let input = tui_textarea::Input::from(key);
77            self.input_panel_state.handle_input(input);
78        }
79        Ok(false)
80    }
81}