added move left&right, delete char

This commit is contained in:
Jan Hrastnik 2020-10-13 18:57:55 +02:00 committed by Blaž Hrastnik
parent ed03ec92a8
commit 7d58378374
5 changed files with 49 additions and 32 deletions

View file

@ -10,7 +10,7 @@ pub enum Mode {
Normal, Normal,
Insert, Insert,
Goto, Goto,
Prompt, Command,
} }
/// A state represents the current editor state of a single buffer. /// A state represents the current editor state of a single buffer.

View file

@ -237,7 +237,7 @@ impl Editor {
Mode::Insert => "INS", Mode::Insert => "INS",
Mode::Normal => "NOR", Mode::Normal => "NOR",
Mode::Goto => "GOTO", Mode::Goto => "GOTO",
Mode::Prompt => "PRO", // prompt? Mode::Command => "COM", // command?
}; };
// statusline // statusline
self.surface.set_style( self.surface.set_style(
@ -249,14 +249,17 @@ impl Editor {
} }
pub fn render_prompt(&mut self, text_color: Style) { pub fn render_prompt(&mut self, text_color: Style) {
// TODO: maybe name this render_commandline
use tui::backend::Backend; use tui::backend::Backend;
let view = self.view.as_ref().unwrap(); let view = self.view.as_ref().unwrap();
// render buffer text // render buffer text
let buffer_string; let buffer_string;
if view.state.mode == Mode::Prompt { if view.state.mode == Mode::Command {
buffer_string = &self.prompt.buffer; buffer_string = &self.prompt.buffer;
self.surface self.surface
.set_string(1, self.size.1 - 1, buffer_string, text_color); .set_string(1, self.size.1 - 1, String::from(":"), text_color);
self.surface
.set_string(2, self.size.1 - 1, buffer_string, text_color);
} else { } else {
buffer_string = &String::from(""); buffer_string = &String::from("");
} }
@ -277,8 +280,8 @@ impl Editor {
Mode::Insert => write!(stdout, "\x1B[6 q"), Mode::Insert => write!(stdout, "\x1B[6 q"),
mode => write!(stdout, "\x1B[2 q"), mode => write!(stdout, "\x1B[2 q"),
}; };
if view.state.mode() == Mode::Prompt { if view.state.mode() == Mode::Command {
pos = Position::new(self.size.0 as usize, 1 + self.prompt.buffer.len()); pos = Position::new(self.size.0 as usize, 2 + self.prompt.cursor_loc);
} else { } else {
if let Some(path) = view.state.path() { if let Some(path) = view.state.path() {
self.surface self.surface
@ -346,8 +349,8 @@ impl Editor {
} }
view.ensure_cursor_in_view(); view.ensure_cursor_in_view();
} }
Mode::Prompt => { Mode::Command => {
self.prompt.handle_keyevent(event, view); self.prompt.handle_input(event, view);
} }
mode => { mode => {
if let Some(command) = keymap[&mode].get(&keys) { if let Some(command) = keymap[&mode].get(&keys) {

View file

@ -307,20 +307,8 @@ pub fn append_mode(view: &mut View, _count: usize) {
}) })
} }
pub fn prompt_mode(view: &mut View, _count: usize) { pub fn command_mode(view: &mut View, _count: usize) {
view.state.mode = Mode::Prompt; view.state.mode = Mode::Command;
}
pub fn move_char_left_prompt(prompt: &mut Prompt, _char: char) {
if prompt.cursor_loc > 1 {
prompt.cursor_loc -= 1;
}
}
pub fn move_char_right_prompt(prompt: &mut Prompt, _char: char) {
if prompt.cursor_loc < prompt.buffer.len() {
prompt.cursor_loc += 1;
}
} }
// TODO: I, A, o and O can share a lot of the primitives. // TODO: I, A, o and O can share a lot of the primitives.

View file

@ -163,7 +163,7 @@ pub fn default() -> Keymaps {
vec![key!('p')] => commands::paste, vec![key!('p')] => commands::paste,
vec![key!('>')] => commands::indent, vec![key!('>')] => commands::indent,
vec![key!('<')] => commands::unindent, vec![key!('<')] => commands::unindent,
vec![key!(':')] => commands::prompt_mode, vec![key!(':')] => commands::command_mode,
vec![Key { vec![Key {
code: KeyCode::Esc, code: KeyCode::Esc,
modifiers: Modifiers::NONE modifiers: Modifiers::NONE
@ -209,11 +209,5 @@ pub fn default() -> Keymaps {
vec![key!('g')] => commands::move_file_start as Command, vec![key!('g')] => commands::move_file_start as Command,
vec![key!('e')] => commands::move_file_end as Command, vec![key!('e')] => commands::move_file_end as Command,
), ),
state::Mode::Prompt => hashmap!(
vec![Key {
code: KeyCode::Esc,
modifiers: Modifiers::NONE
}] => commands::normal_mode as Command,
)
) )
} }

View file

@ -11,17 +11,37 @@ pub struct Prompt {
impl Prompt { impl Prompt {
pub fn new() -> Prompt { pub fn new() -> Prompt {
let prompt = Prompt { let prompt = Prompt {
buffer: String::from(":"), // starting prompt symbol buffer: String::from(""),
cursor_loc: 0, cursor_loc: 0,
}; };
prompt prompt
} }
pub fn insert_char(&mut self, c: char) { pub fn insert_char(&mut self, c: char) {
self.buffer.push(c); self.buffer.insert(self.cursor_loc, c);
self.cursor_loc += 1;
} }
pub fn handle_keyevent(&mut self, key_event: KeyEvent, view: &mut View) { pub fn move_char_left_prompt(&mut self) {
if self.cursor_loc > 1 {
self.cursor_loc -= 1;
}
}
pub fn move_char_right_prompt(&mut self) {
if self.cursor_loc < self.buffer.len() {
self.cursor_loc += 1;
}
}
pub fn delete_char_backwards(&mut self) {
if self.cursor_loc > 0 {
self.buffer.remove(self.cursor_loc - 1);
self.cursor_loc -= 1;
}
}
pub fn handle_input(&mut self, key_event: KeyEvent, view: &mut View) {
match key_event { match key_event {
KeyEvent { KeyEvent {
code: KeyCode::Char(c), code: KeyCode::Char(c),
@ -30,6 +50,18 @@ impl Prompt {
KeyEvent { KeyEvent {
code: KeyCode::Esc, .. code: KeyCode::Esc, ..
} => commands::normal_mode(view, 1), } => commands::normal_mode(view, 1),
KeyEvent {
code: KeyCode::Right,
..
} => self.move_char_right_prompt(),
KeyEvent {
code: KeyCode::Left,
..
} => self.move_char_left_prompt(),
KeyEvent {
code: KeyCode::Backspace,
..
} => self.delete_char_backwards(),
_ => (), _ => (),
} }
} }