mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-22 00:19:24 +03:00
WIP: Converting to operations, but substitution operations need anchor ranges
This commit is contained in:
parent
926067164d
commit
fd24b82d47
@ -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)
|
||||
|
@ -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) ->
|
||||
|
@ -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
|
||||
|
@ -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())
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
11
src/extensions/command-panel/operation.coffee
Normal file
11
src/extensions/command-panel/operation.coffee
Normal 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
|
Loading…
Reference in New Issue
Block a user