diff --git a/spec/atom/command-interpreter-spec.coffee b/spec/atom/command-interpreter-spec.coffee index 0b39d430b..09d5adce5 100644 --- a/spec/atom/command-interpreter-spec.coffee +++ b/spec/atom/command-interpreter-spec.coffee @@ -11,9 +11,15 @@ describe "CommandInterpreter", -> interpreter = new CommandInterpreter() describe "addresses", -> - it "selects the given lines", -> - interpreter.eval(editor, '4,7') - expect(editor.selection.getBufferRange()).toEqual [[3, 0], [6, 0]] + describe "a line address", -> + it "selects the specified line", -> + interpreter.eval(editor, '4') + expect(editor.selection.getBufferRange()).toEqual [[3, 0], [4, 0]] + + describe "an address range with two line addresses", -> + it "selects the given lines", -> + interpreter.eval(editor, '4,7') + expect(editor.selection.getBufferRange()).toEqual [[3, 0], [7, 0]] describe "substitution", -> it "does nothing if there are no matches", -> @@ -34,7 +40,7 @@ describe "CommandInterpreter", -> describe "when prefixed with an address", -> it "only makes substitutions within given lines", -> - interpreter.eval(editor, '4,7s/ /!/g') + interpreter.eval(editor, '4,6s/ /!/g') expect(buffer.lineForRow(2)).toBe ' if (items.length <= 1) return items;' expect(buffer.lineForRow(3)).toBe '!!!!var!pivot!=!items.shift(),!current,!left!=![],!right!=![];' expect(buffer.lineForRow(4)).toBe '!!!!while(items.length!>!0)!{' diff --git a/src/atom/command-interpreter/address-range.coffee b/src/atom/command-interpreter/address-range.coffee new file mode 100644 index 000000000..2a53def97 --- /dev/null +++ b/src/atom/command-interpreter/address-range.coffee @@ -0,0 +1,9 @@ +Address = require 'command-interpreter/address' +Range = require 'range' + +module.exports = +class AddressRange extends Address + constructor: (@startAddress, @endAddress) -> + + getRange: -> + new Range(@startAddress.getRange().start, @endAddress.getRange().end) diff --git a/src/atom/command-interpreter/address.coffee b/src/atom/command-interpreter/address.coffee index 0de3a3dfd..ec3c8b971 100644 --- a/src/atom/command-interpreter/address.coffee +++ b/src/atom/command-interpreter/address.coffee @@ -1,14 +1,4 @@ -Range = require 'range' - module.exports = class Address - startRow: null - endRow: null - - constructor: (start, end) -> - @startRow = start - 1 - @endRow = end - 1 - execute: (editor) -> - range = new Range([@startRow, 0], [@endRow, 0]) - editor.getSelection().setBufferRange(range) \ No newline at end of file + editor.getSelection().setBufferRange(@getRange()) diff --git a/src/atom/command-interpreter/line-address.coffee b/src/atom/command-interpreter/line-address.coffee new file mode 100644 index 000000000..28e94543f --- /dev/null +++ b/src/atom/command-interpreter/line-address.coffee @@ -0,0 +1,10 @@ +Address = require 'command-interpreter/address' +Range = require 'range' + +module.exports = +class LineAddress extends Address + constructor: (lineNumber) -> + @row = lineNumber - 1 + + getRange: -> + new Range([@row, 0], [@row + 1, 0]) diff --git a/src/atom/commands.pegjs b/src/atom/commands.pegjs index e287fbcf6..b9e1101d3 100644 --- a/src/atom/commands.pegjs +++ b/src/atom/commands.pegjs @@ -1,6 +1,7 @@ { var Substitution = require('command-interpreter/substitution'); - var Address = require('command-interpreter/address'); + var LineAddress = require('command-interpreter/line-address'); + var AddressRange = require('command-interpreter/address-range'); } start @@ -11,10 +12,13 @@ start return operations; } -address - = start:integer _ ',' _ end:integer { - return new Address(start, end) - } +address = addressRange / primitiveAddress + +addressRange + = start:primitiveAddress _ ',' _ end:address { return new AddressRange(start, end) } + +primitiveAddress + = lineNumber:integer { return new LineAddress(lineNumber) } substitution = "s" _ "/" find:pattern "/" replace:pattern "/" _ options:[g]* {