aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/readline.rs60
1 files changed, 53 insertions, 7 deletions
diff --git a/src/readline.rs b/src/readline.rs
index d8d24ba..aee69c4 100644
--- a/src/readline.rs
+++ b/src/readline.rs
@@ -104,20 +104,60 @@ impl ReadlineState {
self.buffer.insert(self.cursor, c);
self.cursor += 1;
}
- crossterm::KeyEvent::Ctrl(c) => {
- if c == 'd' {
- if self.buffer.is_empty() {
- self.echo_char('\n').context(WriteToTerminal)?;
- ensure!(false, EOF);
+ crossterm::KeyEvent::Ctrl(c) => match c {
+ 'a' => {
+ if self.cursor != 0 {
+ self.echo(
+ &format!("\x1b[{}D", self.cursor).into_bytes(),
+ )
+ .context(WriteToTerminal)?;
+ self.cursor = 0;
}
}
- if c == 'c' {
+ 'c' => {
self.buffer = String::new();
self.cursor = 0;
self.echo_char('\n').context(WriteToTerminal)?;
self.prompt().context(WriteToTerminal)?;
}
- }
+ 'd' => {
+ if self.buffer.is_empty() {
+ self.echo_char('\n').context(WriteToTerminal)?;
+ ensure!(false, EOF);
+ }
+ }
+ 'e' => {
+ if self.cursor != self.buffer.len() {
+ self.echo(
+ &format!(
+ "\x1b[{}C",
+ self.buffer.len() - self.cursor
+ )
+ .into_bytes(),
+ )
+ .context(WriteToTerminal)?;
+ self.cursor = self.buffer.len();
+ }
+ }
+ 'u' => {
+ if self.cursor != 0 {
+ self.echo(
+ std::iter::repeat(b'\x08')
+ .take(self.cursor)
+ .chain(
+ format!("\x1b[{}P", self.cursor)
+ .into_bytes(),
+ )
+ .collect::<Vec<_>>()
+ .as_ref(),
+ )
+ .context(WriteToTerminal)?;
+ self.buffer = self.buffer.split_off(self.cursor);
+ self.cursor = 0;
+ }
+ }
+ _ => {}
+ },
crossterm::KeyEvent::Backspace => {
if self.cursor != 0 {
self.cursor -= 1;
@@ -141,6 +181,12 @@ impl ReadlineState {
self.write(b"\x1b[C").context(WriteToTerminal)?;
}
}
+ crossterm::KeyEvent::Delete => {
+ if self.cursor != self.buffer.len() {
+ self.buffer.remove(self.cursor);
+ self.echo(b"\x1b[P").context(WriteToTerminal)?;
+ }
+ }
_ => {}
}
return Ok(futures::Async::NotReady);