diff --git a/src/bin/rslack.rs b/src/bin/rslack.rs index ec020f6..30e310f 100644 --- a/src/bin/rslack.rs +++ b/src/bin/rslack.rs @@ -104,7 +104,8 @@ async fn main() { console::print_as_table(&mut stdout, &chunked_data, max_col_size, &channel); if message.trim().is_empty() { - let mut buffer: Vec = Vec::new(); + let mut buffer: Vec> = vec![vec![]]; + let mut cursor_line: usize = 0; write!( stdout, @@ -143,15 +144,19 @@ async fn main() { } } Key::Char('\n') => { - buffer.push('\r'); - buffer.push('\n'); + buffer[cursor_line].extend_from_slice(&['\r', '\n']); + + // Add new line + buffer.push(vec![]); + cursor_line += 1; } Key::Char(c) => { - buffer.push(c); + buffer[cursor_line].push(c); } Key::Backspace => { - if buffer.len() > 0 { - buffer.remove(buffer.len() - 1); + if buffer[cursor_line].len() > 0 { + let remove_target = &buffer[cursor_line].len() - 1; + buffer[cursor_line].remove(remove_target); write!( stdout, "{}{}", @@ -159,12 +164,25 @@ async fn main() { termion::clear::AfterCursor ) .unwrap(); + } else { + if buffer.len() > 0 { + buffer.remove(cursor_line); + cursor_line -= 1; + + // Remove ['\r', '\n'] + let line_len = &buffer[cursor_line].len() - 2; + buffer[cursor_line].truncate(line_len); + } } } _ => {} } - message = buffer.iter().collect(); + message = buffer + .iter() + .map(|v| v.iter().collect::()) + .collect::>() + .join(""); write!( stdout, "{}{}{}",