aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/os/input.c38
-rw-r--r--test/functional/legacy/mapping_spec.lua5
-rw-r--r--test/functional/ui/input_spec.lua8
3 files changed, 36 insertions, 15 deletions
diff --git a/src/nvim/os/input.c b/src/nvim/os/input.c
index 2c2b0fc871..00efa28161 100644
--- a/src/nvim/os/input.c
+++ b/src/nvim/os/input.c
@@ -148,22 +148,34 @@ size_t input_enqueue(String keys)
uint8_t buf[6] = {0};
unsigned int new_size = trans_special((uint8_t **)&ptr, buf, true);
- if (!new_size) {
- if (*ptr == '<') {
- // Invalid key sequence, skip until the next '>' or until *end
- do {
- ptr++;
- } while (ptr < end && *ptr != '>');
+ if (new_size) {
+ new_size = handle_mouse_event(&ptr, buf, new_size);
+ rbuffer_write(input_buffer, (char *)buf, new_size);
+ continue;
+ }
+
+ if (*ptr == '<') {
+ // Invalid key sequence, skip until the next '>' or until *end
+ do {
ptr++;
- continue;
- }
- // copy the character unmodified
- *buf = (uint8_t)*ptr++;
- new_size = 1;
+ } while (ptr < end && *ptr != '>');
+ ptr++;
+ continue;
}
- new_size = handle_mouse_event(&ptr, buf, new_size);
- rbuffer_write(input_buffer, (char *)buf, new_size);
+ // copy the character, escaping CSI and K_SPECIAL
+ if ((uint8_t)*ptr == CSI) {
+ rbuffer_write(input_buffer, (char *)&(uint8_t){K_SPECIAL}, 1);
+ rbuffer_write(input_buffer, (char *)&(uint8_t){KS_EXTRA}, 1);
+ rbuffer_write(input_buffer, (char *)&(uint8_t){KE_CSI}, 1);
+ } else if ((uint8_t)*ptr == K_SPECIAL) {
+ rbuffer_write(input_buffer, (char *)&(uint8_t){K_SPECIAL}, 1);
+ rbuffer_write(input_buffer, (char *)&(uint8_t){KS_SPECIAL}, 1);
+ rbuffer_write(input_buffer, (char *)&(uint8_t){KE_FILLER}, 1);
+ } else {
+ rbuffer_write(input_buffer, ptr, 1);
+ }
+ ptr++;
}
size_t rv = (size_t)(ptr - keys.data);
diff --git a/test/functional/legacy/mapping_spec.lua b/test/functional/legacy/mapping_spec.lua
index 1451b268c5..c387d7484c 100644
--- a/test/functional/legacy/mapping_spec.lua
+++ b/test/functional/legacy/mapping_spec.lua
@@ -16,7 +16,7 @@ describe('mapping', function()
-- Abbreviations with р (0x80) should work.
execute('inoreab чкпр vim')
- feed('GAчкпр <cr><esc>')
+ feed('GAчкпр <esc>')
-- langmap should not get remapped in insert mode.
execute('inoremap { FAIL_ilangmap')
@@ -27,10 +27,11 @@ describe('mapping', function()
execute('inoremap <expr> { "FAIL_iexplangmap"')
feed('o+<esc>')
+
-- Assert buffer contents.
expect([[
test starts here:
- vim
+ vim
+
+]])
end)
diff --git a/test/functional/ui/input_spec.lua b/test/functional/ui/input_spec.lua
index 60a49c4ed7..81af908045 100644
--- a/test/functional/ui/input_spec.lua
+++ b/test/functional/ui/input_spec.lua
@@ -1,6 +1,7 @@
local helpers = require('test.functional.helpers')
local clear, execute, nvim = helpers.clear, helpers.execute, helpers.nvim
local feed, next_message, eq = helpers.feed, helpers.next_message, helpers.eq
+local expect = helpers.expect
describe('mappings', function()
local cid
@@ -38,3 +39,10 @@ describe('mappings', function()
check_mapping('<a-s-c-up>', '<c-s-a-up>')
end)
end)
+
+describe('input utf sequences that contain CSI/K_SPECIAL', function()
+ it('ok', function()
+ feed('i…<esc>')
+ expect('…')
+ end)
+end)