Skip to content

Commit

Permalink
smart select bracket pairs, #64004
Browse files Browse the repository at this point in the history
  • Loading branch information
jrieken committed Dec 3, 2018
1 parent d3665d2 commit 6938d2c
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
49 changes: 49 additions & 0 deletions src/vs/editor/contrib/smartSelect/bracketSelections.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { SelectionRangeProvider } from 'vs/editor/common/modes';
import { ITextModel } from 'vs/editor/common/model';
import { Position } from 'vs/editor/common/core/position';
import { Range } from 'vs/editor/common/core/range';

export class BracketSelectionRangeProvider implements SelectionRangeProvider {

provideSelectionRanges(model: ITextModel, position: Position): Range[] {

let result: Range[] = [];
let last: Range | undefined;
let pos = position;
let i = 0;
for (; i < 1750; i++) {
let bracket = model.findNextBracket(pos);
if (!bracket) {
// no more brackets
break;
} else if (bracket.isOpen) {
// skip past the closing bracket
let matching = model.matchBracket(bracket.range.getEndPosition());
if (!matching) {
break;
}
pos = model.getPositionAt(model.getOffsetAt(matching[1].getEndPosition()) + 1);

} else {
// find matching, opening bracket
let range = model.findMatchingBracketUp(bracket.close, bracket.range.getStartPosition());
if (!range) {
break;
}
if (!last || range.getStartPosition().isBefore(last.getStartPosition())) {
const inner = Range.fromPositions(range.getStartPosition(), bracket.range.getEndPosition());
const outer = Range.fromPositions(range.getEndPosition(), bracket.range.getStartPosition());
result.push(inner, outer);
last = outer;
}
pos = model.getPositionAt(model.getOffsetAt(bracket.range.getEndPosition()) + 1);
}
}
return result;
}
}
2 changes: 2 additions & 0 deletions src/vs/editor/contrib/smartSelect/smartSelect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { TokenTreeSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/tokenTree';
import { WordSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/wordSelections';
import { BracketSelectionRangeProvider } from 'vs/editor/contrib/smartSelect/bracketSelections';

class SelectionRanges {

Expand Down Expand Up @@ -201,6 +202,7 @@ registerEditorAction(GrowSelectionAction);
registerEditorAction(ShrinkSelectionAction);

modes.SelectionRangeRegistry.register('*', new WordSelectionRangeProvider());
modes.SelectionRangeRegistry.register('*', new BracketSelectionRangeProvider());
modes.SelectionRangeRegistry.register('*', new TokenTreeSelectionRangeProvider());

export function provideSelectionRanges(model: ITextModel, position: Position, token: CancellationToken): Promise<Range[] | undefined | null> {
Expand Down

0 comments on commit 6938d2c

Please sign in to comment.