From 7d969e145aee84f2b277ee3d64d683675e2f1bf6 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Tue, 27 Mar 2012 14:32:20 -0700 Subject: [PATCH] x command loops over all selected regions --- spec/atom/command-interpreter-spec.coffee | 14 ++++++++++++++ .../select-all-matches.coffee | 19 ++++++++----------- src/atom/composite-selection.coffee | 18 ++++++++++++++++-- src/atom/cursor.coffee | 2 +- src/atom/editor.coffee | 1 + src/atom/selection.coffee | 2 ++ 6 files changed, 42 insertions(+), 14 deletions(-) diff --git a/spec/atom/command-interpreter-spec.coffee b/spec/atom/command-interpreter-spec.coffee index bc1caa0a2..3d99616c6 100644 --- a/spec/atom/command-interpreter-spec.coffee +++ b/spec/atom/command-interpreter-spec.coffee @@ -90,6 +90,20 @@ describe "CommandInterpreter", -> expect(selections[2].getBufferRange()).toEqual [[6,34], [6,41]] expect(selections[3].getBufferRange()).toEqual [[6,56], [6,63]] + it "loops through current selections and selects text matching the regex", -> + editor.setSelectionBufferRange [[3,0], [3,62]] + editor.addSelectionForBufferRange [[6,0], [6,65]] + + interpreter.eval(editor, 'x/current') + + selections = editor.getSelections() + expect(selections.length).toBe 4 + + expect(selections[0].getBufferRange()).toEqual [[3,31], [3,38]] + expect(selections[1].getBufferRange()).toEqual [[6,6], [6,13]] + expect(selections[2].getBufferRange()).toEqual [[6,34], [6,41]] + expect(selections[3].getBufferRange()).toEqual [[6,56], [6,63]] + describe "substitution", -> it "does nothing if there are no matches", -> editor.getSelection().setBufferRange([[6, 0], [6, 44]]) diff --git a/src/atom/command-interpreter/select-all-matches.coffee b/src/atom/command-interpreter/select-all-matches.coffee index 0815433f7..44d05de7e 100644 --- a/src/atom/command-interpreter/select-all-matches.coffee +++ b/src/atom/command-interpreter/select-all-matches.coffee @@ -9,22 +9,19 @@ class SelectAllMatches extends Command @regex = new RegExp(pattern) execute: (editor) -> - selectedText = editor.getSelectedText() - selectionStartIndex = editor.buffer.characterIndexForPosition(editor.getSelection().getBufferRange().start) - - matchingRanges = @findMatchingRanges(editor, selectedText, selectionStartIndex) - return unless matchingRanges.length - editor.setSelectionBufferRange(matchingRanges[0]) - editor.addSelectionForBufferRange(range) for range in matchingRanges[1..] + rangesToSelect = [] + for selection in editor.getSelections() + selectedText = selection.getText() + selectionStartIndex = editor.buffer.characterIndexForPosition(selection.getBufferRange().start) + for range in @findMatchingRanges(editor, selectedText, selectionStartIndex) + rangesToSelect.push(range) + editor.clearSelections() + editor.addSelectionForBufferRange(range) for range in rangesToSelect findMatchingRanges: (editor, text, startIndex) -> - console.log text return [] unless match = text.match(@regex) - console.log match - console.log match[0] - matchStartIndex = startIndex + match.index matchEndIndex = matchStartIndex + match[0].length diff --git a/src/atom/composite-selection.coffee b/src/atom/composite-selection.coffee index 07675d7c1..d52cbf6e9 100644 --- a/src/atom/composite-selection.coffee +++ b/src/atom/composite-selection.coffee @@ -12,17 +12,31 @@ class CompositeSeleciton getSelections: -> new Array(@selections...) + clearSelections: -> + for selection in @getSelections()[1..] + selection.cursor.remove() + + @getLastSelection().clearSelection() + addSelectionForCursor: (cursor) -> selection = new Selection({@editor, cursor}) @selections.push(selection) @editor.lines.append(selection) addSelectionForBufferRange: (bufferRange, options) -> - cursor = @editor.compositeCursor.addCursor() + selections = @getSelections() + cursor = if selections.length == 1 and selections[0].isEmpty() + selections[0].cursor + else + @editor.compositeCursor.addCursor() + @selectionForCursor(cursor).setBufferRange(bufferRange, options) removeSelectionForCursor: (cursor) -> - _.remove(@selections, @selectionForCursor(cursor)) + selection = @selectionForCursor(cursor) + selection.cursor = null + selection.remove() + _.remove(@selections, selection) selectionForCursor: (cursor) -> _.find @selections, (selection) -> selection.cursor == cursor diff --git a/src/atom/cursor.coffee b/src/atom/cursor.coffee index 71dcec751..1f5d41517 100644 --- a/src/atom/cursor.coffee +++ b/src/atom/cursor.coffee @@ -33,7 +33,7 @@ class Cursor extends View remove: -> @editor.compositeCursor.removeCursor(this) @editor.compositeSelection.removeSelectionForCursor(this) - super() + super setScreenPosition: (position, options={}) -> position = Point.fromObject(position) diff --git a/src/atom/editor.coffee b/src/atom/editor.coffee index fd26c7a69..defb44def 100644 --- a/src/atom/editor.coffee +++ b/src/atom/editor.coffee @@ -365,6 +365,7 @@ class Editor extends View selectUp: -> @compositeSelection.selectUp() selectDown: -> @compositeSelection.selectDown() selectToScreenPosition: (position) -> @compositeSelection.selectToScreenPosition(position) + clearSelections: -> @compositeSelection.clearSelections() setText: (text) -> @buffer.setText(text) getText: -> @buffer.getText() diff --git a/src/atom/selection.coffee b/src/atom/selection.coffee index 4385c90a3..0ddabb989 100644 --- a/src/atom/selection.coffee +++ b/src/atom/selection.coffee @@ -43,6 +43,8 @@ class Selection extends View @updateAppearance() updateAppearance: -> + return unless @cursor + @clearRegions() range = @getScreenRange()