mirror of
https://github.com/VSCodeVim/Vim.git
synced 2024-10-26 20:23:50 +03:00
refactor: dupe cursors
This commit is contained in:
parent
ad983feda7
commit
ce1129d26d
@ -642,30 +642,6 @@ export class ModeHandler implements vscode.Disposable {
|
||||
this.vimState.lastVisualSelectionEnd = this.vimState.cursorStopPosition;
|
||||
}
|
||||
|
||||
// Make sure no two cursors are at the same location.
|
||||
// This is a consequence of the fact that allCursors is not a Set.
|
||||
|
||||
// TODO: It should be a set.
|
||||
|
||||
const resultingList: Range[] = [];
|
||||
|
||||
for (const cursor of vimState.cursors) {
|
||||
let shouldAddToList = true;
|
||||
|
||||
for (const alreadyAddedCursor of resultingList) {
|
||||
if (cursor.equals(alreadyAddedCursor)) {
|
||||
shouldAddToList = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldAddToList) {
|
||||
resultingList.push(cursor);
|
||||
}
|
||||
}
|
||||
|
||||
vimState.cursors = resultingList;
|
||||
|
||||
return vimState;
|
||||
}
|
||||
|
||||
|
@ -152,13 +152,17 @@ export class VimState implements vscode.Disposable {
|
||||
return this._cursors;
|
||||
}
|
||||
public set cursors(value: Range[]) {
|
||||
const map = new Map<string, Range>();
|
||||
for (const cursor of value) {
|
||||
if (!cursor.isValid(this.editor)) {
|
||||
this.logger.warn(`invalid cursor position. ${cursor.toString()}.`);
|
||||
}
|
||||
|
||||
// use a map to ensure no two cursors are at the same location.
|
||||
map.set(cursor.toString(), cursor);
|
||||
}
|
||||
|
||||
this._cursors = value;
|
||||
this._cursors = Array.from(map.values());
|
||||
this.isMultiCursor = this._cursors.length > 1;
|
||||
}
|
||||
|
||||
|
51
test/state/vimState.test.ts
Normal file
51
test/state/vimState.test.ts
Normal file
@ -0,0 +1,51 @@
|
||||
import * as assert from 'assert';
|
||||
import * as vscode from 'vscode';
|
||||
import { Position } from '../../src/common/motion/position';
|
||||
import { Range } from '../../src/common/motion/range';
|
||||
import { VimState } from '../../src/state/vimState';
|
||||
import { setupWorkspace, cleanUpWorkspace } from '../testUtils';
|
||||
|
||||
suite('VimState', () => {
|
||||
setup(async () => {
|
||||
await setupWorkspace();
|
||||
});
|
||||
|
||||
teardown(cleanUpWorkspace);
|
||||
|
||||
test('de-dupes cursors', () => {
|
||||
// setup
|
||||
const vimState = new VimState(vscode.window.activeTextEditor!);
|
||||
const cursorStart = new Position(0, 0);
|
||||
const cursorStop = new Position(0, 1);
|
||||
const initialCursors = [
|
||||
new Range(cursorStart, cursorStop),
|
||||
new Range(cursorStart, cursorStop)
|
||||
];
|
||||
|
||||
// test
|
||||
vimState.cursors = initialCursors;
|
||||
|
||||
// assert
|
||||
assert.equal(vimState.cursors.length, 1);
|
||||
});
|
||||
|
||||
test('cursorStart/cursorStop should be first cursor in cursors', () => {
|
||||
// setup
|
||||
const vimState = new VimState(vscode.window.activeTextEditor!);
|
||||
const cursorStart = new Position(0, 0);
|
||||
const cursorStop = new Position(0, 1);
|
||||
const initialCursors = [
|
||||
new Range(cursorStart, cursorStop),
|
||||
new Range(new Position(1, 0), new Position(1, 1))
|
||||
];
|
||||
|
||||
// test
|
||||
vimState.cursors = initialCursors;
|
||||
|
||||
// assert
|
||||
assert.equal(vimState.cursors.length, 2);
|
||||
assert.equal(vimState.isMultiCursor, true);
|
||||
vimState.cursorStartPosition = cursorStart;
|
||||
vimState.cursorStopPosition = cursorStop;
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue
Block a user