Add regex address to command language

This commit is contained in:
Corey Johnson & Nathan Sobo
2012-03-22 14:34:27 -07:00
parent 9e5bba9ab1
commit 12f4a47b87
7 changed files with 43 additions and 2 deletions

View File

@@ -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", ->

View File

@@ -60,6 +60,10 @@ class Buffer
lastLine: ->
@lineForRow(@getLastRow())
getEofPosition: ->
lastRow = @getLastRow()
new Point(lastRow, @getLineLength(lastRow))
characterIndexForPosition: (position) ->
position = Point.fromObject(position)

View File

@@ -4,4 +4,6 @@ Range = require 'range'
module.exports =
class CurrentSelectionAddress extends Address
getRange: (editor) ->
editor.getSelection().getBufferRange()
lastRow = editor.getLastBufferRow()
column = editor.getBufferLineLength(lastRow)
new Range([lastRow, column], [lastRow, column])

View File

@@ -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

View File

@@ -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)

View File

@@ -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]* {

View File

@@ -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)