From f1f821c7bda35db9f05059ca517aa918f9540dec Mon Sep 17 00:00:00 2001 From: Aram Drevekenin Date: Thu, 17 Dec 2020 15:42:49 +0100 Subject: [PATCH] fix(compatibility): fix neovim change mode (#108) --- src/terminal_pane/scroll.rs | 11 ++++++ src/terminal_pane/terminal_pane.rs | 4 +++ src/tests/fakes.rs | 2 +- src/tests/fixtures/nvim_insert | Bin 0 -> 2548 bytes src/tests/integration/compatibility.rs | 23 +++++++++++++ ...__compatibility__neovim_insert_mode-2.snap | 32 ++++++++++++++++++ ...on__compatibility__neovim_insert_mode.snap | 32 ++++++++++++++++++ 7 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/tests/fixtures/nvim_insert create mode 100644 src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode-2.snap create mode 100644 src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode.snap diff --git a/src/terminal_pane/scroll.rs b/src/terminal_pane/scroll.rs index 886a58d3..8bd304f1 100644 --- a/src/terminal_pane/scroll.rs +++ b/src/terminal_pane/scroll.rs @@ -292,6 +292,11 @@ impl CursorPosition { self.line_index = (current_canonical_line_position - count, 0); } } + pub fn move_down_by_canonical_lines(&mut self, count: usize) { + // this method does not verify that we will not overflow + let current_canonical_line_position = self.line_index.0; + self.line_index = (current_canonical_line_position + count, 0); + } pub fn move_to_canonical_line(&mut self, index: usize) { self.line_index = (index, 0); } @@ -505,6 +510,12 @@ impl Scroll { pub fn move_cursor_up(&mut self, count: usize) { self.cursor_position.move_up_by_canonical_lines(count); } + pub fn move_cursor_down(&mut self, count: usize) { + let current_canonical_line = self.cursor_position.line_index.0; + let max_count = (self.canonical_lines.len() - 1) - current_canonical_line; + let count = std::cmp::min(count, max_count); + self.cursor_position.move_down_by_canonical_lines(count); + } pub fn change_size(&mut self, columns: usize, lines: usize) { for canonical_line in self.canonical_lines.iter_mut() { canonical_line.change_width(columns); diff --git a/src/terminal_pane/terminal_pane.rs b/src/terminal_pane/terminal_pane.rs index ae0439a9..0d5a108b 100644 --- a/src/terminal_pane/terminal_pane.rs +++ b/src/terminal_pane/terminal_pane.rs @@ -457,6 +457,10 @@ impl vte::Perform for TerminalPane { // move cursor up until edge of screen let move_up_count = if params[0] == 0 { 1 } else { params[0] }; self.scroll.move_cursor_up(move_up_count as usize); + } else if c == 'B' { + // move cursor down until edge of screen + let move_down_count = if params[0] == 0 { 1 } else { params[0] }; + self.scroll.move_cursor_down(move_down_count as usize); } else if c == 'D' { let move_back_count = if params[0] == 0 { 1 diff --git a/src/tests/fakes.rs b/src/tests/fakes.rs index f20f30ce..8ae1a972 100644 --- a/src/tests/fakes.rs +++ b/src/tests/fakes.rs @@ -11,7 +11,7 @@ use crate::os_input_output::OsApi; use crate::tests::possible_tty_inputs::{get_possible_tty_inputs, Bytes}; use crate::tests::utils::commands::QUIT; -const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(50); +const MIN_TIME_BETWEEN_SNAPSHOTS: Duration = Duration::from_millis(100); const WAIT_TIME_BEFORE_QUITTING: Duration = Duration::from_millis(50); #[derive(Clone)] diff --git a/src/tests/fixtures/nvim_insert b/src/tests/fixtures/nvim_insert new file mode 100644 index 0000000000000000000000000000000000000000..4d476275436c1430d990b322b5c75efeaf7489cc GIT binary patch literal 2548 zcmchZ&5qMB5XXB1Rmv0i;vZVFioUmqj__gk94z|mGgTn^Ai;+ zp;@NcgD35+^kcpG_I3A+|NozdaPG0}{B2&%ao>F1a5}|+uZx^7mStXFRv&p;uk+<> zzAmqGzAEyn^7=iNjinGl(POtdIfNLAfI<@K&6m%Q+7PsH@%5+CybWFZrm49Jn%1+j zZXa*H|G?+xEK7okc^?Q3!C4rd39<9S6M{%4c#*-Rhf5RxB!3+Z|9#}xIh+rYXVuA$)iwYJNEUvV;(&9>sD=n_HxYFXv9hYSaR7`VuUo`)0 z7Q+B+?Th9;WmRHQCBL#wO8G&4u_|!hvS}R0YSGL;tW;BPYr(1knJ5quuB5}f+k>`c zL1Ly>T0f4|Sfwd0FcFY6CBw%z*oV60616UFMW5UQx1xc%6$4WA-HHb4Rt!l|x)lx7 ztr(FaxD^f5tr(M{a4Q<9TQNaJNZpDC>Q+oiF>xyHp>9PG10d1(sAy?(e-UjPEaF$c ibAtpw#}rV<42S&1t2fVHU-0433{?EK=sL$<-}?!B3sh_X literal 0 HcmV?d00001 diff --git a/src/tests/integration/compatibility.rs b/src/tests/integration/compatibility.rs index 6fbf99e9..467a99ca 100644 --- a/src/tests/integration/compatibility.rs +++ b/src/tests/integration/compatibility.rs @@ -340,3 +340,26 @@ pub fn display_tab_characters_properly() { assert_snapshot!(snapshot); } } + +#[test] +pub fn neovim_insert_mode() { + let fake_win_size = PositionAndSize { + columns: 116, + rows: 28, + x: 0, + y: 0, + }; + let fixture_name = "nvim_insert"; + let mut fake_input_output = get_fake_os_input(&fake_win_size, fixture_name); + fake_input_output.add_terminal_input(&[&COMMAND_TOGGLE, &COMMAND_TOGGLE, &QUIT]); + start(Box::new(fake_input_output.clone()), Opt::default()); + let output_frames = fake_input_output + .stdout_writer + .output_frames + .lock() + .unwrap(); + let snapshots = get_output_frame_snapshots(&output_frames, &fake_win_size); + for snapshot in snapshots { + assert_snapshot!(snapshot); + } +} diff --git a/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode-2.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode-2.snap new file mode 100644 index 00000000..56728257 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode-2.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- +line 2 +line 3 +line 4 +line 5 +line 6 +line 7 +line 8 +line 9 +line 10 +line 11 +line 12 +line 13 +line 14 +line 15 +line 16 +line 17 +line 18 +line 19 +line 20 +line 21 +line 22 +line 23 +line 24 +line 25 +line 26 +some-file 10,1 Top +-- INSERT -- +Bye from Mosaic!█ diff --git a/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode.snap b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode.snap new file mode 100644 index 00000000..819c92c8 --- /dev/null +++ b/src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode.snap @@ -0,0 +1,32 @@ +--- +source: src/tests/integration/compatibility.rs +expression: snapshot +--- +line 1 +line 2 +line 3 +line 4 +line 5 +line 6 +line 7 +line 8 +line 9 +█ine 10 +line 11 +line 12 +line 13 +line 14 +line 15 +line 16 +line 17 +line 18 +line 19 +line 20 +line 21 +line 22 +line 23 +line 24 +line 25 +line 26 +some-file 10,1 Top +-- INSERT --