summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2023-03-05 10:42:35 +0800
committerGitHub <noreply@github.com>2023-03-05 10:42:35 +0800
commitd876818df17ad7b25ebb38a678aa23c79b826e38 (patch)
tree8fc47e937867f4ccded5fed6b0190f5782e06725 /src
parent181fbe8163139cbd43425734eda6207553470a3b (diff)
downloadaichat-d876818df17ad7b25ebb38a678aa23c79b826e38.tar.gz
refactor: optimize clear screen (#16)
Diffstat (limited to 'src')
-rw-r--r--src/main.rs2
-rw-r--r--src/repl.rs11
-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(())
+}