diff --git a/spec/atom/command-interpreter-spec.coffee b/spec/atom/command-interpreter-spec.coffee index a78583e1c..960f61615 100644 --- a/spec/atom/command-interpreter-spec.coffee +++ b/spec/atom/command-interpreter-spec.coffee @@ -46,6 +46,12 @@ describe "CommandInterpreter", -> interpreter.eval(editor, ',.') expect(editor.selection.getBufferRange()).toEqual [[0,0], [2,2]] + describe "/regex/", -> + it 'selects text matching regex after current selection', -> + editor.getSelection().setBufferRange([[4,16], [4,20]]) + interpreter.eval(editor, '/pivot/') + expect(editor.selection.getBufferRange()).toEqual [[6,16], [6,21]] + describe "address range", -> describe "when two addresses are specified", -> it "selects from the begining of the left address to the end of the right address", -> diff --git a/src/atom/buffer.coffee b/src/atom/buffer.coffee index 082b328d5..d0e6eaa40 100644 --- a/src/atom/buffer.coffee +++ b/src/atom/buffer.coffee @@ -60,6 +60,10 @@ class Buffer lastLine: -> @lineForRow(@getLastRow()) + getEofPosition: -> + lastRow = @getLastRow() + new Point(lastRow, @getLineLength(lastRow)) + characterIndexForPosition: (position) -> position = Point.fromObject(position) diff --git a/src/atom/command-interpreter/current-selection-address.coffee b/src/atom/command-interpreter/current-selection-address.coffee index 576724ac8..358e82953 100644 --- a/src/atom/command-interpreter/current-selection-address.coffee +++ b/src/atom/command-interpreter/current-selection-address.coffee @@ -4,4 +4,6 @@ Range = require 'range' module.exports = class CurrentSelectionAddress extends Address getRange: (editor) -> - editor.getSelection().getBufferRange() \ No newline at end of file + lastRow = editor.getLastBufferRow() + column = editor.getBufferLineLength(lastRow) + new Range([lastRow, column], [lastRow, column]) \ No newline at end of file diff --git a/src/atom/command-interpreter/regex-address.coffee b/src/atom/command-interpreter/regex-address.coffee new file mode 100644 index 000000000..ac35cc7be --- /dev/null +++ b/src/atom/command-interpreter/regex-address.coffee @@ -0,0 +1,26 @@ +Address = require 'command-interpreter/address' +Range = require 'range' + +module.exports = +class RegexAddress extends Address + regex: null + + constructor: (pattern) -> + @regex = new RegExp(pattern) + + getRange: (editor) -> + selectedRange = editor.getSelection().getBufferRange() + rangeToSearch = new Range(selectedRange.end, editor.getEofPosition()) + text = editor.getTextInRange(rangeToSearch) + + if match = text.match(@regex) + buffer = editor.buffer + startIndex = buffer.characterIndexForPosition(rangeToSearch.start) + match.index + endIndex = startIndex + match[0].length + + startPosition = buffer.positionForCharacterIndex(startIndex) + endPosition = buffer.positionForCharacterIndex(endIndex) + + return new Range(startPosition, endPosition) + else + return selectedRange \ No newline at end of file diff --git a/src/atom/command-interpreter/substitution.coffee b/src/atom/command-interpreter/substitution.coffee index 651345677..282779efe 100644 --- a/src/atom/command-interpreter/substitution.coffee +++ b/src/atom/command-interpreter/substitution.coffee @@ -9,7 +9,6 @@ class Substitution execute: (editor) -> selectedText = editor.getSelectedText() selectionStartIndex = editor.buffer.characterIndexForPosition(editor.getSelection().getBufferRange().start) - selectionEndIndex = selectionStartIndex + selectedText.length @replace(editor, selectedText, selectionStartIndex) diff --git a/src/atom/commands.pegjs b/src/atom/commands.pegjs index 9a9c1a3c5..b776c3984 100644 --- a/src/atom/commands.pegjs +++ b/src/atom/commands.pegjs @@ -4,6 +4,7 @@ var AddressRange = require('command-interpreter/address-range'); var EofAddress = require('command-interpreter/eof-address'); var CurrentSelectionAddress = require('command-interpreter/current-selection-address') + var RegexAddress = require('command-interpreter/regex-address') } start @@ -27,6 +28,7 @@ primitiveAddress = lineNumber:integer { return new LineAddress(lineNumber) } / '$' { return new EofAddress() } / '.' { return new CurrentSelectionAddress() } + / '/' pattern:pattern '/' { return new RegexAddress(pattern)} substitution = "s" _ "/" find:pattern "/" replace:pattern "/" _ options:[g]* { diff --git a/src/atom/editor.coffee b/src/atom/editor.coffee index b61f21923..8cda01692 100644 --- a/src/atom/editor.coffee +++ b/src/atom/editor.coffee @@ -374,6 +374,8 @@ class Editor extends View getText: -> @buffer.getText() getLastBufferRow: -> @buffer.getLastRow() getBufferLineLength: (row) -> @buffer.getLineLength(row) + getTextInRange: (range) -> @buffer.getTextInRange(range) + getEofPosition: -> @buffer.getEofPosition() insertText: (text) -> { text, shouldOutdent } = @autoIndentText(text)