Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Reduce diff
  • Loading branch information
alexdima committed Nov 18, 2020
commit 6d439732d78d80dc791e7c07f7243e8377d9021e
114 changes: 70 additions & 44 deletions src/vs/editor/common/controller/cursorWordOperations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -374,24 +374,43 @@ export class WordOperations {
return null;
}

protected static _determineDeleteRange(wordSeparators: WordCharacterClassifier, model: ICursorSimpleModel, wordNavigationType: WordNavigationType, position: Position, isEntire: boolean): Range {
public static deleteWordLeft(ctx: DeleteWordContext, wordNavigationType: WordNavigationType): Range | null {
const wordSeparators = ctx.wordSeparators;
const model = ctx.model;
const selection = ctx.selection;
const whitespaceHeuristics = ctx.whitespaceHeuristics;

if (!selection.isEmpty()) {
return selection;
}

if (DeleteOperations.isAutoClosingPairDelete(ctx.autoClosingBrackets, ctx.autoClosingQuotes, ctx.autoClosingPairs.autoClosingPairsOpenByEnd, ctx.model, [ctx.selection])) {
const position = ctx.selection.getPosition();
return new Range(position.lineNumber, position.column - 1, position.lineNumber, position.column + 1);
}

const position = new Position(selection.positionLineNumber, selection.positionColumn);

let lineNumber = position.lineNumber;
let column = position.column;
let columnEnd = position.column;
let lineContent = model.getLineContent(position.lineNumber);

if (lineNumber === 1 && column === 1) {
// Ignore deleting at beginning of file
return null;
}

if (whitespaceHeuristics) {
let r = this._deleteWordLeftWhitespace(model, position);
if (r) {
return r;
}
}

let prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, position);

if (wordNavigationType === WordNavigationType.WordStart) {
if (prevWordOnLine) {
column = prevWordOnLine.start + 1;
if (isEntire) {
columnEnd = prevWordOnLine.end + 1;
const chCode = lineContent.charCodeAt(columnEnd - 1);
if (chCode === CharCode.Space || chCode === CharCode.Tab) {
columnEnd++;
}
}
} else {
if (column > 1) {
column = 1;
Expand All @@ -416,11 +435,10 @@ export class WordOperations {
}
}

return new Range(lineNumber, column, position.lineNumber, columnEnd);
return new Range(lineNumber, column, position.lineNumber, position.column);
}


public static deleteWordLeft(ctx: DeleteWordContext, wordNavigationType: WordNavigationType): Range | null {
public static deleteWordEntire(ctx: DeleteWordContext, wordNavigationType: WordNavigationType): Range | null {
const wordSeparators = ctx.wordSeparators;
const model = ctx.model;
const selection = ctx.selection;
Expand All @@ -446,17 +464,16 @@ export class WordOperations {
}

if (whitespaceHeuristics) {
let r = this._deleteWordLeftWhitespace(model, position);
let r = this._deleteWordEntireWhitespace(model, position);
if (r) {
return r;
}
}

return this._determineDeleteRange(wordSeparators, model, wordNavigationType, position, false);
return this._determineDeleteRange(wordSeparators, model, wordNavigationType, position, true);
}


protected static _deleteWordEntireWhitespace(model: ICursorSimpleModel, position: Position): Range | null {
private static _deleteWordEntireWhitespace(model: ICursorSimpleModel, position: Position): Range | null {
const lineContent = model.getLineContent(position.lineNumber);
const startIndex1 = position.column - 1; // deleteRight
const startIndex2 = position.column - 2; // deleteLeft
Expand All @@ -468,40 +485,49 @@ export class WordOperations {
return null;
}


public static deleteWordEntire(ctx: DeleteWordContext, wordNavigationType: WordNavigationType): Range | null {
const wordSeparators = ctx.wordSeparators;
const model = ctx.model;
const selection = ctx.selection;
const whitespaceHeuristics = ctx.whitespaceHeuristics;

if (!selection.isEmpty()) {
return selection;
}

if (DeleteOperations.isAutoClosingPairDelete(ctx.autoClosingBrackets, ctx.autoClosingQuotes, ctx.autoClosingPairs.autoClosingPairsOpen, ctx.model, [ctx.selection])) {
const position = ctx.selection.getPosition();
return new Range(position.lineNumber, position.column - 1, position.lineNumber, position.column + 1);
}

const position = new Position(selection.positionLineNumber, selection.positionColumn);

private static _determineDeleteRange(wordSeparators: WordCharacterClassifier, model: ICursorSimpleModel, wordNavigationType: WordNavigationType, position: Position, isEntire: boolean): Range {
let lineNumber = position.lineNumber;
let column = position.column;
let columnEnd = position.column;
let lineContent = model.getLineContent(position.lineNumber);

if (lineNumber === 1 && column === 1) {
// Ignore deleting at beginning of file
return null;
}
let prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, position);

if (whitespaceHeuristics) {
let r = this._deleteWordEntireWhitespace(model, position);
if (r) {
return r;
if (wordNavigationType === WordNavigationType.WordStart) {
if (prevWordOnLine) {
column = prevWordOnLine.start + 1;
if (isEntire) {
columnEnd = prevWordOnLine.end + 1;
const chCode = lineContent.charCodeAt(columnEnd - 1);
if (chCode === CharCode.Space || chCode === CharCode.Tab) {
columnEnd++;
}
}
} else {
if (column > 1) {
column = 1;
} else {
lineNumber--;
column = model.getLineMaxColumn(lineNumber);
}
}
} else {
if (prevWordOnLine && column <= prevWordOnLine.end + 1) {
prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, new Position(lineNumber, prevWordOnLine.start + 1));
}
if (prevWordOnLine) {
column = prevWordOnLine.end + 1;
} else {
if (column > 1) {
column = 1;
} else {
lineNumber--;
column = model.getLineMaxColumn(lineNumber);
}
}
}

return this._determineDeleteRange(wordSeparators, model, wordNavigationType, position, true);
return new Range(lineNumber, column, position.lineNumber, columnEnd);
}
Comment thread
alexdima marked this conversation as resolved.

public static _deleteWordPartLeft(model: ICursorSimpleModel, selection: Selection): Range {
Expand Down
35 changes: 17 additions & 18 deletions src/vs/editor/contrib/wordOperations/wordOperations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -402,23 +402,6 @@ export class DeleteWordRightCommand extends DeleteWordCommand {
}
}

export class DeleteWordRight extends DeleteWordRightCommand {
constructor() {
super({
whitespaceHeuristics: true,
wordNavigationType: WordNavigationType.WordEnd,
id: 'deleteWordRight',
precondition: EditorContextKeys.writable,
kbOpts: {
kbExpr: EditorContextKeys.textInputFocus,
primary: KeyMod.CtrlCmd | KeyCode.Delete,
mac: { primary: KeyMod.Alt | KeyCode.Delete },
weight: KeybindingWeight.EditorContrib
}
});
}
}

export class DeleteWordStartLeft extends DeleteWordLeftCommand {
constructor() {
super({
Expand Down Expand Up @@ -480,6 +463,23 @@ export class DeleteWordEndRight extends DeleteWordRightCommand {
}
}

export class DeleteWordRight extends DeleteWordRightCommand {
constructor() {
super({
whitespaceHeuristics: true,
wordNavigationType: WordNavigationType.WordEnd,
id: 'deleteWordRight',
precondition: EditorContextKeys.writable,
kbOpts: {
kbExpr: EditorContextKeys.textInputFocus,
primary: KeyMod.CtrlCmd | KeyCode.Delete,
mac: { primary: KeyMod.Alt | KeyCode.Delete },
weight: KeybindingWeight.EditorContrib
}
});
}
}

export class DeleteWordEntireCommand extends DeleteWordCommand {
protected _delete(ctx: DeleteWordContext, wordNavigationType: WordNavigationType): Range {
let r = WordOperations.deleteWordEntire(ctx, wordNavigationType);
Expand Down Expand Up @@ -509,7 +509,6 @@ export class DeleteWordEntire extends DeleteWordEntireCommand {
}
}


registerEditorCommand(new CursorWordStartLeft());
registerEditorCommand(new CursorWordEndLeft());
registerEditorCommand(new CursorWordLeft());
Expand Down