mirror of
https://github.com/nushell/nushell.git
synced 2025-06-30 22:50:14 +02:00
Upgrade crossterm (#1288)
* WIP * Finish porting to new crossterm * Fmt
This commit is contained in:
@ -171,7 +171,7 @@ impl TreeFrame {
|
||||
write!(
|
||||
f,
|
||||
"{}",
|
||||
Color::Black.bold().paint(&format!("({})", self.token_desc))
|
||||
Color::White.bold().paint(&format!("({})", self.token_desc))
|
||||
)?;
|
||||
|
||||
write!(f, " -> ")?;
|
||||
@ -196,7 +196,7 @@ impl TreeFrame {
|
||||
write!(
|
||||
f,
|
||||
"{}",
|
||||
Color::Black.bold().paint(&format!("({})", self.token_desc))
|
||||
Color::White.bold().paint(&format!("({})", self.token_desc))
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -305,7 +305,7 @@ impl TreeChild {
|
||||
for (i, (desc, err_desc)) in desc.iter().enumerate() {
|
||||
write!(f, "{}", Color::White.bold().on(Color::Red).paint(*desc))?;
|
||||
|
||||
write!(f, " {}", Color::Black.bold().paint(*err_desc))?;
|
||||
write!(f, " {}", Color::White.bold().paint(*err_desc))?;
|
||||
|
||||
if i != last {
|
||||
write!(f, "{}", Color::White.normal().paint(", "))?;
|
||||
|
@ -8,13 +8,13 @@ license = "MIT"
|
||||
|
||||
[dependencies]
|
||||
ansi_term = "0.12.1"
|
||||
crossterm = { version = "0.10.2" }
|
||||
crossterm = { version = "0.14.2" }
|
||||
nu-plugin = { path = "../nu-plugin", version="0.8.0" }
|
||||
nu-protocol = { path = "../nu-protocol", version = "0.8.0" }
|
||||
nu-source = { path = "../nu-source", version = "0.8.0" }
|
||||
nu-errors = { path = "../nu-errors", version = "0.8.0" }
|
||||
pretty-hex = "0.1.1"
|
||||
image = { version = "0.22.3", default_features = false, features = ["png_codec", "jpeg"] }
|
||||
image = { version = "0.22.4", default_features = false, features = ["png_codec", "jpeg"] }
|
||||
rawkey = "0.1.2"
|
||||
neso = "0.5.0"
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
use crossterm::{cursor, terminal, Attribute, RawScreen};
|
||||
use crossterm::{style::Attribute, ExecutableCommand};
|
||||
use nu_errors::ShellError;
|
||||
use nu_plugin::{serve_plugin, Plugin};
|
||||
use nu_protocol::{outln, CallInfo, Primitive, Signature, UntaggedValue, Value};
|
||||
@ -71,8 +71,7 @@ impl RenderContext {
|
||||
let mut prev_color: Option<(u8, u8, u8)> = None;
|
||||
let mut prev_count = 1;
|
||||
|
||||
let cursor = cursor();
|
||||
cursor.goto(0, 0)?;
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::MoveTo(0, 0));
|
||||
|
||||
for pixel in &self.frame_buffer {
|
||||
match prev_color {
|
||||
@ -115,8 +114,7 @@ impl RenderContext {
|
||||
let mut pos = 0;
|
||||
let fb_len = self.frame_buffer.len();
|
||||
|
||||
let cursor = cursor();
|
||||
cursor.goto(0, 0)?;
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::MoveTo(0, 0));
|
||||
|
||||
while pos < (fb_len - self.width) {
|
||||
let top_pixel = self.frame_buffer[pos];
|
||||
@ -169,12 +167,10 @@ impl RenderContext {
|
||||
}
|
||||
}
|
||||
pub fn update(&mut self) -> Result<(), Box<dyn std::error::Error>> {
|
||||
let terminal = terminal();
|
||||
let terminal_size = terminal.terminal_size();
|
||||
let terminal_size = crossterm::terminal::size().unwrap_or_else(|_| (80, 24));
|
||||
|
||||
if (self.width != terminal_size.0 as usize) || (self.height != terminal_size.1 as usize) {
|
||||
let cursor = cursor();
|
||||
cursor.hide()?;
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::Hide);
|
||||
|
||||
self.width = terminal_size.0 as usize;
|
||||
self.height = if self.lores_mode {
|
||||
@ -305,10 +301,9 @@ pub fn view_contents(
|
||||
|
||||
render_context.flush()?;
|
||||
|
||||
let cursor = cursor();
|
||||
let _ = cursor.show();
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::Show);
|
||||
|
||||
let _ = RawScreen::disable_raw_mode();
|
||||
let _ = crossterm::terminal::disable_raw_mode();
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@ -340,11 +335,8 @@ pub fn view_contents_interactive(
|
||||
|
||||
nes.reset();
|
||||
|
||||
if let Ok(_raw) = RawScreen::into_raw_mode() {
|
||||
if let Ok(_raw) = crossterm::terminal::enable_raw_mode() {
|
||||
let mut render_context: RenderContext = RenderContext::blank(lores_mode);
|
||||
let input = crossterm::input();
|
||||
let _ = input.read_async();
|
||||
let cursor = cursor();
|
||||
|
||||
let buttons = vec![
|
||||
KeyCode::Alt,
|
||||
@ -357,7 +349,7 @@ pub fn view_contents_interactive(
|
||||
KeyCode::RightArrow,
|
||||
];
|
||||
|
||||
cursor.hide()?;
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::Hide);
|
||||
|
||||
'gameloop: loop {
|
||||
let _ = render_context.update();
|
||||
@ -397,6 +389,18 @@ pub fn view_contents_interactive(
|
||||
nes.release_button(0, idx as u8);
|
||||
}
|
||||
}
|
||||
loop {
|
||||
let x = crossterm::event::poll(std::time::Duration::from_secs(0));
|
||||
match x {
|
||||
Ok(true) => {
|
||||
// Swallow the events so we don't queue them into the line editor
|
||||
let _ = crossterm::event::read();
|
||||
}
|
||||
_ => {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -408,10 +412,9 @@ pub fn view_contents_interactive(
|
||||
}
|
||||
}
|
||||
|
||||
let cursor = cursor();
|
||||
let _ = cursor.show();
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::Show);
|
||||
|
||||
let _screen = RawScreen::disable_raw_mode();
|
||||
let _screen = crossterm::terminal::disable_raw_mode();
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -12,11 +12,11 @@ nu-protocol = { path = "../nu-protocol", version = "0.8.0" }
|
||||
nu-source = { path = "../nu-source", version = "0.8.0" }
|
||||
nu-errors = { path = "../nu-errors", version = "0.8.0" }
|
||||
|
||||
crossterm = "0.10.2"
|
||||
crossterm = "0.14.2"
|
||||
syntect = "3.2.0"
|
||||
onig_sys = "~69.1.0"
|
||||
ansi_term = "0.12.1"
|
||||
url = "2.1.0"
|
||||
url = "2.1.1"
|
||||
|
||||
[build-dependencies]
|
||||
nu-build = { version = "0.8.0", path = "../nu-build" }
|
||||
|
@ -1,5 +1,7 @@
|
||||
use crossterm::{cursor, terminal, RawScreen};
|
||||
use crossterm::{InputEvent, KeyEvent};
|
||||
use crossterm::{
|
||||
event::{KeyCode, KeyEvent},
|
||||
ExecutableCommand,
|
||||
};
|
||||
use nu_errors::ShellError;
|
||||
use nu_plugin::{serve_plugin, Plugin};
|
||||
use nu_protocol::{outln, CallInfo, Primitive, Signature, UntaggedValue, Value};
|
||||
@ -42,10 +44,7 @@ fn paint_textview(
|
||||
starting_row: usize,
|
||||
use_color_buffer: bool,
|
||||
) -> usize {
|
||||
let terminal = terminal();
|
||||
let cursor = cursor();
|
||||
|
||||
let size = terminal.terminal_size();
|
||||
let size = crossterm::terminal::size().unwrap_or_else(|_| (80, 24));
|
||||
|
||||
// render
|
||||
let mut pos = 0;
|
||||
@ -105,7 +104,7 @@ fn paint_textview(
|
||||
}
|
||||
|
||||
if buffer_needs_scrolling {
|
||||
let _ = cursor.goto(0, 0);
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::MoveTo(0, 0));
|
||||
}
|
||||
|
||||
if use_color_buffer {
|
||||
@ -116,7 +115,7 @@ fn paint_textview(
|
||||
}
|
||||
|
||||
if buffer_needs_scrolling {
|
||||
let _ = cursor.goto(0, size.1);
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::MoveTo(0, size.1));
|
||||
print!(
|
||||
"{}",
|
||||
ansi_term::Colour::Blue.paint("[ESC to quit, arrow keys to move]")
|
||||
@ -131,29 +130,24 @@ fn paint_textview(
|
||||
fn scroll_view_lines_if_needed(draw_commands: Vec<DrawCommand>, use_color_buffer: bool) {
|
||||
let mut starting_row = 0;
|
||||
|
||||
if let Ok(_raw) = RawScreen::into_raw_mode() {
|
||||
let terminal = terminal();
|
||||
let mut size = terminal.terminal_size();
|
||||
if let Ok(_raw) = crossterm::terminal::enable_raw_mode() {
|
||||
let mut size = crossterm::terminal::size().unwrap_or_else(|_| (80, 24));
|
||||
let height = size.1 as usize - 1;
|
||||
|
||||
let mut max_bottom_line = paint_textview(&draw_commands, starting_row, use_color_buffer);
|
||||
|
||||
// Only scroll if needed
|
||||
if max_bottom_line > height as usize {
|
||||
let cursor = cursor();
|
||||
let _ = cursor.hide();
|
||||
|
||||
let input = crossterm::input();
|
||||
let mut sync_stdin = input.read_sync();
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::Hide);
|
||||
|
||||
loop {
|
||||
if let Some(ev) = sync_stdin.next() {
|
||||
if let InputEvent::Keyboard(k) = ev {
|
||||
match k {
|
||||
KeyEvent::Esc => {
|
||||
if let Ok(ev) = crossterm::event::read() {
|
||||
if let crossterm::event::Event::Key(KeyEvent { code, modifiers }) = ev {
|
||||
match code {
|
||||
KeyCode::Esc => {
|
||||
break;
|
||||
}
|
||||
KeyEvent::Up | KeyEvent::Char('k') => {
|
||||
KeyCode::Up | KeyCode::Char('k') => {
|
||||
if starting_row > 0 {
|
||||
starting_row -= 1;
|
||||
max_bottom_line = paint_textview(
|
||||
@ -163,19 +157,39 @@ fn scroll_view_lines_if_needed(draw_commands: Vec<DrawCommand>, use_color_buffer
|
||||
);
|
||||
}
|
||||
}
|
||||
KeyEvent::Down | KeyEvent::Char('j') => {
|
||||
KeyCode::Down | KeyCode::Char('j') => {
|
||||
if starting_row < (max_bottom_line - height) {
|
||||
starting_row += 1;
|
||||
}
|
||||
max_bottom_line =
|
||||
paint_textview(&draw_commands, starting_row, use_color_buffer);
|
||||
}
|
||||
KeyEvent::PageUp | KeyEvent::Ctrl('b') => {
|
||||
KeyCode::Char('b')
|
||||
if modifiers.contains(crossterm::event::KeyModifiers::CONTROL) =>
|
||||
{
|
||||
starting_row -= std::cmp::min(height, starting_row);
|
||||
max_bottom_line =
|
||||
paint_textview(&draw_commands, starting_row, use_color_buffer);
|
||||
}
|
||||
KeyEvent::PageDown | KeyEvent::Ctrl('f') | KeyEvent::Char(' ') => {
|
||||
KeyCode::PageUp => {
|
||||
starting_row -= std::cmp::min(height, starting_row);
|
||||
max_bottom_line =
|
||||
paint_textview(&draw_commands, starting_row, use_color_buffer);
|
||||
}
|
||||
KeyCode::Char('f')
|
||||
if modifiers.contains(crossterm::event::KeyModifiers::CONTROL) =>
|
||||
{
|
||||
if starting_row < (max_bottom_line - height) {
|
||||
starting_row += height;
|
||||
|
||||
if starting_row > (max_bottom_line - height) {
|
||||
starting_row = max_bottom_line - height;
|
||||
}
|
||||
}
|
||||
max_bottom_line =
|
||||
paint_textview(&draw_commands, starting_row, use_color_buffer);
|
||||
}
|
||||
KeyCode::PageDown | KeyCode::Char(' ') => {
|
||||
if starting_row < (max_bottom_line - height) {
|
||||
starting_row += height;
|
||||
|
||||
@ -191,17 +205,20 @@ fn scroll_view_lines_if_needed(draw_commands: Vec<DrawCommand>, use_color_buffer
|
||||
}
|
||||
}
|
||||
|
||||
let new_size = terminal.terminal_size();
|
||||
if size != new_size {
|
||||
size = new_size;
|
||||
let _ = terminal.clear(crossterm::ClearType::All);
|
||||
max_bottom_line =
|
||||
paint_textview(&draw_commands, starting_row, use_color_buffer);
|
||||
if let Ok(new_size) = crossterm::terminal::size() {
|
||||
if size != new_size {
|
||||
size = new_size;
|
||||
let _ = std::io::stdout().execute(crossterm::terminal::Clear(
|
||||
crossterm::terminal::ClearType::All,
|
||||
));
|
||||
max_bottom_line =
|
||||
paint_textview(&draw_commands, starting_row, use_color_buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
let _ = cursor.show();
|
||||
let _ = std::io::stdout().execute(crossterm::cursor::Show);
|
||||
|
||||
let _ = RawScreen::disable_raw_mode();
|
||||
let _ = crossterm::terminal::disable_raw_mode();
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user