aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2020-12-17 15:42:49 +0100
committerGitHub <noreply@github.com>2020-12-17 15:42:49 +0100
commitf1f821c7bda35db9f05059ca517aa918f9540dec (patch)
tree44f7d7b2656f98bfd694408dd5969264df23864a /src
parentfix(compatibility): fix neovim scrolling (#107) (diff)
downloadsl0ppij-f1f821c7bda35db9f05059ca517aa918f9540dec.tar.gz
sl0ppij-f1f821c7bda35db9f05059ca517aa918f9540dec.tar.xz
sl0ppij-f1f821c7bda35db9f05059ca517aa918f9540dec.zip
fix(compatibility): fix neovim change mode (#108)
Diffstat (limited to 'src')
-rw-r--r--src/terminal_pane/scroll.rs11
-rw-r--r--src/terminal_pane/terminal_pane.rs4
-rw-r--r--src/tests/fakes.rs2
-rw-r--r--src/tests/fixtures/nvim_insertbin0 -> 2548 bytes
-rw-r--r--src/tests/integration/compatibility.rs23
-rw-r--r--src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode-2.snap32
-rw-r--r--src/tests/integration/snapshots/mosaic__tests__integration__compatibility__neovim_insert_mode.snap32
7 files changed, 103 insertions, 1 deletions
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 00000000..4d476275
--- /dev/null
+++ b/src/tests/fixtures/nvim_insert
Binary files differ
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 --