added move left&right, delete char
This commit is contained in:
parent
ed03ec92a8
commit
7d58378374
5 changed files with 49 additions and 32 deletions
|
@ -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.
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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,
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue