mirror of
https://github.com/atom/atom.git
synced 2026-01-24 14:28:14 -05:00
Add regex address to command language
This commit is contained in:
@@ -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", ->
|
||||
|
||||
@@ -60,6 +60,10 @@ class Buffer
|
||||
lastLine: ->
|
||||
@lineForRow(@getLastRow())
|
||||
|
||||
getEofPosition: ->
|
||||
lastRow = @getLastRow()
|
||||
new Point(lastRow, @getLineLength(lastRow))
|
||||
|
||||
characterIndexForPosition: (position) ->
|
||||
position = Point.fromObject(position)
|
||||
|
||||
|
||||
@@ -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])
|
||||
26
src/atom/command-interpreter/regex-address.coffee
Normal file
26
src/atom/command-interpreter/regex-address.coffee
Normal 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
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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]* {
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user