From a2156e39c0702ef261b2001071f626d97f2405ca Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Wed, 21 Mar 2012 17:33:05 -0700 Subject: [PATCH] Command interpreter takes x,x as an address --- spec/atom/command-interpreter-spec.coffee | 8 ++++++++ src/atom/command-interpreter.coffee | 4 ++-- src/atom/command-interpreter/address.coffee | 14 ++++++++++++++ src/atom/commands.pegjs | 19 ++++++++++++++++++- 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/atom/command-interpreter/address.coffee diff --git a/spec/atom/command-interpreter-spec.coffee b/spec/atom/command-interpreter-spec.coffee index eb0ef8e33..9c30546e8 100644 --- a/spec/atom/command-interpreter-spec.coffee +++ b/spec/atom/command-interpreter-spec.coffee @@ -27,3 +27,11 @@ describe "CommandInterpreter", -> interpreter.eval(editor, 's/current/foo/g') expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(foo) : right.push(current);' + describe "when prefixed with an address", -> + it "only makes substitutions within given lines", -> + interpreter.eval(editor, '4,7s/ /!/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)!{' + expect(buffer.lineForRow(5)).toBe '!!!!!!current!=!items.shift();' + expect(buffer.lineForRow(6)).toBe ' current < pivot ? left.push(current) : right.push(current);' diff --git a/src/atom/command-interpreter.coffee b/src/atom/command-interpreter.coffee index 0fe4e560a..2429c36ea 100644 --- a/src/atom/command-interpreter.coffee +++ b/src/atom/command-interpreter.coffee @@ -7,6 +7,6 @@ class CommandInterpreter @parser = PEG.buildParser(fs.read(require.resolve 'commands.pegjs')) eval: (editor, command) -> - operation = @parser.parse(command) - operation.execute(editor) + operations = @parser.parse(command) + operation.execute(editor) for operation in operations diff --git a/src/atom/command-interpreter/address.coffee b/src/atom/command-interpreter/address.coffee new file mode 100644 index 000000000..0de3a3dfd --- /dev/null +++ b/src/atom/command-interpreter/address.coffee @@ -0,0 +1,14 @@ +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 diff --git a/src/atom/commands.pegjs b/src/atom/commands.pegjs index c3b0e9443..2c85a647f 100644 --- a/src/atom/commands.pegjs +++ b/src/atom/commands.pegjs @@ -1,10 +1,27 @@ { var Substitution = require('command-interpreter/substitution'); + var Address = require('command-interpreter/address'); } +start + = address:address? _ command:substitution { + var operations = []; + if (address) operations.push(address); + operations.push(command); + return operations; + } + +address + = start:integer _ ',' _ end:integer { + return new Address(start, end) + } + substitution = "s" _ "/" find:([^/]*) "/" replace:([^/]*) "/" _ options:[g]* { - return new Substitution(find.join(''), replace.join(''), options) + return new Substitution(find.join(''), replace.join(''), options); } +integer + = digits:[0-9]+ { return parseInt(digits.join('')); } + _ = " "*