diff --git a/src/components/utilities.rs b/src/components/utilities.rs index dd2e7ef75..59745e63c 100644 --- a/src/components/utilities.rs +++ b/src/components/utilities.rs @@ -814,7 +814,7 @@ impl StatusBar { fn draw_execute_bar(&mut self, grid: &mut CellBuffer, area: Area, context: &mut Context) { clear_area(grid, area, crate::conf::value(context, "theme_default")); - let (x, y) = write_string_to_grid( + let (_, y) = write_string_to_grid( self.ex_buffer.as_str(), grid, Color::Byte(219), @@ -823,7 +823,12 @@ impl StatusBar { area, None, ); - grid[(x, y)].set_attrs(Attr::Underline); + if let Some(ref mut cell) = grid.get_mut( + pos_inc(upper_left!(area), (self.ex_buffer.cursor(), 0)).0, + y, + ) { + cell.set_attrs(Attr::Underline); + } change_colors(grid, area, Color::Byte(219), Color::Byte(88)); context.dirty_areas.push_back(area); } @@ -1154,6 +1159,26 @@ impl Component for StatusBar { self.auto_complete.inc_cursor(); self.dirty = true; } + UIEvent::ExInput(Key::Left) => { + if let Field::Text(ref mut utext, _) = self.ex_buffer { + utext.cursor_dec(); + } else { + unsafe { + std::hint::unreachable_unchecked(); + } + } + self.dirty = true; + } + UIEvent::ExInput(Key::Right) => { + if let Field::Text(ref mut utext, _) = self.ex_buffer { + utext.cursor_inc(); + } else { + unsafe { + std::hint::unreachable_unchecked(); + } + } + self.dirty = true; + } UIEvent::ExInput(Key::Ctrl('p')) => { let pos = self.ex_buffer_cmd_history_pos.map(|p| p + 1).unwrap_or(0); let pos = Some(std::cmp::min(pos, self.cmd_history.len().saturating_sub(1))); diff --git a/src/components/utilities/widgets.rs b/src/components/utilities/widgets.rs index 6e1c857fb..de6bafd65 100644 --- a/src/components/utilities/widgets.rs +++ b/src/components/utilities/widgets.rs @@ -74,6 +74,14 @@ impl Field { } } } + + pub fn cursor(&self) -> usize { + match self { + Text(ref s, _) => s.grapheme_pos(), + Choice(_, ref cursor) => *cursor, + } + } + pub fn is_empty(&self) -> bool { self.as_str().is_empty() }