diff --git a/packages/codemirror-vim-core/test/vim_test.js b/packages/codemirror-vim-core/test/vim_test.js index 789fc06..a77b7a2 100644 --- a/packages/codemirror-vim-core/test/vim_test.js +++ b/packages/codemirror-vim-core/test/vim_test.js @@ -336,6 +336,14 @@ testMotion('j_repeat_clip', ['1000', 'j'], endOfDocument); testMotion('k', 'k', offsetCursor(word3.end, -1, 0), word3.end); testMotion('k_repeat', ['2', 'k'], makeCursor(0, 4), makeCursor(2, 4)); testMotion('k_repeat_clip', ['1000', 'k'], makeCursor(0, 4), makeCursor(2, 4)); +testVim('j_k_at_document_boundary', function(cm, vim, helpers) { + cm.setCursor(0, 3); + helpers.doKeys('k'); + helpers.assertCursorAt(0, 3); + cm.setCursor(cm.lastLine(), 1); + helpers.doKeys('j'); + helpers.assertCursorAt(cm.lastLine(), 1); +}, {value: 'abcdef\nxyz'}); testMotion('w', 'w', word1.start); testMotion('keepHPos', ['5', 'j', 'j', '7', 'k'], makeCursor(8, 12), makeCursor(12, 12)); testMotion('keepHPosEol', ['$', '2', 'j'], makeCursor(2, 18)); diff --git a/packages/codemirror-vim-core/types.ts b/packages/codemirror-vim-core/types.ts index fbf98a6..fcae8b5 100644 --- a/packages/codemirror-vim-core/types.ts +++ b/packages/codemirror-vim-core/types.ts @@ -168,7 +168,7 @@ export type vimMotions = { moveToOtherHighlightedEnd(cm: CodeMirrorV, _head: Pos, motionArgs: MotionArgs, vim: vimState): [Pos,Pos] jumpToMark(cm: CodeMirrorV, head: Pos, motionArgs: MotionArgs, vim: vimState):Pos moveByCharacters(_cm: CodeMirrorV, head: Pos, motionArgs: MotionArgs): Pos - moveByLines(cm: CodeMirrorV, head: Pos, motionArgs: MotionArgs, vim: vimState): Pos + moveByLines(cm: CodeMirrorV, head: Pos, motionArgs: MotionArgs, vim: vimState): Pos | null moveByDisplayLines(cm: CodeMirrorV, head: Pos, motionArgs: MotionArgs, vim: vimState): Pos moveByPage(cm: CodeMirrorV, head: Pos, motionArgs: MotionArgs): Pos moveByParagraph(cm: CodeMirrorV, head: Pos, motionArgs: MotionArgs): Pos diff --git a/packages/codemirror-vim-core/vim.js b/packages/codemirror-vim-core/vim.js index 3cafa6b..7b03a0b 100644 --- a/packages/codemirror-vim-core/vim.js +++ b/packages/codemirror-vim-core/vim.js @@ -2425,12 +2425,11 @@ export function initVim(CM) { line = posV.line; endCh = posV.ch; } - // Vim go to line begin or line end when cursor at first/last line and - // move to previous/next line is triggered. - if (line < first && cur.line == first){ - return this.moveToStartOfLine(cm, head, motionArgs, vim); - } else if (line > last && cur.line == last){ - return moveToEol(cm, head, motionArgs, vim, true); + // Motions beyond the document boundary fail without moving the cursor. + if (!motionArgs.linewise && + ((line < first && cur.line == first) || + (line > last && cur.line == last))) { + return null; } if (motionArgs.toFirstChar){ endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));