From 61652e044a60f82762d93e9e127ec9ce4b092cd5 Mon Sep 17 00:00:00 2001 From: Roberto Oropeza G Date: Sun, 4 Oct 2015 19:09:25 -0400 Subject: [PATCH 1/3] Added bracket mark in gutter and Show in Gutter submenu in package --- lib/bracket-matcher-view.coffee | 31 ++++++++++++++++---- lib/main.coffee | 3 ++ menus/bracket-matcher.cson | 1 + styles/bracket-matcher.atom-text-editor.less | 24 +++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/lib/bracket-matcher-view.coffee b/lib/bracket-matcher-view.coffee index 4804113..db95238 100644 --- a/lib/bracket-matcher-view.coffee +++ b/lib/bracket-matcher-view.coffee @@ -13,6 +13,14 @@ endPairMatches = ']': '[' '}': '{' +pairClasses = + '(': 'bracket-matcher-parentessis-open' + ')': 'bracket-matcher-parentessis-close' + '{': 'bracket-matcher-brace-open' + '}': 'bracket-matcher-brace-close' + '[': 'bracket-matcher-square-open' + ']': 'bracket-matcher-square-close' + pairRegexes = {} for startPair, endPair of startPairMatches pairRegexes[startPair] = new RegExp("[#{_.escapeRegExp(startPair + endPair)}]", 'g') @@ -24,6 +32,7 @@ class BracketMatcherView @tagFinder = new TagFinder(@editor) @pairHighlighted = false @tagHighlighted = false + @gutter = if atom.config.get('bracket-matcher.show-in-gutter') then @editor.addGutter({name:'bracketMatcherGutter'}) else null @subscriptions.add @editor.onDidChange => @updateMatch() @@ -48,6 +57,9 @@ class BracketMatcherView @subscriptions.add atom.commands.add editorElement, 'bracket-matcher:remove-matching-brackets', => @removeMatchingBrackets() + @subscriptions.add atom.commands.add editorElement, 'bracket-matcher:show-in-gutter', => + @showInGutter() + @updateMatch() subscribeToCursor: -> @@ -83,13 +95,13 @@ class BracketMatcherView matchPosition = @findMatchingStartPair(position, matchingPair, currentPair) if position? and matchPosition? - @startMarker = @createMarker([position, position.traverse([0, 1])]) - @endMarker = @createMarker([matchPosition, matchPosition.traverse([0, 1])]) + @startMarker = @createMarker([position, position.traverse([0, 1])], {brace: currentPair}) + @endMarker = @createMarker([matchPosition, matchPosition.traverse([0, 1])], {brace: matchingPair}) @pairHighlighted = true else if pair = @tagFinder.findMatchingTags() - @startMarker = @createMarker(pair.startRange) - @endMarker = @createMarker(pair.endRange) + @startMarker = @createMarker(pair.startRange, {brace: currentPair}) + @endMarker = @createMarker(pair.endRange, {brace: mathcingPair }) @pairHighlighted = true @tagHighlighted = true @@ -174,9 +186,10 @@ class BracketMatcherView result.stop() startPosition - createMarker: (bufferRange) -> + createMarker: (bufferRange, options) -> marker = @editor.markBufferRange(bufferRange) @editor.decorateMarker(marker, type: 'highlight', class: 'bracket-matcher', deprecatedRegionClass: 'bracket-matcher') + @gutter?.decorateMarker(marker, {class: pairClasses[options.brace]}) marker findCurrentPair: (matches) -> @@ -280,3 +293,11 @@ class BracketMatcherView if tag = @tagFinder.closingTagForFragments(preFragment, postFragment) @editor.insertText("") + + showInGutter: -> + if @gutter + @gutter.destroy() + @gutter = null + else + @gutter = @editor.addGutter({name:'bracketMatcherGutter'}) + @updateMatch() diff --git a/lib/main.coffee b/lib/main.coffee index 1c4e1b7..fdc1fd5 100644 --- a/lib/main.coffee +++ b/lib/main.coffee @@ -12,6 +12,9 @@ module.exports = wrapSelectionsInBrackets: type: 'boolean' default: true + showInGutter: + type: 'boolean' + default: true activate: -> atom.workspace.observeTextEditors (editor) -> diff --git a/menus/bracket-matcher.cson b/menus/bracket-matcher.cson index c8825d5..848f08e 100644 --- a/menus/bracket-matcher.cson +++ b/menus/bracket-matcher.cson @@ -9,6 +9,7 @@ { 'label': 'Remove Brackets From Selection', 'command': 'bracket-matcher:remove-brackets-from-selection' } { 'label': 'Close Current Tag', 'command': 'bracket-matcher:close-tag' } { 'label': 'Remove Matching Brackets', 'command': 'bracket-matcher:remove-matching-brackets' } + { 'label': 'Show in gutter', 'command': 'bracket-matcher:show-in-gutter'} ] ] }, diff --git a/styles/bracket-matcher.atom-text-editor.less b/styles/bracket-matcher.atom-text-editor.less index a9e2c4b..e078520 100644 --- a/styles/bracket-matcher.atom-text-editor.less +++ b/styles/bracket-matcher.atom-text-editor.less @@ -2,3 +2,27 @@ border-bottom: 1px dotted lime; position: absolute; } + +.bracket-matcher-brace-open::before { + content: '{'; +} + +.bracket-matcher-brace-close::after { + content: '}'; +} + +.bracket-matcher-parentessis-open::before { + content: '('; +} + +.bracket-matcher-parentessis-close::after { + content: ')'; +} + +.bracket-matcher-square-open::before { + content: '['; +} + +.bracket-matcher-square-close::after { + content: ']'; +} From 8c02b77442cba285f747ce454d78fe8d16a19db7 Mon Sep 17 00:00:00 2001 From: Roberto Oropeza G Date: Mon, 5 Oct 2015 21:29:00 -0400 Subject: [PATCH 2/3] Fixes #97 :art: and follow sugested name conventions --- lib/bracket-matcher-view.coffee | 28 ++++++++++---------- lib/main.coffee | 4 +-- menus/bracket-matcher.cson | 2 +- styles/bracket-matcher.atom-text-editor.less | 12 ++++----- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/bracket-matcher-view.coffee b/lib/bracket-matcher-view.coffee index db95238..1ccea7a 100644 --- a/lib/bracket-matcher-view.coffee +++ b/lib/bracket-matcher-view.coffee @@ -13,13 +13,13 @@ endPairMatches = ']': '[' '}': '{' -pairClasses = - '(': 'bracket-matcher-parentessis-open' - ')': 'bracket-matcher-parentessis-close' - '{': 'bracket-matcher-brace-open' - '}': 'bracket-matcher-brace-close' - '[': 'bracket-matcher-square-open' - ']': 'bracket-matcher-square-close' +braceClasses = + '(': 'bracket-matcher-round-brace-open' + ')': 'bracket-matcher-round-brace-close' + '{': 'bracket-matcher-curly-brace-open' + '}': 'bracket-matcher-curly-brace-close' + '[': 'bracket-matcher-square-brace-open' + ']': 'bracket-matcher-square-brace-close' pairRegexes = {} for startPair, endPair of startPairMatches @@ -32,7 +32,7 @@ class BracketMatcherView @tagFinder = new TagFinder(@editor) @pairHighlighted = false @tagHighlighted = false - @gutter = if atom.config.get('bracket-matcher.show-in-gutter') then @editor.addGutter({name:'bracketMatcherGutter'}) else null + @gutter = if atom.config.get('bracket-matcher.show-brackets-in-gutter') then @editor.addGutter({name: 'bracketMatcherGutter'}) else null @subscriptions.add @editor.onDidChange => @updateMatch() @@ -57,8 +57,8 @@ class BracketMatcherView @subscriptions.add atom.commands.add editorElement, 'bracket-matcher:remove-matching-brackets', => @removeMatchingBrackets() - @subscriptions.add atom.commands.add editorElement, 'bracket-matcher:show-in-gutter', => - @showInGutter() + @subscriptions.add atom.commands.add editorElement, 'bracket-matcher:show-brackets-in-gutter', => + @showBracketsInGutter() @updateMatch() @@ -101,7 +101,7 @@ class BracketMatcherView else if pair = @tagFinder.findMatchingTags() @startMarker = @createMarker(pair.startRange, {brace: currentPair}) - @endMarker = @createMarker(pair.endRange, {brace: mathcingPair }) + @endMarker = @createMarker(pair.endRange, {brace: matchingPair}) @pairHighlighted = true @tagHighlighted = true @@ -189,7 +189,7 @@ class BracketMatcherView createMarker: (bufferRange, options) -> marker = @editor.markBufferRange(bufferRange) @editor.decorateMarker(marker, type: 'highlight', class: 'bracket-matcher', deprecatedRegionClass: 'bracket-matcher') - @gutter?.decorateMarker(marker, {class: pairClasses[options.brace]}) + @gutter?.decorateMarker(marker, {class: braceClasses[options.brace]}) marker findCurrentPair: (matches) -> @@ -294,10 +294,10 @@ class BracketMatcherView if tag = @tagFinder.closingTagForFragments(preFragment, postFragment) @editor.insertText("") - showInGutter: -> + showBracketsInGutter: -> if @gutter @gutter.destroy() @gutter = null else - @gutter = @editor.addGutter({name:'bracketMatcherGutter'}) + @gutter = @editor.addGutter({name: 'bracketMatcherGutter'}) @updateMatch() diff --git a/lib/main.coffee b/lib/main.coffee index fdc1fd5..6e3a022 100644 --- a/lib/main.coffee +++ b/lib/main.coffee @@ -12,9 +12,9 @@ module.exports = wrapSelectionsInBrackets: type: 'boolean' default: true - showInGutter: + showBracketsInGutter: type: 'boolean' - default: true + default: false activate: -> atom.workspace.observeTextEditors (editor) -> diff --git a/menus/bracket-matcher.cson b/menus/bracket-matcher.cson index 848f08e..cb09017 100644 --- a/menus/bracket-matcher.cson +++ b/menus/bracket-matcher.cson @@ -9,7 +9,7 @@ { 'label': 'Remove Brackets From Selection', 'command': 'bracket-matcher:remove-brackets-from-selection' } { 'label': 'Close Current Tag', 'command': 'bracket-matcher:close-tag' } { 'label': 'Remove Matching Brackets', 'command': 'bracket-matcher:remove-matching-brackets' } - { 'label': 'Show in gutter', 'command': 'bracket-matcher:show-in-gutter'} + { 'label': 'Show in Gutter', 'command': 'bracket-matcher:show-brackets-in-gutter'} ] ] }, diff --git a/styles/bracket-matcher.atom-text-editor.less b/styles/bracket-matcher.atom-text-editor.less index e078520..cb6abb6 100644 --- a/styles/bracket-matcher.atom-text-editor.less +++ b/styles/bracket-matcher.atom-text-editor.less @@ -3,26 +3,26 @@ position: absolute; } -.bracket-matcher-brace-open::before { +.bracket-matcher-curly-brace-open::before { content: '{'; } -.bracket-matcher-brace-close::after { +.bracket-matcher-curly-brace-close::after { content: '}'; } -.bracket-matcher-parentessis-open::before { +.bracket-matcher-round-brace-open::before { content: '('; } -.bracket-matcher-parentessis-close::after { +.bracket-matcher-round-brace-close::after { content: ')'; } -.bracket-matcher-square-open::before { +.bracket-matcher-square-brace-open::before { content: '['; } -.bracket-matcher-square-close::after { +.bracket-matcher-square-brace-close::after { content: ']'; } From b26e312ef88d9d02278f2df2866f0167ec5d486c Mon Sep 17 00:00:00 2001 From: Roberto Oropeza G Date: Sat, 31 Oct 2015 11:47:01 -0400 Subject: [PATCH 3/3] Basic functionality --- lib/bracket-matcher.coffee | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/bracket-matcher.coffee b/lib/bracket-matcher.coffee index 3cf7f72..97cc4b6 100644 --- a/lib/bracket-matcher.coffee +++ b/lib/bracket-matcher.coffee @@ -155,6 +155,11 @@ class BracketMatcher return false unless @isOpeningBracket(bracket) pair = @pairedCharacters[bracket] + defaultPairs = @defaultPairs + cursorBufferPosition = @editor.getCursorBufferPosition() + endPosition = @editor.buffer.getEndPosition() + editor = @editor + selectionWrapped = false @editor.mutateSelectedText (selection) -> return if selection.isEmpty() @@ -165,12 +170,33 @@ class BracketMatcher selectionWrapped = true range = selection.getBufferRange() options = reversed: selection.isReversed() - selection.insertText("#{bracket}#{selection.getText()}#{pair}") + + selectionIsQuote = defaultPairs.hasOwnProperty(selection.getText()) and defaultPairs[selection.getText()] == selection.getText() + + if selectionIsQuote + # + # scanRange = new Range(cursorBufferPosition, endPosition) + # endPairPosition = null + # unpairedCount = 0 + # console.log(selection) + # editor.scanInBufferRange new RegExp(selection.getText()), [selection.getBufferRange().end, [Infinity, 0]], ({range, stop}) -> + # unpairedCount-- + # if unpairedCount < 0 + # endPairPosition = range.start + # stop() + # + # console.log(endPairPosition) + + selection.insertText("#{bracket}") + else + selection.insertText("#{bracket}#{selection.getText()}#{pair}") + selectionStart = range.start.traverse([0, bracket.length]) - if range.start.row is range.end.row + if not selectionIsQuote and range.start.row is range.end.row selectionEnd = range.end.traverse([0, bracket.length]) else selectionEnd = range.end + selection.setBufferRange([selectionStart, selectionEnd], options) selectionWrapped