Skip to content

Commit 52de20c

Browse files
nightwingmarijnh
authored andcommitted
[vim] fix . repeat after replace
1 parent 341eeb9 commit 52de20c

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

keymap/vim.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4921,7 +4921,7 @@
49214921
* Listens for changes made in insert mode.
49224922
* Should only be active in insert mode.
49234923
*/
4924-
function onChange(_cm, changeObj) {
4924+
function onChange(cm, changeObj) {
49254925
var macroModeState = vimGlobalState.macroModeState;
49264926
var lastChange = macroModeState.lastInsertModeChanges;
49274927
if (!macroModeState.isPlaying) {
@@ -4934,7 +4934,11 @@
49344934
lastChange.changes = [];
49354935
lastChange.maybeReset = false;
49364936
}
4937-
lastChange.changes.push(text);
4937+
if (cm.state.overwrite && !/\n/.test(text)) {
4938+
lastChange.changes.push([text]);
4939+
} else {
4940+
lastChange.changes.push(text);
4941+
}
49384942
}
49394943
// Change objects may be chained with next.
49404944
changeObj = changeObj.next;
@@ -5116,9 +5120,13 @@
51165120
var change = changes[j];
51175121
if (change instanceof InsertModeKey) {
51185122
CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler);
5119-
} else {
5123+
} else if (typeof change == "string") {
51205124
var cur = cm.getCursor();
51215125
cm.replaceRange(change, cur, cur);
5126+
} else {
5127+
var start = cm.getCursor();
5128+
var end = offsetCursor(start, 0, change[0].length);
5129+
cm.replaceRange(change[0], start, end);
51225130
}
51235131
}
51245132
}

test/vim_test.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2954,6 +2954,20 @@ testVim('._visual_>', function(cm, vim, helpers) {
29542954
eq(' 1\n 2\n 3\n 4', cm.getValue());
29552955
helpers.assertCursorAt(2, 2);
29562956
}, { value: '1\n2\n3\n4'});
2957+
testVim('._replace_repeat', function(cm, vim, helpers) {
2958+
helpers.doKeys('R');
2959+
cm.replaceRange('123', cm.getCursor(), offsetCursor(cm.getCursor(), 0, 3));
2960+
cm.setCursor(0, 3);
2961+
helpers.doKeys('<Esc>');
2962+
helpers.doKeys('2', '.');
2963+
eq('12123123\nabcdefg', cm.getValue());
2964+
helpers.assertCursorAt(0, 7);
2965+
cm.setCursor(1, 0);
2966+
helpers.doKeys('.');
2967+
eq('12123123\n123123g', cm.getValue());
2968+
helpers.doKeys('l', '"', '.', 'p');
2969+
eq('12123123\n123123g123', cm.getValue());
2970+
}, { value: 'abcdef\nabcdefg'});
29572971
testVim('f;', function(cm, vim, helpers) {
29582972
cm.setCursor(0, 0);
29592973
helpers.doKeys('f', 'x');

0 commit comments

Comments
 (0)