fix(compatibility): fix neovim change mode (#108)

This commit is contained in:
Aram Drevekenin 2020-12-17 15:42:49 +01:00 committed by GitHub
parent 97d2c8339e
commit f1f821c7bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 103 additions and 1 deletions

View file

@ -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);

View file

@ -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

View file

@ -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)]

BIN
src/tests/fixtures/nvim_insert vendored Normal file

Binary file not shown.

View file

@ -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);
}
}

View file

@ -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!█

View file

@ -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 --