Skip to content

Commit 32da49c

Browse files
nightwingmarijnh
authored andcommitted
[vim] fix R key in visual mode
1 parent 4d0e99d commit 32da49c

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

keymap/vim.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@
180180
{ keys: '@<character>', type: 'action', action: 'replayMacro' },
181181
{ keys: 'q<character>', type: 'action', action: 'enterMacroRecordMode' },
182182
// Handle Replace-mode as a special case of insert mode.
183-
{ keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }},
183+
{ keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal'},
184+
{ keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true},
184185
{ keys: 'u', type: 'action', action: 'undo', context: 'normal' },
185186
{ keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true },
186187
{ keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true },
@@ -1293,6 +1294,10 @@
12931294
}
12941295
inputState.operator = command.operator;
12951296
inputState.operatorArgs = copyArgs(command.operatorArgs);
1297+
if (command.exitVisualBlock) {
1298+
vim.visualBlock = false;
1299+
updateCmSelection(cm);
1300+
}
12961301
if (vim.visualMode) {
12971302
// Operating on a selection in visual mode. We don't need a motion.
12981303
this.evalInput(cm, vim);
@@ -2104,9 +2109,9 @@
21042109
change: function(cm, args, ranges) {
21052110
var finalHead, text;
21062111
var vim = cm.state.vim;
2112+
var anchor = ranges[0].anchor,
2113+
head = ranges[0].head;
21072114
if (!vim.visualMode) {
2108-
var anchor = ranges[0].anchor,
2109-
head = ranges[0].head;
21102115
text = cm.getRange(anchor, head);
21112116
var lastState = vim.lastEditInputState || {};
21122117
if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) {
@@ -2134,6 +2139,13 @@
21342139
anchor.ch = Number.MAX_VALUE;
21352140
}
21362141
finalHead = anchor;
2142+
} else if (args.fullLine) {
2143+
head.ch = Number.MAX_VALUE;
2144+
head.line--;
2145+
cm.setSelection(anchor, head)
2146+
text = cm.getSelection();
2147+
cm.replaceSelection("");
2148+
finalHead = anchor;
21372149
} else {
21382150
text = cm.getSelection();
21392151
var replacement = fillArray('', ranges.length);

test/driver.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ function indexOf(collection, elt) {
1111
}
1212

1313
function test(name, run, expectedFail) {
14+
if (!/^vim/.test(name)) return
15+
console.log(name)
1416
// Force unique names
1517
var originalName = name;
1618
var i = 2; // Second function would be NAME_2

test/vim_test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1800,6 +1800,18 @@ testVim('R', function(cm, vim, helpers) {
18001800
eq('vim-replace', cm.getOption('keyMap'));
18011801
is(cm.state.overwrite, 'Setting overwrite state failed');
18021802
});
1803+
testVim('R_visual', function(cm, vim, helpers) {
1804+
helpers.doKeys('<C-v>', 'j', 'R', '0', '<Esc>');
1805+
eq('0\nb33\nc44\nc55', cm.getValue());
1806+
helpers.doKeys('2', 'j', '.');
1807+
eq('0\nb33\n0', cm.getValue());
1808+
helpers.doKeys('k', 'v', 'R', '1', '<Esc>');
1809+
eq('0\n1\n0', cm.getValue());
1810+
helpers.doKeys('k', '.');
1811+
eq('1\n1\n0', cm.getValue());
1812+
helpers.doKeys('p');
1813+
eq('1\n0\n1\n0', cm.getValue());
1814+
}, {value: 'a11\na22\nb33\nc44\nc55'});
18031815
testVim('mark', function(cm, vim, helpers) {
18041816
cm.setCursor(2, 2);
18051817
helpers.doKeys('m', 't');

0 commit comments

Comments
 (0)