WIP: Converting to operations, but substitution operations need anchor ranges

This commit is contained in:
Corey Johnson & Nathan Sobo 2012-07-13 18:30:10 -06:00
parent 926067164d
commit fd24b82d47
7 changed files with 42 additions and 32 deletions

View File

@ -2,7 +2,7 @@ CommandInterpreter = require 'command-panel/command-interpreter'
Buffer = require 'buffer'
EditSession = require 'edit-session'
describe "CommandInterpreter", ->
fdescribe "CommandInterpreter", ->
[interpreter, editSession, buffer] = []
beforeEach ->
@ -242,15 +242,3 @@ describe "CommandInterpreter", ->
editSession.setSelectedBufferRanges([[[5, 0], [5, 20]], [[6, 0], [6, 44]]])
interpreter.eval(',s/current/foo/g', editSession)
expect(editSession.getSelectedBufferRanges()).toEqual [[[5, 0], [5, 16]], [[6, 0], [6, 36]]]
describe "when command selects folded text", ->
it "unfolds lines that command selects", ->
editSession.createFold(1, 9)
editSession.createFold(5, 8)
editSession.setSelectedBufferRange([[0,0], [0,0]])
interpreter.eval('/push/', editSession)
expect(editSession.getSelection().getBufferRange()).toEqual [[6,29], [6,33]]
expect(editSession.lineForScreenRow(1).fold).toBeUndefined()
expect(editSession.lineForScreenRow(5).fold).toBeUndefined()
expect(editSession.lineForScreenRow(6).text).toBe buffer.lineForRow(6)

View File

@ -302,13 +302,14 @@ class EditSession
addSelectionForBufferRange: (bufferRange, options) ->
@addCursor().selection.setBufferRange(bufferRange, options)
@mergeIntersectingSelections()
setSelectedBufferRange: (bufferRange, options) ->
@setSelectedBufferRanges([bufferRange], options)
setSelectedBufferRanges: (bufferRanges, options={}) ->
throw new Error("Passed an empty array to setSelectedBufferRanges") unless bufferRanges.length
selection.destroy() for selection in @getSelections()
@clearAllSelections()
for bufferRange, i in bufferRanges
bufferRange = Range.fromObject(bufferRange)
unless options.preserveFolds
@ -326,6 +327,9 @@ class EditSession
selection.destroy()
lastSelection.clear()
clearAllSelections: ->
selection.destroy() for selection in @getSelections()
getSelections: -> new Array(@selections...)
getSelection: (index) ->

View File

@ -1,8 +1,9 @@
Command = require 'command-panel/commands/command'
Operation = require 'command-panel/operation'
module.exports =
class Address extends Command
execute: (project, buffer, range) ->
[@getRange(buffer, range)]
compile: (project, buffer, range) ->
[new Operation(buffer: buffer, bufferRange: @getRange(buffer, range))]
isAddress: -> true

View File

@ -4,17 +4,16 @@ module.exports =
class CompositeCommand
constructor: (@subcommands) ->
execute: (project, activeEditSession) ->
currentRanges = activeEditSession.getSelectedBufferRanges()
execute: (project, editSession) ->
currentRanges = editSession.getSelectedBufferRanges()
for command in @subcommands
newRanges = []
operations = []
for range in currentRanges
newRanges.push(command.execute(project, activeEditSession.buffer, range)...)
currentRanges = newRanges
operations.push(command.compile(project, editSession.buffer, range)...)
currentRanges = operations.map (o) -> o.getBufferRange()
unless command.preserveSelections
activeEditSession.setSelectedBufferRanges(currentRanges)
editSession.clearAllSelections() unless command.preserveSelections
operation.execute(editSession) for operation in operations
reverse: ->
new CompositeCommand(@subcommands.map (command) -> command.reverse())

View File

@ -1,5 +1,5 @@
Command = require 'command-panel/commands/command'
Range = require 'range'
Operation = require 'command-panel/operation'
module.exports =
class SelectAllMatches extends Command
@ -8,8 +8,8 @@ class SelectAllMatches extends Command
constructor: (pattern) ->
@regex = new RegExp(pattern, 'g')
execute: (project, buffer, range) ->
rangesToSelect = []
compile: (project, buffer, range) ->
operations = []
buffer.scanInRange @regex, range, (match, matchRange) ->
rangesToSelect.push(matchRange)
rangesToSelect
operations.push(new Operation(buffer: buffer, bufferRange: matchRange))
operations

View File

@ -1,4 +1,5 @@
Command = require 'command-panel/commands/command'
Operation = require 'command-panel/operation'
module.exports =
class Substitution extends Command
@ -10,7 +11,13 @@ class Substitution extends Command
@replacementText = replacementText
@regex = new RegExp(pattern, options.join(''))
execute: (project, buffer, range) ->
compile: (project, buffer, range) ->
operations = []
buffer.scanInRange @regex, range, (match, matchRange, { replace }) =>
replace(@replacementText)
[range]
operations.push(new Operation(
buffer: buffer,
bufferRange: matchRange,
newText: @replacementText
preserveSelection: true
))
operations

View File

@ -0,0 +1,11 @@
module.exports =
class Operation
constructor: ({@buffer, bufferRange, @newText, @preserveSelection}) ->
@anchorRange = @buffer.addAnchorRange(bufferRange)
getBufferRange: -> @bufferRange
execute: (editSession) ->
@buffer.change(@getBufferRange(), @newText) if @newText
editSession.addSelectionForBufferRange(@getBufferRange()) unless @preserveSelection