From 5a4bd8775de75c9787d3e4c1d9f2ce54ad142236 Mon Sep 17 00:00:00 2001 From: Harutyun Amirjanyan Date: Thu, 23 May 2024 20:27:01 +0400 Subject: [PATCH] fix visual mode cursor shifted on empty lines (#174) --- src/block-cursor.ts | 6 +++++- test/vim_test.js | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/block-cursor.ts b/src/block-cursor.ts index 2b698f7..e686d63 100644 --- a/src/block-cursor.ts +++ b/src/block-cursor.ts @@ -158,7 +158,11 @@ function measureCursor(cm: CodeMirror, view: EditorView, cursor: SelectionRange, fatCursor = true; if (vim.visualBlock && !primary) return null; - if (cursor.anchor < cursor.head) head--; + if (cursor.anchor < cursor.head) { + let letter = head < view.state.doc.length && view.state.sliceDoc(head, head + 1); + if (letter != "\n") + head--; + } if (cm.state.overwrite) hCoeff = 0.2; else if (vim.status) hCoeff = 0.5; } diff --git a/test/vim_test.js b/test/vim_test.js index 6bce6ba..563fd33 100644 --- a/test/vim_test.js +++ b/test/vim_test.js @@ -168,6 +168,7 @@ function testVim(name, run, opts, expectedFail) { var cm = CodeMirror(place, vimOpts); var vim = CodeMirror.Vim.maybeInitVimState_(cm); CodeMirror.Vim.mapclear(); + CodeMirror.Vim.langmap(''); cm.focus(); // workaround for cm5 slow polling in blurred window @@ -5676,6 +5677,30 @@ isOldCodeMirror || testVim('langmap_visual_block_no_ctrl_remap', function(cm, vi eq('1hworld\n5hworld\nahworld', cm.getValue()); }, {value: '1234\n5678\nabcdefg'}); +testVim('rendered_cursor_position_cm6', function(cm, vim, helpers) { + if (!cm.cm6) return; + cm.setCursor(0, 1); + helpers.doKeys('V'); + function testCursorPosition(line, ch) { + cm.refresh(); + var coords = cm.charCoords({line, ch}); + var cursorRect = cm.getWrapperElement().querySelector(".cm-fat-cursor").getBoundingClientRect(); + var contentRect = cm.getInputField().getBoundingClientRect(); + + is(Math.abs(coords.top - (cursorRect.top - contentRect.top)) < 2); + is(Math.abs(coords.left - (cursorRect.left - contentRect.left)) < 2); + } + testCursorPosition(0, 4); + helpers.doKeys('j'); + testCursorPosition(1, 0); + helpers.doKeys('j'); + testCursorPosition(2, 0); + helpers.doKeys('j'); + testCursorPosition(3, 4); + +}, {value: '1234\n\n\n5678\nabcdefg'}); + + async function delay(t) { return await new Promise(resolve => setTimeout(resolve, t));