From d31b337429cc4679c0a2cba406be3e8a383d85a1 Mon Sep 17 00:00:00 2001 From: undoZen Date: Thu, 13 Jun 2013 23:52:14 +0800 Subject: [PATCH 1/2] fix braceInfo.numUnclosedOpenBraces bug --- SelectParent.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SelectParent.js b/SelectParent.js index 9f17d31..0d45320 100644 --- a/SelectParent.js +++ b/SelectParent.js @@ -80,6 +80,9 @@ define(function (require, exports, module) { ctx = TokenUtils.getInitialContext(editor._codeMirror, sel.start); while (ctx.pos.line < sel.end.line || (ctx.pos.line === sel.end.line && ctx.pos.ch <= sel.end.ch)) { TokenUtils.moveNextToken(ctx); + if (ctx.pos.line === sel.end.line && ctx.pos.ch > sel.end.ch) { + break; + } if (ctx.token.string === "{") { nest++; } else if (ctx.token.string === "}") { From c707be7b4d00f7f6fa85e5fa020f85de71b03ca7 Mon Sep 17 00:00:00 2001 From: undoZen Date: Thu, 13 Jun 2013 23:52:49 +0800 Subject: [PATCH 2/2] select inner content first --- SelectParent.js | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/SelectParent.js b/SelectParent.js index 0d45320..0c18de1 100644 --- a/SelectParent.js +++ b/SelectParent.js @@ -100,18 +100,26 @@ define(function (require, exports, module) { var sel = editor.getSelection(), origSel = cloneSelection(sel), ctx = TokenUtils.getInitialContext(editor._codeMirror, sel.start), + ctxe = TokenUtils.getInitialContext(editor._codeMirror, sel.end), start, end, nest, braceInfo = numMismatchedBraces(editor, sel); + TokenUtils.moveNextToken(ctxe); + // Search backward for the next outer open brace, skipping open braces that match end braces // in the selection. nest = braceInfo.numUnopenedCloseBraces; do { if (ctx.token.string === "{") { if (nest === 0) { - start = nudgeBackward(editor, ctx.pos); + if (ctxe.token.string === "}") { + start = nudgeBackward(editor, ctx.pos); + end = ctxe.pos; + } else { + start = ctx.pos; + } break; } else { nest--; @@ -123,21 +131,21 @@ define(function (require, exports, module) { // Search forward for the next outer close brace, skipping close braces that match open braces // in the selection. - ctx = TokenUtils.getInitialContext(editor._codeMirror, sel.end); - TokenUtils.moveNextToken(ctx); - nest = braceInfo.numUnclosedOpenBraces; - do { - if (ctx.token.string === "}") { - if (nest === 0) { - end = ctx.pos; - break; - } else { - nest--; - } - } else if (ctx.token.string === "{") { - nest++; - } - } while (TokenUtils.moveNextToken(ctx)); + if (!end) { + nest = braceInfo.numUnclosedOpenBraces; + do { + if (ctxe.token.string === "}") { + if (nest === 0) { + end = nudgeBackward(editor, ctxe.pos); + break; + } else { + nest--; + } + } else if (ctxe.token.string === "{") { + nest++; + } + } while (TokenUtils.moveNextToken(ctxe)); + } if (start && end) { ignoreNextSel = true; selectStack.push({start: origSel.start, end: origSel.end});