From 988ce9dce47d485e02dbde35573de3d14065b27e Mon Sep 17 00:00:00 2001 From: Danny Weinberg Date: Mon, 17 Apr 2023 13:08:26 -0700 Subject: Add support for CSI E/F (next and previous line) This adds support for the following two operations: - https://vt100.net/docs/vt510-rm/CNL.html - https://vt100.net/docs/vt510-rm/CPL.html While it looks like these weren't technically implemented in the vt100, it does seem that a number of modern terminals (iTerm2, Windows Terminal, as two examples) support them. --- src/perform.rs | 2 ++ src/screen.rs | 12 ++++++++++++ tests/data/fixtures/relative_movement.in | 4 ++++ tests/data/fixtures/relative_movement/18.json | 13 +++++++++++++ tests/data/fixtures/relative_movement/18.typescript | 1 + tests/data/fixtures/relative_movement/19.json | 13 +++++++++++++ tests/data/fixtures/relative_movement/19.typescript | 1 + tests/data/fixtures/relative_movement/20.json | 13 +++++++++++++ tests/data/fixtures/relative_movement/20.typescript | 1 + tests/data/fixtures/relative_movement/21.json | 13 +++++++++++++ tests/data/fixtures/relative_movement/21.typescript | 1 + 11 files changed, 74 insertions(+) create mode 100644 tests/data/fixtures/relative_movement/18.json create mode 100644 tests/data/fixtures/relative_movement/18.typescript create mode 100644 tests/data/fixtures/relative_movement/19.json create mode 100644 tests/data/fixtures/relative_movement/19.typescript create mode 100644 tests/data/fixtures/relative_movement/20.json create mode 100644 tests/data/fixtures/relative_movement/20.typescript create mode 100644 tests/data/fixtures/relative_movement/21.json create mode 100644 tests/data/fixtures/relative_movement/21.typescript diff --git a/src/perform.rs b/src/perform.rs index c3c2e70..d528cb4 100644 --- a/src/perform.rs +++ b/src/perform.rs @@ -59,6 +59,8 @@ impl vte::Perform for WrappedScreen { 'B' => self.0.cud(canonicalize_params_1(params, 1)), 'C' => self.0.cuf(canonicalize_params_1(params, 1)), 'D' => self.0.cub(canonicalize_params_1(params, 1)), + 'E' => self.0.cnl(canonicalize_params_1(params, 1)), + 'F' => self.0.cpl(canonicalize_params_1(params, 1)), 'G' => self.0.cha(canonicalize_params_1(params, 1)), 'H' => self.0.cup(canonicalize_params_2(params, 1, 1)), 'J' => self.0.ed(canonicalize_params_1(params, 0)), diff --git a/src/screen.rs b/src/screen.rs index ad54694..6eeb2e3 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -1083,6 +1083,18 @@ impl Screen { self.grid_mut().col_dec(offset); } + // CSI E + pub(crate) fn cnl(&mut self, offset: u16) { + self.grid_mut().col_set(0); + self.grid_mut().row_inc_clamp(offset); + } + + // CSI F + pub(crate) fn cpl(&mut self, offset: u16) { + self.grid_mut().col_set(0); + self.grid_mut().row_dec_clamp(offset); + } + // CSI G pub(crate) fn cha(&mut self, col: u16) { self.grid_mut().col_set(col - 1); diff --git a/tests/data/fixtures/relative_movement.in b/tests/data/fixtures/relative_movement.in index 1e744f5..f8339af 100644 --- a/tests/data/fixtures/relative_movement.in +++ b/tests/data/fixtures/relative_movement.in @@ -15,3 +15,7 @@ \x1b[500B \x1b[500A \x1b[24;80H\x1b[1ma\x1b[A +\x1b[5;5H\x1b[3F +\x1b[5;5H\x1b[F +\x1b[5;5H\x1b[3E +\x1b[5;5H\x1b[E diff --git a/tests/data/fixtures/relative_movement/18.json b/tests/data/fixtures/relative_movement/18.json new file mode 100644 index 0000000..8dde982 --- /dev/null +++ b/tests/data/fixtures/relative_movement/18.json @@ -0,0 +1,13 @@ +{ + "contents": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n a", + "cells": { + "23,79": { + "contents": "a", + "bold": true + } + }, + "cursor_position": [ + 1, + 0 + ] +} \ No newline at end of file diff --git a/tests/data/fixtures/relative_movement/18.typescript b/tests/data/fixtures/relative_movement/18.typescript new file mode 100644 index 0000000..300ac2e --- /dev/null +++ b/tests/data/fixtures/relative_movement/18.typescript @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/data/fixtures/relative_movement/19.json b/tests/data/fixtures/relative_movement/19.json new file mode 100644 index 0000000..f151bb2 --- /dev/null +++ b/tests/data/fixtures/relative_movement/19.json @@ -0,0 +1,13 @@ +{ + "contents": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n a", + "cells": { + "23,79": { + "contents": "a", + "bold": true + } + }, + "cursor_position": [ + 3, + 0 + ] +} \ No newline at end of file diff --git a/tests/data/fixtures/relative_movement/19.typescript b/tests/data/fixtures/relative_movement/19.typescript new file mode 100644 index 0000000..6dfedc0 --- /dev/null +++ b/tests/data/fixtures/relative_movement/19.typescript @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/data/fixtures/relative_movement/20.json b/tests/data/fixtures/relative_movement/20.json new file mode 100644 index 0000000..479a1bd --- /dev/null +++ b/tests/data/fixtures/relative_movement/20.json @@ -0,0 +1,13 @@ +{ + "contents": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n a", + "cells": { + "23,79": { + "contents": "a", + "bold": true + } + }, + "cursor_position": [ + 7, + 0 + ] +} \ No newline at end of file diff --git a/tests/data/fixtures/relative_movement/20.typescript b/tests/data/fixtures/relative_movement/20.typescript new file mode 100644 index 0000000..17d2b03 --- /dev/null +++ b/tests/data/fixtures/relative_movement/20.typescript @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/data/fixtures/relative_movement/21.json b/tests/data/fixtures/relative_movement/21.json new file mode 100644 index 0000000..ab71e23 --- /dev/null +++ b/tests/data/fixtures/relative_movement/21.json @@ -0,0 +1,13 @@ +{ + "contents": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n a", + "cells": { + "23,79": { + "contents": "a", + "bold": true + } + }, + "cursor_position": [ + 5, + 0 + ] +} \ No newline at end of file diff --git a/tests/data/fixtures/relative_movement/21.typescript b/tests/data/fixtures/relative_movement/21.typescript new file mode 100644 index 0000000..b704ed4 --- /dev/null +++ b/tests/data/fixtures/relative_movement/21.typescript @@ -0,0 +1 @@ + \ No newline at end of file -- cgit v1.2.3-54-g00ecf