Skip to content

Commit 29be39a

Browse files
committed
[vim] Fix update marks on mouse selection
1 parent 6d04226 commit 29be39a

File tree

2 files changed

+28
-15
lines changed

2 files changed

+28
-15
lines changed

keymap/vim.js

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -629,16 +629,6 @@
629629
return true;
630630
}
631631
}
632-
function handleExternalSelection() {
633-
// Enter visual mode when the mouse selects text.
634-
if (!vim.visualMode && !vim.insertMode &&
635-
!cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) {
636-
vim.visualMode = true;
637-
vim.visualLine = false;
638-
CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"});
639-
cm.on('mousedown', exitVisualMode);
640-
}
641-
}
642632
function doKeyToKey(keys) {
643633
// TODO: prevent infinite recursion.
644634
var match;
@@ -689,7 +679,6 @@
689679

690680
function handleKeyNonInsertMode() {
691681
if (handleMacroRecording() || handleEsc()) { return true; };
692-
handleExternalSelection();
693682

694683
var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key;
695684
if (/^[1-9]\d*$/.test(keys)) { return true; }
@@ -4738,10 +4727,7 @@
47384727
} else if (cm.doc.history.lastSelOrigin == '*mouse') {
47394728
// Reset lastHPos if mouse click was done in normal mode.
47404729
vim.lastHPos = cm.doc.getCursor().ch;
4741-
if (cm.somethingSelected()) {
4742-
// If something is still selected, enter visual mode.
4743-
vim.visualMode = true;
4744-
}
4730+
handleExternalSelection(cm, vim);
47454731
}
47464732
if (vim.visualMode) {
47474733
var from, head;
@@ -4760,6 +4746,22 @@
47604746
}
47614747
}
47624748

4749+
function handleExternalSelection(cm, vim) {
4750+
var anchor = cm.getCursor('anchor');
4751+
var head = cm.getCursor('head');
4752+
// Enter visual mode when the mouse selects text.
4753+
if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) {
4754+
vim.visualMode = true;
4755+
vim.visualLine = false;
4756+
CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"});
4757+
cm.on('mousedown', exitVisualMode);
4758+
}
4759+
if (vim.visualMode) {
4760+
updateMark(cm, vim, '<', cursorMin(head, anchor));
4761+
updateMark(cm, vim, '>', cursorMax(head, anchor));
4762+
}
4763+
}
4764+
47634765
/** Wrapper for special keys pressed in insert mode */
47644766
function InsertModeKey(keyName) {
47654767
this.keyName = keyName;

test/vim_test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,6 +1147,17 @@ testSelection('viw_eol', 'foo \tbAr', /r/, 'viw', 'bAr');
11471147
testSelection('vi{_middle_spc', 'a{\n\tbar\n\t}b', /r/, 'vi{', '\n\tbar\n\t');
11481148
testSelection('va{_middle_spc', 'a{\n\tbar\n\t}b', /r/, 'va{', '{\n\tbar\n\t}');
11491149

1150+
testVim('mouse_select', function(cm, vim, helpers) {
1151+
cm.setSelection(Pos(0, 2), Pos(0, 4), {origin: '*mouse'});
1152+
is(cm.state.vim.visualMode);
1153+
is(!cm.state.vim.visualLine);
1154+
is(!cm.state.vim.visualBlock);
1155+
helpers.doKeys('<Esc>');
1156+
is(!cm.somethingSelected());
1157+
helpers.doKeys('g', 'v');
1158+
eq('cd', cm.getSelection());
1159+
}, {value: 'abcdef'});
1160+
11501161
// Operator-motion tests
11511162
testVim('D', function(cm, vim, helpers) {
11521163
cm.setCursor(0, 3);

0 commit comments

Comments
 (0)