From 52de20cad38a02501d9928ace2232432ba0653d4 Mon Sep 17 00:00:00 2001 From: nightwing <amirjanyan@gmail.com> Date: Sat, 27 May 2017 18:39:31 +0400 Subject: [PATCH] [vim] fix . repeat after replace --- keymap/vim.js | 14 +++++++++++--- test/vim_test.js | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/keymap/vim.js b/keymap/vim.js index 7309086c5..0dbbae734 100644 --- a/keymap/vim.js +++ b/keymap/vim.js @@ -4921,7 +4921,7 @@ * Listens for changes made in insert mode. * Should only be active in insert mode. */ - function onChange(_cm, changeObj) { + function onChange(cm, changeObj) { var macroModeState = vimGlobalState.macroModeState; var lastChange = macroModeState.lastInsertModeChanges; if (!macroModeState.isPlaying) { @@ -4934,7 +4934,11 @@ lastChange.changes = []; lastChange.maybeReset = false; } - lastChange.changes.push(text); + if (cm.state.overwrite && !/\n/.test(text)) { + lastChange.changes.push([text]); + } else { + lastChange.changes.push(text); + } } // Change objects may be chained with next. changeObj = changeObj.next; @@ -5116,9 +5120,13 @@ var change = changes[j]; if (change instanceof InsertModeKey) { CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler); - } else { + } else if (typeof change == "string") { var cur = cm.getCursor(); cm.replaceRange(change, cur, cur); + } else { + var start = cm.getCursor(); + var end = offsetCursor(start, 0, change[0].length); + cm.replaceRange(change[0], start, end); } } } diff --git a/test/vim_test.js b/test/vim_test.js index dd2f7fa48..9f0e5f768 100644 --- a/test/vim_test.js +++ b/test/vim_test.js @@ -2954,6 +2954,20 @@ testVim('._visual_>', function(cm, vim, helpers) { eq(' 1\n 2\n 3\n 4', cm.getValue()); helpers.assertCursorAt(2, 2); }, { value: '1\n2\n3\n4'}); +testVim('._replace_repeat', function(cm, vim, helpers) { + helpers.doKeys('R'); + cm.replaceRange('123', cm.getCursor(), offsetCursor(cm.getCursor(), 0, 3)); + cm.setCursor(0, 3); + helpers.doKeys('<Esc>'); + helpers.doKeys('2', '.'); + eq('12123123\nabcdefg', cm.getValue()); + helpers.assertCursorAt(0, 7); + cm.setCursor(1, 0); + helpers.doKeys('.'); + eq('12123123\n123123g', cm.getValue()); + helpers.doKeys('l', '"', '.', 'p'); + eq('12123123\n123123g123', cm.getValue()); +}, { value: 'abcdef\nabcdefg'}); testVim('f;', function(cm, vim, helpers) { cm.setCursor(0, 0); helpers.doKeys('f', 'x'); -- GitLab