Skip to content

Commit

Permalink
Merge pull request #1717 from Chillee/1715
Browse files Browse the repository at this point in the history
Fixes #1715: Adds multicursor paste
  • Loading branch information
Chillee authored May 20, 2017
2 parents 8a18971 + 4050124 commit 15df445
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 20 deletions.
8 changes: 7 additions & 1 deletion src/actions/commands/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1089,6 +1089,10 @@ export class PutCommand extends BaseCommand {
runsOnceForEachCountPrefix = true;
canBeRepeatedWithDot = true;

constructor(multicursorIndex?: number) {
super();
this.multicursorIndex = multicursorIndex;
}
public static async GetText(vimState: VimState, multicursorIndex: number | undefined = undefined): Promise<string> {
const register = await Register.get(vimState);

Expand Down Expand Up @@ -1350,11 +1354,12 @@ export class PutCommandVisual extends BaseCommand {
// The reason we need to handle Delete and Yank separately is because of
// linewise mode. If we're in visualLine mode, then we want to copy
// linewise but not necessarily delete linewise.
let result = await new PutCommand().exec(start, vimState, true);
let result = await new PutCommand(this.multicursorIndex).exec(start, vimState, true);
result.currentRegisterMode = isLineWise ? RegisterMode.LineWise : RegisterMode.CharacterWise;
result = await new operator.YankOperator(this.multicursorIndex).run(result, start, end);
result.currentRegisterMode = RegisterMode.CharacterWise;
result = await new operator.DeleteOperator(this.multicursorIndex).run(result, start, end.getLeftIfEOL(), false);
result.currentRegisterMode = RegisterMode.FigureItOutFromCurrentMode;
return result;

}
Expand Down Expand Up @@ -1771,6 +1776,7 @@ class CommandExitVisualMode extends BaseCommand {
class CommandVisualMode extends BaseCommand {
modes = [ModeName.Normal];
keys = ["v"];
isCompleteAction = false;

public async exec(position: Position, vimState: VimState): Promise<VimState> {
vimState.currentMode = ModeName.Visual;
Expand Down
34 changes: 15 additions & 19 deletions src/mode/modeHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1019,10 +1019,7 @@ export class ModeHandler implements vscode.Disposable {
}

ranRepeatableAction = (ranRepeatableAction && vimState.currentMode === ModeName.Normal) || this.createUndoPointForBrackets(vimState);

// Don't record an undo point for every action of a macro, only at the very end

ranAction = ranAction && vimState.currentMode === ModeName.Normal;
ranAction = ranAction && (vimState.currentMode === ModeName.Normal || vimState.currentMode === ModeName.Visual);

// Record down previous action and flush temporary state
if (ranRepeatableAction) {
Expand All @@ -1033,6 +1030,20 @@ export class ModeHandler implements vscode.Disposable {
}
}

// Updated desired column
const movement = action instanceof BaseMovement ? action : undefined;

if ((movement && !movement.doesntChangeDesiredColumn) ||
(!movement && vimState.currentMode !== ModeName.VisualBlock)) {
// We check !operator here because e.g. d$ should NOT set the desired column to EOL.

if (movement && movement.setsDesiredColumnToEOL && !recordedState.operator) {
vimState.desiredColumn = Number.POSITIVE_INFINITY;
} else {
vimState.desiredColumn = vimState.cursorPosition.character;
}
}

if (ranAction) {
vimState.recordedState = new RecordedState();

Expand Down Expand Up @@ -1106,21 +1117,6 @@ export class ModeHandler implements vscode.Disposable {
this._vimState.lastVisualSelectionEnd = this._vimState.cursorPosition;
}

// Updated desired column

const movement = action instanceof BaseMovement ? action : undefined;

if ((movement && !movement.doesntChangeDesiredColumn) ||
(recordedState.command &&
vimState.currentMode !== ModeName.VisualBlock)) {
// We check !operator here because e.g. d$ should NOT set the desired column to EOL.

if (movement && movement.setsDesiredColumnToEOL && !recordedState.operator) {
vimState.desiredColumn = Number.POSITIVE_INFINITY;
} else {
vimState.desiredColumn = vimState.cursorPosition.character;
}
}

// Make sure no two cursors are at the same location.
// This is a consequence of the fact that allCursors is not a Set.
Expand Down

0 comments on commit 15df445

Please sign in to comment.