Skip to content

Commit

Permalink
Merge pull request #1399 from xconverge/use-users-cursor-style
Browse files Browse the repository at this point in the history
Allow users to use their own cursor style for insert from editor.cursorStyle
  • Loading branch information
xconverge committed Mar 25, 2017
2 parents e02363e + 7d78a28 commit 84d209f
Show file tree
Hide file tree
Showing 29 changed files with 163 additions and 133 deletions.
1 change: 0 additions & 1 deletion .vscode/settings.json
Expand Up @@ -6,7 +6,6 @@
"search.exclude": {
"out": true // set this to false to include "out" folder in search results
},
"editor.cursorStyle": "line",
"typescript.tsdk": "./node_modules/typescript/lib", // we want to use the TS server from our node_modules folder to control its version
"editor.tabSize": 2,
"editor.insertSpaces": true,
Expand Down
16 changes: 8 additions & 8 deletions extension.ts
Expand Up @@ -91,7 +91,7 @@ export async function getAndUpdateModeHandler(): Promise<ModeHandler> {

const handler = modeHandlerToEditorIdentity[activeEditorId.toString()];

handler.vimState.editor = vscode.window.activeTextEditor;
handler.vimState.editor = vscode.window.activeTextEditor!;

if (previousActiveEditorId.hasSameBuffer(activeEditorId)) {
if (!previousActiveEditorId.isEqual(activeEditorId)) {
Expand All @@ -114,16 +114,16 @@ export async function getAndUpdateModeHandler(): Promise<ModeHandler> {
// Temporary workaround for vscode bug not changing cursor style properly
// https://github.com/Microsoft/vscode/issues/17472
// https://github.com/Microsoft/vscode/issues/17513
const options = vscode.window.activeTextEditor.options;
const options = handler.vimState.editor.options;
const desiredStyle = options.cursorStyle;

// Temporarily change to any other cursor style besides the desired type, then change back
if (desiredStyle === vscode.TextEditorCursorStyle.Block) {
vscode.window.activeTextEditor.options.cursorStyle = vscode.TextEditorCursorStyle.Line;
vscode.window.activeTextEditor.options.cursorStyle = desiredStyle;
handler.vimState.editor.options.cursorStyle = vscode.TextEditorCursorStyle.Line;
handler.vimState.editor.options.cursorStyle = desiredStyle;
} else {
vscode.window.activeTextEditor.options.cursorStyle = vscode.TextEditorCursorStyle.Block;
vscode.window.activeTextEditor.options.cursorStyle = desiredStyle;
handler.vimState.editor.options.cursorStyle = vscode.TextEditorCursorStyle.Block;
handler.vimState.editor.options.cursorStyle = desiredStyle;
}

return handler;
Expand Down Expand Up @@ -211,8 +211,8 @@ export async function activate(context: vscode.ExtensionContext) {
text: args.text,
replaceCharCnt: args.replaceCharCnt
});
mh.vimState.cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
mh.vimState.cursorStartPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
mh.vimState.cursorPosition = Position.FromVSCodePosition(mh.vimState.editor.selection.start);
mh.vimState.cursorStartPosition = Position.FromVSCodePosition(mh.vimState.editor.selection.start);
}
},
isRunning: false
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -24,7 +24,7 @@
"url": "https://github.com/VSCodeVim/Vim/issues"
},
"engines": {
"vscode": "^1.6.0"
"vscode": "^1.10.0"
},
"categories": [
"Other",
Expand Down
80 changes: 40 additions & 40 deletions src/actions/actions.ts
Expand Up @@ -232,12 +232,12 @@ export class DocumentContentChangeAction extends BaseAction {
rightBoundary = newRightBoundary;
}

vscode.window.activeTextEditor.selection = new vscode.Selection(newStart, newEnd);
vimState.editor.selection = new vscode.Selection(newStart, newEnd);

if (newStart.isEqual(newEnd)) {
await TextEditor.insert(contentChange.text, Position.FromVSCodePosition(newStart));
} else {
await TextEditor.replace(vscode.window.activeTextEditor.selection, contentChange.text);
await TextEditor.replace(vimState.editor.selection, contentChange.text);
}
}

Expand Down Expand Up @@ -564,7 +564,7 @@ export class CommandInsertInInsertMode extends BaseCommand {
// If the line is empty except whitespace, backspace should return to
// the next lowest level of indentation.

const tabSize = vscode.window.activeTextEditor.options.tabSize as number;
const tabSize = vimState.editor.options.tabSize as number;
const desiredLineLength = Math.floor((line.length - 1) / tabSize) * tabSize;

vimState.recordedState.transformations.push({
Expand Down Expand Up @@ -690,8 +690,8 @@ class CommandInsertRegisterContent extends BaseCommand {

await TextEditor.insertAt(text, position);
vimState.currentMode = ModeName.Insert;
vimState.cursorStartPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
vimState.cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
vimState.cursorStartPosition = Position.FromVSCodePosition(vimState.editor.selection.start);
vimState.cursorPosition = Position.FromVSCodePosition(vimState.editor.selection.start);

return vimState;
}
Expand Down Expand Up @@ -951,7 +951,7 @@ class CommandEscInsertMode extends BaseCommand {
// ie, o/O in Normal mode or \n in Insert mode.
const lastActionBeforeEsc = vimState.keyHistory[vimState.keyHistory.length - 2];
if (['o', 'O', '\n'].indexOf(lastActionBeforeEsc) > -1 &&
vscode.window.activeTextEditor.document.languageId !== 'plaintext' &&
vimState.editor.document.languageId !== 'plaintext' &&
/^\s+$/.test(TextEditor.getLineAt(position).text)) {
vimState.recordedState.transformations.push({
type: "deleteRange",
Expand Down Expand Up @@ -1080,8 +1080,8 @@ export class CommandInsertPreviousText extends BaseCommand {
}
}

vimState.cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.end);
vimState.cursorStartPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
vimState.cursorPosition = Position.FromVSCodePosition(vimState.editor.selection.end);
vimState.cursorStartPosition = Position.FromVSCodePosition(vimState.editor.selection.start);
vimState.currentMode = ModeName.Insert;
return vimState;
}
Expand Down Expand Up @@ -1118,8 +1118,8 @@ class CommandInsertBelowChar extends BaseCommand {
const char = TextEditor.getText(new vscode.Range(charBelowCursorPosition, charBelowCursorPosition.getRight()));
await TextEditor.insert(char, position);

vimState.cursorStartPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
vimState.cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
vimState.cursorStartPosition = Position.FromVSCodePosition(vimState.editor.selection.start);
vimState.cursorPosition = Position.FromVSCodePosition(vimState.editor.selection.start);

return vimState;
}
Expand All @@ -1133,7 +1133,7 @@ class CommandInsertIndentInCurrentLine extends BaseCommand {
public async exec(position: Position, vimState: VimState): Promise<VimState> {
const originalText = TextEditor.getLineAt(position).text;
const indentationWidth = TextEditor.getIndentationLevel(originalText);
const tabSize = Configuration.tabstop || Number(vscode.window.activeTextEditor.options.tabSize);
const tabSize = Configuration.tabstop || Number(vimState.editor.options.tabSize);
const newIndentationWidth = (indentationWidth / tabSize + 1) * tabSize;

TextEditor.replaceText(
Expand Down Expand Up @@ -1239,8 +1239,8 @@ class CommandInsertAboveChar extends BaseCommand {
const char = TextEditor.getText(new vscode.Range(charAboveCursorPosition, charAboveCursorPosition.getRight()));
await TextEditor.insert(char, position);

vimState.cursorStartPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
vimState.cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
vimState.cursorStartPosition = Position.FromVSCodePosition(vimState.editor.selection.start);
vimState.cursorPosition = Position.FromVSCodePosition(vimState.editor.selection.start);

return vimState;
}
Expand Down Expand Up @@ -1589,7 +1589,7 @@ class CommandOverrideCopy extends BaseCommand {
const start = Position.EarlierOf(range.start, range.stop);
const stop = Position.LaterOf(range.start, range.stop);

return vscode.window.activeTextEditor.document.getText(new vscode.Range(
return vimState.editor.document.getText(new vscode.Range(
start,
vimState.currentMode === ModeName.Insert ?
stop :
Expand All @@ -1598,7 +1598,7 @@ class CommandOverrideCopy extends BaseCommand {
}).join("\n");
} else if (vimState.currentMode === ModeName.VisualLine) {
text = vimState.allCursors.map(range => {
return vscode.window.activeTextEditor.document.getText(new vscode.Range(
return vimState.editor.document.getText(new vscode.Range(
range.start.getLineBegin(),
range.stop.getLineEnd()
));
Expand Down Expand Up @@ -1873,7 +1873,7 @@ export class DeleteOperator extends BaseOperator {
}
}

let text = vscode.window.activeTextEditor.document.getText(new vscode.Range(start, end));
let text = vimState.editor.document.getText(new vscode.Range(start, end));

// If we delete linewise to the final line of the document, we expect the line
// to be removed. This is actually a special case because the newline
Expand Down Expand Up @@ -2054,7 +2054,7 @@ export class FormatOperator extends BaseOperator {
public modes = [ModeName.Normal, ModeName.Visual, ModeName.VisualLine, ModeName.VisualBlock];

public async run(vimState: VimState, start: Position, end: Position): Promise<VimState> {
vscode.window.activeTextEditor.selection = new vscode.Selection(start, end);
vimState.editor.selection = new vscode.Selection(start, end);
await vscode.commands.executeCommand("editor.action.formatSelection");
let line = vimState.cursorStartPosition.line;

Expand All @@ -2077,7 +2077,7 @@ export class UpperCaseOperator extends BaseOperator {

public async run(vimState: VimState, start: Position, end: Position): Promise<VimState> {
const range = new vscode.Range(start, new Position(end.line, end.character + 1));
let text = vscode.window.activeTextEditor.document.getText(range);
let text = vimState.editor.document.getText(range);

await TextEditor.replace(range, text.toUpperCase());

Expand All @@ -2101,7 +2101,7 @@ export class LowerCaseOperator extends BaseOperator {

public async run(vimState: VimState, start: Position, end: Position): Promise<VimState> {
const range = new vscode.Range(start, new Position(end.line, end.character + 1));
let text = vscode.window.activeTextEditor.document.getText(range);
let text = vimState.editor.document.getText(range);

await TextEditor.replace(range, text.toLowerCase());

Expand Down Expand Up @@ -2471,7 +2471,7 @@ class IndentOperator extends BaseOperator {
keys = [">"];

public async run(vimState: VimState, start: Position, end: Position): Promise<VimState> {
vscode.window.activeTextEditor.selection = new vscode.Selection(start.getLineBegin(), end.getLineEnd());
vimState.editor.selection = new vscode.Selection(start.getLineBegin(), end.getLineEnd());

await vscode.commands.executeCommand("editor.action.indentLines");

Expand Down Expand Up @@ -2514,7 +2514,7 @@ class OutdentOperator extends BaseOperator {
keys = ["<"];

public async run(vimState: VimState, start: Position, end: Position): Promise<VimState> {
vscode.window.activeTextEditor.selection = new vscode.Selection(start, end);
vimState.editor.selection = new vscode.Selection(start, end);

await vscode.commands.executeCommand("editor.action.outdentLines");
vimState.currentMode = ModeName.Normal;
Expand Down Expand Up @@ -2722,7 +2722,7 @@ class CommandCenterScroll extends BaseCommand {

public async exec(position: Position, vimState: VimState): Promise<VimState> {
// In these modes you want to center on the cursor position
vscode.window.activeTextEditor.revealRange(
vimState.editor.revealRange(
new vscode.Range(vimState.cursorPosition,
vimState.cursorPosition),
vscode.TextEditorRevealType.InCenter);
Expand Down Expand Up @@ -2995,12 +2995,12 @@ class CommandGoToDefinition extends BaseCommand {
keys = ["g", "d"];

public async exec(position: Position, vimState: VimState): Promise<VimState> {
const oldActiveEditor = vscode.window.activeTextEditor;
const oldActiveEditor = vimState.editor;

await vscode.commands.executeCommand("editor.action.goToDeclaration");

if (oldActiveEditor === vscode.window.activeTextEditor) {
vimState.cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
if (oldActiveEditor === vimState.editor) {
vimState.cursorPosition = Position.FromVSCodePosition(vimState.editor.selection.start);
}

return vimState;
Expand Down Expand Up @@ -3153,12 +3153,12 @@ class CommandNavigateBack extends BaseCommand {
runsOnceForEveryCursor() { return false; }

public async exec(position: Position, vimState: VimState): Promise<VimState> {
const oldActiveEditor = vscode.window.activeTextEditor;
const oldActiveEditor = vimState.editor;

await vscode.commands.executeCommand('workbench.action.navigateBack');

if (oldActiveEditor === vscode.window.activeTextEditor) {
vimState.cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
if (oldActiveEditor === vimState.editor) {
vimState.cursorPosition = Position.FromVSCodePosition(vimState.editor.selection.start);
}

return vimState;
Expand All @@ -3172,12 +3172,12 @@ class CommandNavigateForward extends BaseCommand {
runsOnceForEveryCursor() { return false; }

public async exec(position: Position, vimState: VimState): Promise<VimState> {
const oldActiveEditor = vscode.window.activeTextEditor;
const oldActiveEditor = vimState.editor;

await vscode.commands.executeCommand('workbench.action.navigateForward');

if (oldActiveEditor === vscode.window.activeTextEditor) {
vimState.cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
if (oldActiveEditor === vimState.editor) {
vimState.cursorPosition = Position.FromVSCodePosition(vimState.editor.selection.start);
}

return vimState;
Expand Down Expand Up @@ -3605,15 +3605,15 @@ abstract class MoveByScreenLine extends BaseMovement {
});

if (vimState.currentMode === ModeName.Normal) {
return Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.active);
return Position.FromVSCodePosition(vimState.editor.selection.active);
} else {
/**
* cursorMove command is handling the selection for us.
* So we are not following our design principal (do no real movement inside an action) here.
*/

let start = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
let stop = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.end);
let start = Position.FromVSCodePosition(vimState.editor.selection.start);
let stop = Position.FromVSCodePosition(vimState.editor.selection.end);

// We want to swap the cursor start stop positions based on which direction we are moving, up or down
if (start.line < position.line) {
Expand All @@ -3633,8 +3633,8 @@ abstract class MoveByScreenLine extends BaseMovement {
});

return {
start: Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start),
stop: Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.end)
start: Position.FromVSCodePosition(vimState.editor.selection.start),
stop: Position.FromVSCodePosition(vimState.editor.selection.end)
};
}
}
Expand Down Expand Up @@ -4262,8 +4262,8 @@ class ActionJoinVisualMode extends BaseCommand {

public async exec(position: Position, vimState: VimState): Promise<VimState> {
let actionJoin = new ActionJoin();
let start = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
let end = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.end);
let start = Position.FromVSCodePosition(vimState.editor.selection.start);
let end = Position.FromVSCodePosition(vimState.editor.selection.end);

if (start.isAfter(end)) {
[start, end] = [end, start];
Expand Down Expand Up @@ -4541,8 +4541,8 @@ class ActionJoinNoWhitespaceVisualMode extends BaseCommand {

public async exec(position: Position, vimState: VimState): Promise<VimState> {
let actionJoin = new ActionJoinNoWhitespace();
let start = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start);
let end = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.end);
let start = Position.FromVSCodePosition(vimState.editor.selection.start);
let end = Position.FromVSCodePosition(vimState.editor.selection.end);

if (start.line === end.line) {
return vimState;
Expand Down
20 changes: 10 additions & 10 deletions src/cmd_line/commands/deleteRange.ts
Expand Up @@ -26,7 +26,7 @@ export class DeleteRangeCommand extends node.CommandBase {
return this._arguments;
}

async deleteRange(start: Position, end: Position): Promise<string> {
async deleteRange(start: Position, end: Position, modeHandler: ModeHandler): Promise<string> {
start = start.getLineBegin();
end = end.getLineEnd();
end = Position.FromVSCodePosition(end.with(end.line, end.character + 1));
Expand All @@ -41,7 +41,7 @@ export class DeleteRangeCommand extends node.CommandBase {
start = start.getPreviousLineBegin().getLineEnd();
}

let text = vscode.window.activeTextEditor.document.getText(new vscode.Range(start, end));
let text = modeHandler.vimState.editor.document.getText(new vscode.Range(start, end));
text = text.endsWith("\r\n") ? text.slice(0, -2) : text.slice(0, -1);
await TextEditor.delete(new vscode.Range(start, end));

Expand All @@ -53,17 +53,17 @@ export class DeleteRangeCommand extends node.CommandBase {
}

resultPosition = resultPosition.getLineBegin();
vscode.window.activeTextEditor.selection = new vscode.Selection(resultPosition, resultPosition);
modeHandler.vimState.editor.selection = new vscode.Selection(resultPosition, resultPosition);
return text;
}

async execute(): Promise<void> {
if (!vscode.window.activeTextEditor) {
async execute(modeHandler: ModeHandler): Promise<void> {
if (!modeHandler.vimState.editor) {
return;
}

let cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.active);
let text = await this.deleteRange(cursorPosition, cursorPosition);
let cursorPosition = Position.FromVSCodePosition(modeHandler.vimState.editor.selection.active);
let text = await this.deleteRange(cursorPosition, cursorPosition, modeHandler);
Register.putByKey(text, this._arguments.register, RegisterMode.LineWise);
}

Expand All @@ -75,11 +75,11 @@ export class DeleteRangeCommand extends node.CommandBase {
start = new vscode.Position(0, 0);
end = new vscode.Position(TextEditor.getLineCount() - 1, 0);
} else {
start = range.lineRefToPosition(vscode.window.activeTextEditor, range.left, modeHandler);
end = range.lineRefToPosition(vscode.window.activeTextEditor, range.right, modeHandler);
start = range.lineRefToPosition(modeHandler.vimState.editor, range.left, modeHandler);
end = range.lineRefToPosition(modeHandler.vimState.editor, range.right, modeHandler);
}

let text = await this.deleteRange(Position.FromVSCodePosition(start), Position.FromVSCodePosition(end));
let text = await this.deleteRange(Position.FromVSCodePosition(start), Position.FromVSCodePosition(end), modeHandler);
Register.putByKey(text, this._arguments.register, RegisterMode.LineWise);
}
}

0 comments on commit 84d209f

Please sign in to comment.