Skip to content

Commit 7f1bde5

Browse files
committed
Fixes microsoft#15774: Use configured word separators for Ctrl+D
1 parent 3d23d67 commit 7f1bde5

6 files changed

Lines changed: 42 additions & 6 deletions

File tree

src/vs/editor/browser/editorBrowser.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { IPosition, Position } from 'vs/editor/common/core/position';
1313
import { IRange, Range } from 'vs/editor/common/core/range';
1414
import { Selection } from 'vs/editor/common/core/selection';
1515
import * as editorCommon from 'vs/editor/common/editorCommon';
16-
import { IIdentifiedSingleEditOperation, IModelDecoration, IModelDeltaDecoration, ITextModel, ICursorStateComputer } from 'vs/editor/common/model';
16+
import { IIdentifiedSingleEditOperation, IModelDecoration, IModelDeltaDecoration, ITextModel, ICursorStateComputer, IWordAtPosition } from 'vs/editor/common/model';
1717
import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent } from 'vs/editor/common/model/textModelEvents';
1818
import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager';
1919
import { IEditorWhitespace } from 'vs/editor/common/viewLayout/linesLayout';
@@ -567,6 +567,11 @@ export interface ICodeEditor extends editorCommon.IEditor {
567567
*/
568568
getRawOptions(): IEditorOptions;
569569

570+
/**
571+
* @internal
572+
*/
573+
getConfiguredWordAtPosition(position: Position): IWordAtPosition | null;
574+
570575
/**
571576
* Get value of the current model attached to this editor.
572577
* @see `ITextModel.getValue`

src/vs/editor/browser/widget/codeEditorWidget.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { ISelection, Selection } from 'vs/editor/common/core/selection';
3232
import { InternalEditorAction } from 'vs/editor/common/editorAction';
3333
import * as editorCommon from 'vs/editor/common/editorCommon';
3434
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
35-
import { EndOfLinePreference, IIdentifiedSingleEditOperation, IModelDecoration, IModelDecorationOptions, IModelDecorationsChangeAccessor, IModelDeltaDecoration, ITextModel, ICursorStateComputer } from 'vs/editor/common/model';
35+
import { EndOfLinePreference, IIdentifiedSingleEditOperation, IModelDecoration, IModelDecorationOptions, IModelDecorationsChangeAccessor, IModelDeltaDecoration, ITextModel, ICursorStateComputer, IWordAtPosition } from 'vs/editor/common/model';
3636
import { ClassName } from 'vs/editor/common/model/intervalTree';
3737
import { ModelDecorationOptions } from 'vs/editor/common/model/textModel';
3838
import { IModelContentChangedEvent, IModelDecorationsChangedEvent, IModelLanguageChangedEvent, IModelLanguageConfigurationChangedEvent, IModelOptionsChangedEvent } from 'vs/editor/common/model/textModelEvents';
@@ -52,6 +52,7 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib
5252
import { withNullAsUndefined } from 'vs/base/common/types';
5353
import { MonospaceLineBreaksComputerFactory } from 'vs/editor/common/viewModel/monospaceLineBreaksComputer';
5454
import { DOMLineBreaksComputerFactory } from 'vs/editor/browser/view/domLineBreaksComputer';
55+
import { WordOperations } from 'vs/editor/common/controller/cursorWordOperations';
5556

5657
let EDITOR_ID = 0;
5758

@@ -376,6 +377,13 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
376377
return this._configuration.getRawOptions();
377378
}
378379

380+
public getConfiguredWordAtPosition(position: Position): IWordAtPosition | null {
381+
if (!this._modelData) {
382+
return null;
383+
}
384+
return WordOperations.getWordAtPosition(this._modelData.model, this._configuration.options.get(EditorOption.wordSeparators), position);
385+
}
386+
379387
public getValue(options: { preserveBOM: boolean; lineEnding: string; } | null = null): string {
380388
if (!this._modelData) {
381389
return '';

src/vs/editor/common/controller/cursorWordOperations.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { WordCharacterClass, WordCharacterClassifier, getMapForWordSeparators }
1010
import { Position } from 'vs/editor/common/core/position';
1111
import { Range } from 'vs/editor/common/core/range';
1212
import { Selection } from 'vs/editor/common/core/selection';
13+
import { ITextModel, IWordAtPosition } from 'vs/editor/common/model';
1314

1415
interface IFindWordResult {
1516
/**
@@ -535,6 +536,28 @@ export class WordOperations {
535536
return new Range(pos.lineNumber, pos.column, toPosition.lineNumber, toPosition.column);
536537
}
537538

539+
private static _createWordAtPosition(model: ITextModel, lineNumber: number, word: IFindWordResult): IWordAtPosition {
540+
const range = new Range(lineNumber, word.start + 1, lineNumber, word.end + 1);
541+
return {
542+
word: model.getValueInRange(range),
543+
startColumn: range.startColumn,
544+
endColumn: range.endColumn
545+
};
546+
}
547+
548+
public static getWordAtPosition(model: ITextModel, _wordSeparators: string, position: Position): IWordAtPosition | null {
549+
const wordSeparators = getMapForWordSeparators(_wordSeparators);
550+
const prevWord = WordOperations._findPreviousWordOnLine(wordSeparators, model, position);
551+
if (prevWord && prevWord.wordType === WordType.Regular && prevWord.start <= position.column - 1 && position.column - 1 <= prevWord.end) {
552+
return WordOperations._createWordAtPosition(model, position.lineNumber, prevWord);
553+
}
554+
const nextWord = WordOperations._findNextWordOnLine(wordSeparators, model, position);
555+
if (nextWord && nextWord.wordType === WordType.Regular && nextWord.start <= position.column - 1 && position.column - 1 <= nextWord.end) {
556+
return WordOperations._createWordAtPosition(model, position.lineNumber, nextWord);
557+
}
558+
return null;
559+
}
560+
538561
public static word(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean, position: Position): SingleCursorState {
539562
const wordSeparators = getMapForWordSeparators(config.wordSeparators);
540563
let prevWord = WordOperations._findPreviousWordOnLine(wordSeparators, model, position);

src/vs/editor/contrib/find/findController.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export function getSelectionSearchString(editor: ICodeEditor): string | null {
3939
// if selection spans multiple lines, default search string to empty
4040
if (selection.startLineNumber === selection.endLineNumber) {
4141
if (selection.isEmpty()) {
42-
let wordAtPosition = editor.getModel().getWordAtPosition(selection.getStartPosition());
42+
const wordAtPosition = editor.getConfiguredWordAtPosition(selection.getStartPosition());
4343
if (wordAtPosition) {
4444
return wordAtPosition.word;
4545
}

src/vs/editor/contrib/linesOperations/linesOperations.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -960,7 +960,7 @@ export abstract class AbstractCaseAction extends EditorAction {
960960
let selection = selections[i];
961961
if (selection.isEmpty()) {
962962
let cursor = selection.getStartPosition();
963-
let word = model.getWordAtPosition(cursor);
963+
const word = editor.getConfiguredWordAtPosition(cursor);
964964

965965
if (!word) {
966966
continue;

src/vs/editor/contrib/multicursor/multicursor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ export class MultiCursorSession {
286286

287287
if (s.isEmpty()) {
288288
// selection is empty => expand to current word
289-
const word = editor.getModel().getWordAtPosition(s.getStartPosition());
289+
const word = editor.getConfiguredWordAtPosition(s.getStartPosition());
290290
if (!word) {
291291
return null;
292292
}
@@ -505,7 +505,7 @@ export class MultiCursorSelectionController extends Disposable implements IEdito
505505
if (!selection.isEmpty()) {
506506
return selection;
507507
}
508-
const word = model.getWordAtPosition(selection.getStartPosition());
508+
const word = this._editor.getConfiguredWordAtPosition(selection.getStartPosition());
509509
if (!word) {
510510
return selection;
511511
}

0 commit comments

Comments
 (0)