diff options
| author | sigoden <sigoden@gmail.com> | 2023-03-05 10:42:35 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-05 10:42:35 +0800 |
| commit | d876818df17ad7b25ebb38a678aa23c79b826e38 (patch) | |
| tree | 8fc47e937867f4ccded5fed6b0190f5782e06725 | |
| parent | 181fbe8163139cbd43425734eda6207553470a3b (diff) | |
| download | aichat-d876818df17ad7b25ebb38a678aa23c79b826e38.tar.gz | |
refactor: optimize clear screen (#16)
| -rw-r--r-- | src/main.rs | 2 | ||||
| -rw-r--r-- | src/repl.rs | 11 | ||||
| -rw-r--r-- | src/term.rs (renamed from src/editor.rs) | 28 |
3 files changed, 36 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs index 55c09a6..dc54b01 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,9 @@ mod cli; mod client; mod config; -mod editor; mod render; mod repl; +mod term; mod utils; use std::sync::Arc; diff --git a/src/repl.rs b/src/repl.rs index 2ca1ea0..cd9e990 100644 --- a/src/repl.rs +++ b/src/repl.rs @@ -1,7 +1,7 @@ use crate::client::ChatGptClient; use crate::config::{Config, Role}; -use crate::editor; use crate::render::{self, MarkdownRender}; +use crate::term; use crate::utils::{copy, dump}; use anyhow::{anyhow, Result}; use crossbeam::channel::{unbounded, Sender}; @@ -115,7 +115,7 @@ impl Repl { dump_repl_help(); } ".clear" => match args { - Some("screen") => self.editor.clear_scrollback()?, + Some("screen") => term::clear_screen(0)?, Some("history") => { let history = Box::new(self.editor.history_mut()); history @@ -139,7 +139,7 @@ impl Repl { "// Entering editor mode (Ctrl+D to finish, Ctrl+C to cancel)", 1, ); - let content = editor::edit()?; + let content = term::edit()?; dump("", 1); handler.handle(ReplCmd::Submit(content))?; } @@ -189,6 +189,11 @@ impl Repl { ReedlineEvent::MenuNext, ]), ); + keybindings.add_binding( + KeyModifiers::CONTROL, + KeyCode::Char('l'), + ReedlineEvent::ExecuteHostCommand(".clear screen".into()), + ); keybindings } diff --git a/src/editor.rs b/src/term.rs index 1da71a1..0d2780e 100644 --- a/src/editor.rs +++ b/src/term.rs @@ -6,7 +6,7 @@ use crossterm::{ cursor, event::{self, Event, KeyCode, KeyModifiers}, queue, style, - terminal::{self, disable_raw_mode, enable_raw_mode}, + terminal::{self, disable_raw_mode, enable_raw_mode, ClearType}, }; use crate::utils::paste; @@ -108,3 +108,29 @@ impl<'a, T: Write> Session<'a, T> { Ok(()) } } + +pub fn clear_screen(keep_lines: u16) -> Result<()> { + enable_raw_mode()?; + let mut stdout = io::stdout(); + + let ret = clear_screen_inner(&mut stdout, keep_lines); + + // restore terminal + disable_raw_mode()?; + + ret +} + +fn clear_screen_inner(writer: &mut Stdout, keep_lines: u16) -> Result<()> { + let (_, h) = terminal::size()?; + queue!( + writer, + style::Print("\n".repeat((h - 2).into())), + terminal::ScrollUp(2), + cursor::MoveTo(0, 0), + terminal::Clear(ClearType::FromCursorDown), + terminal::ScrollUp(keep_lines), + )?; + writer.flush()?; + Ok(()) +} |
