From 89824341e2e2b1f29ee41ff832e0c0c44e0c8421 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 9 Dec 2015 17:22:14 +0100 Subject: [PATCH] Fixes #183: Jump to bracket should jump such that it matches the same bracket pair --- src/vs/editor/common/controller/oneCursor.ts | 24 ++++++++++-------- .../test/common/controller/cursor.test.ts | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/vs/editor/common/controller/oneCursor.ts b/src/vs/editor/common/controller/oneCursor.ts index b41eac7fbee..4ca3774e401 100644 --- a/src/vs/editor/common/controller/oneCursor.ts +++ b/src/vs/editor/common/controller/oneCursor.ts @@ -492,23 +492,25 @@ export class OneCursorOp { // -------------------- START handlers that simply change cursor state public static jumpToBracket(cursor:OneCursor, ctx: IOneCursorOperationContext): boolean { - var bracketDecorations = cursor.getBracketsDecorations(); - var len = bracketDecorations.length; + let bracketDecorations = cursor.getBracketsDecorations(); - if (len !== 2) { + if (bracketDecorations.length !== 2) { return false; } - var position = cursor.getPosition(); + let firstBracket = cursor.model.getDecorationRange(bracketDecorations[0]); + let secondBracket = cursor.model.getDecorationRange(bracketDecorations[1]); - for (var i = 0; i < 2; i++) { - var range = cursor.model.getDecorationRange(bracketDecorations[i]); - var otherRange = cursor.model.getDecorationRange(bracketDecorations[1 - i]); + let position = cursor.getPosition(); - if (Utils.isPositionAtRangeEdges(position, range) || Utils.isPositionInsideRange(position, range)) { - cursor.moveModelPosition(false, otherRange.startLineNumber, otherRange.startColumn, 0, false); - return true; - } + if (Utils.isPositionAtRangeEdges(position, firstBracket) || Utils.isPositionInsideRange(position, firstBracket)) { + cursor.moveModelPosition(false, secondBracket.endLineNumber, secondBracket.endColumn, 0, false); + return true; + } + + if (Utils.isPositionAtRangeEdges(position, secondBracket) || Utils.isPositionInsideRange(position, secondBracket)) { + cursor.moveModelPosition(false, firstBracket.endLineNumber, firstBracket.endColumn, 0, false); + return true; } return false; diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index 77cad786f55..490fd0663f4 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -814,6 +814,31 @@ suite('Editor Controller - Cursor Configuration', () => { var thisHighlighter = new ModelModes.CursorMode(); + test('issue #183: jump to matching bracket position', () => { + let mode = new ModelModes.BracketMode(); + let model = new Model.Model([ + 'var x = (3 + (5-7));' + ].join('\n'), mode); + let cursor = new Cursor.Cursor(1, new MockConfiguration(null), model, null, false); + + // ensure is tokenized + model.getLineContext(1); + + moveTo(cursor, 1, 20); + + cursorCommand(cursor, H.JumpToBracket, null, null, 'keyboard'); + cursorEqual(cursor, 1, 10); + + cursorCommand(cursor, H.JumpToBracket, null, null, 'keyboard'); + cursorEqual(cursor, 1, 20); + + cursorCommand(cursor, H.JumpToBracket, null, null, 'keyboard'); + cursorEqual(cursor, 1, 10); + + cursor.dispose(); + model.dispose(); + }); + test('Cursor honors insertSpaces configuration on new line', () => { var text = ' \tMy First Line\t \n' + '\tMy Second Line\n' + ' Third Line\n' + '\n' + '1'; var model = new Model.Model(text, thisHighlighter); -- GitLab