diff --git a/keymap/vim.js b/keymap/vim.js index 7309086c51b83beed2764ce0b9f90ec73b5a275d..0dbbae734bcc46d7ae9225a50852c0b9539ce421 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 dd2f7fa48d758d3eaddf91b4dda18da8030b562e..9f0e5f768369b69708142216059365118b12484b 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');