mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-22 00:19:24 +03:00
CommandInterpreter uses project and edit sessions instead of editor to execute
We don't want to pass view objects into it!
This commit is contained in:
parent
a4db677979
commit
42f322a112
@ -1,76 +1,74 @@
|
||||
CommandInterpreter = require 'command-panel/command-interpreter'
|
||||
Buffer = require 'buffer'
|
||||
EditSession = require 'edit-session'
|
||||
Editor = require 'editor'
|
||||
|
||||
describe "CommandInterpreter", ->
|
||||
[interpreter, editor, buffer] = []
|
||||
[interpreter, editSession, buffer] = []
|
||||
|
||||
beforeEach ->
|
||||
interpreter = new CommandInterpreter(fixturesProject)
|
||||
editSession = fixturesProject.open('sample.js')
|
||||
buffer = editSession.buffer
|
||||
editor = new Editor(editSession: editSession)
|
||||
interpreter = new CommandInterpreter()
|
||||
|
||||
afterEach ->
|
||||
editor.remove()
|
||||
editSession.destroy()
|
||||
|
||||
describe "addresses", ->
|
||||
beforeEach ->
|
||||
editor.addSelectionForBufferRange([[7,0], [7,11]])
|
||||
editor.addSelectionForBufferRange([[8,0], [8,11]])
|
||||
editSession.addSelectionForBufferRange([[7,0], [7,11]])
|
||||
editSession.addSelectionForBufferRange([[8,0], [8,11]])
|
||||
|
||||
describe "a line address", ->
|
||||
it "selects the specified line", ->
|
||||
interpreter.eval(editor, '4')
|
||||
expect(editor.getSelections().length).toBe 1
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[3, 0], [4, 0]]
|
||||
interpreter.eval('4', editSession)
|
||||
expect(editSession.getSelections().length).toBe 1
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[3, 0], [4, 0]]
|
||||
|
||||
describe "0", ->
|
||||
it "selects the zero-length string at the start of the file", ->
|
||||
interpreter.eval(editor, '0')
|
||||
expect(editor.getSelections().length).toBe 1
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[0,0], [0,0]]
|
||||
interpreter.eval('0', editSession)
|
||||
expect(editSession.getSelections().length).toBe 1
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[0,0], [0,0]]
|
||||
|
||||
interpreter.eval(editor, '0,1')
|
||||
expect(editor.getSelections().length).toBe 1
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[0,0], [1,0]]
|
||||
interpreter.eval('0,1', editSession)
|
||||
expect(editSession.getSelections().length).toBe 1
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[0,0], [1,0]]
|
||||
|
||||
describe "$", ->
|
||||
it "selects EOF", ->
|
||||
interpreter.eval(editor, '$')
|
||||
expect(editor.getSelections().length).toBe 1
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[12,2], [12,2]]
|
||||
interpreter.eval('$', editSession)
|
||||
expect(editSession.getSelections().length).toBe 1
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[12,2], [12,2]]
|
||||
|
||||
interpreter.eval(editor, '1,$')
|
||||
expect(editor.getSelections().length).toBe 1
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[0,0], [12,2]]
|
||||
interpreter.eval('1,$', editSession)
|
||||
expect(editSession.getSelections().length).toBe 1
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[0,0], [12,2]]
|
||||
|
||||
describe ".", ->
|
||||
describe "when a single selection", ->
|
||||
it 'maintains the current selection', ->
|
||||
editor.clearSelections()
|
||||
editor.setSelectedBufferRange([[1,1], [2,2]])
|
||||
interpreter.eval(editor, '.')
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[1,1], [2,2]]
|
||||
editSession.clearSelections()
|
||||
editSession.setSelectedBufferRange([[1,1], [2,2]])
|
||||
interpreter.eval('.', editSession)
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[1,1], [2,2]]
|
||||
|
||||
editor.setSelectedBufferRange([[1,1], [2,2]])
|
||||
interpreter.eval(editor, '.,')
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[1,1], [12,2]]
|
||||
editSession.setSelectedBufferRange([[1,1], [2,2]])
|
||||
interpreter.eval('.,', editSession)
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[1,1], [12,2]]
|
||||
|
||||
editor.setSelectedBufferRange([[1,1], [2,2]])
|
||||
interpreter.eval(editor, ',.')
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[0,0], [2,2]]
|
||||
editSession.setSelectedBufferRange([[1,1], [2,2]])
|
||||
interpreter.eval(',.', editSession)
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[0,0], [2,2]]
|
||||
|
||||
describe "with multiple selections", ->
|
||||
it "maintains the current selections", ->
|
||||
preSelections = editor.getSelections()
|
||||
preSelections = editSession.getSelections()
|
||||
expect(preSelections.length).toBe 3
|
||||
[preRange1, preRange2, preRange3] = preSelections.map (s) -> s.getScreenRange()
|
||||
|
||||
interpreter.eval(editor, '.')
|
||||
interpreter.eval('.', editSession)
|
||||
|
||||
selections = editor.getSelections()
|
||||
selections = editSession.getSelections()
|
||||
expect(selections.length).toBe 3
|
||||
[selection1, selection2, selection3] = selections
|
||||
expect(selection1.getScreenRange()).toEqual preRange1
|
||||
@ -79,72 +77,72 @@ describe "CommandInterpreter", ->
|
||||
|
||||
describe "/regex/", ->
|
||||
beforeEach ->
|
||||
editor.clearSelections()
|
||||
editSession.clearSelections()
|
||||
|
||||
it 'selects text matching regex after current selection', ->
|
||||
editor.setSelectedBufferRange([[4,16], [4,20]])
|
||||
interpreter.eval(editor, '/pivot/')
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[6,16], [6,21]]
|
||||
editSession.setSelectedBufferRange([[4,16], [4,20]])
|
||||
interpreter.eval('/pivot/', editSession)
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[6,16], [6,21]]
|
||||
|
||||
it 'does not require the trailing slash', ->
|
||||
editor.setSelectedBufferRange([[4,16], [4,20]])
|
||||
interpreter.eval(editor, '/pivot')
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[6,16], [6,21]]
|
||||
editSession.setSelectedBufferRange([[4,16], [4,20]])
|
||||
interpreter.eval('/pivot', editSession)
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[6,16], [6,21]]
|
||||
|
||||
it "searches from the end of each selection in the buffer", ->
|
||||
editor.clearSelections()
|
||||
editor.setSelectedBufferRange([[4,16], [4,20]])
|
||||
editor.addSelectionForBufferRange([[1,16], [2,20]])
|
||||
expect(editor.getSelections().length).toBe 2
|
||||
interpreter.eval(editor, '/pivot')
|
||||
selections = editor.getSelections()
|
||||
editSession.clearSelections()
|
||||
editSession.setSelectedBufferRange([[4,16], [4,20]])
|
||||
editSession.addSelectionForBufferRange([[1,16], [2,20]])
|
||||
expect(editSession.getSelections().length).toBe 2
|
||||
interpreter.eval('/pivot', editSession)
|
||||
selections = editSession.getSelections()
|
||||
expect(selections.length).toBe 2
|
||||
expect(selections[0].getBufferRange()).toEqual [[3,8], [3,13]]
|
||||
expect(selections[1].getBufferRange()).toEqual [[6,16], [6,21]]
|
||||
|
||||
it "wraps around to the beginning of the buffer, but doesn't infinitely loop if no matches are found", ->
|
||||
editor.setSelectedBufferRange([[10, 0], [10,3]])
|
||||
interpreter.eval(editor, '/pivot')
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
|
||||
editSession.setSelectedBufferRange([[10, 0], [10,3]])
|
||||
interpreter.eval('/pivot', editSession)
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
|
||||
|
||||
interpreter.eval(editor, '/mike tyson')
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
|
||||
interpreter.eval('/mike tyson', editSession)
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
|
||||
|
||||
it "searches in reverse when prefixed with a -", ->
|
||||
editor.setSelectedBufferRange([[6, 16], [6, 22]])
|
||||
interpreter.eval(editor, '-/pivot')
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
|
||||
editSession.setSelectedBufferRange([[6, 16], [6, 22]])
|
||||
interpreter.eval('-/pivot', editSession)
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[3,8], [3,13]]
|
||||
|
||||
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", ->
|
||||
interpreter.eval(editor, '4,7')
|
||||
expect(editor.getSelections().length).toBe 1
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[3, 0], [7, 0]]
|
||||
interpreter.eval('4,7', editSession)
|
||||
expect(editSession.getSelections().length).toBe 1
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[3, 0], [7, 0]]
|
||||
|
||||
describe "when the left address is unspecified", ->
|
||||
it "selects from the begining of buffer to the end of the right address", ->
|
||||
interpreter.eval(editor, ',7')
|
||||
expect(editor.getSelections().length).toBe 1
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[0, 0], [7, 0]]
|
||||
interpreter.eval(',7', editSession)
|
||||
expect(editSession.getSelections().length).toBe 1
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[0, 0], [7, 0]]
|
||||
|
||||
describe "when the right address is unspecified", ->
|
||||
it "selects from the begining of left address to the end file", ->
|
||||
interpreter.eval(editor, '4,')
|
||||
expect(editor.getSelections().length).toBe 1
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[3, 0], [12, 2]]
|
||||
interpreter.eval('4,', editSession)
|
||||
expect(editSession.getSelections().length).toBe 1
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[3, 0], [12, 2]]
|
||||
|
||||
describe "when the neither address is specified", ->
|
||||
it "selects the entire file", ->
|
||||
interpreter.eval(editor, ',')
|
||||
expect(editor.getSelections().length).toBe 1
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[0, 0], [12, 2]]
|
||||
interpreter.eval(',', editSession)
|
||||
expect(editSession.getSelections().length).toBe 1
|
||||
expect(editSession.getSelection().getBufferRange()).toEqual [[0, 0], [12, 2]]
|
||||
|
||||
describe "x/regex/", ->
|
||||
it "sets the current selection to every match of the regex in the current selection", ->
|
||||
interpreter.eval(editor, '6,7 x/current/')
|
||||
interpreter.eval('6,7 x/current/', editSession)
|
||||
|
||||
selections = editor.getSelections()
|
||||
selections = editSession.getSelections()
|
||||
expect(selections.length).toBe 4
|
||||
|
||||
expect(selections[0].getBufferRange()).toEqual [[5,6], [5,13]]
|
||||
@ -154,9 +152,9 @@ describe "CommandInterpreter", ->
|
||||
|
||||
describe "when matching /$/", ->
|
||||
it "matches the end of each line in the selected region", ->
|
||||
interpreter.eval(editor, '6,8 x/$/')
|
||||
interpreter.eval('6,8 x/$/', editSession)
|
||||
|
||||
cursors = editor.getCursors()
|
||||
cursors = editSession.getCursors()
|
||||
expect(cursors.length).toBe 3
|
||||
|
||||
expect(cursors[0].getBufferPosition()).toEqual [5, 30]
|
||||
@ -164,12 +162,12 @@ describe "CommandInterpreter", ->
|
||||
expect(cursors[2].getBufferPosition()).toEqual [7, 5]
|
||||
|
||||
it "loops through current selections and selects text matching the regex", ->
|
||||
editor.setSelectedBufferRange [[3,0], [3,62]]
|
||||
editor.addSelectionForBufferRange [[6,0], [6,65]]
|
||||
editSession.setSelectedBufferRange [[3,0], [3,62]]
|
||||
editSession.addSelectionForBufferRange [[6,0], [6,65]]
|
||||
|
||||
interpreter.eval(editor, 'x/current')
|
||||
interpreter.eval('x/current', editSession)
|
||||
|
||||
selections = editor.getSelections()
|
||||
selections = editSession.getSelections()
|
||||
expect(selections.length).toBe 4
|
||||
|
||||
expect(selections[0].getBufferRange()).toEqual [[3,31], [3,38]]
|
||||
@ -179,35 +177,35 @@ describe "CommandInterpreter", ->
|
||||
|
||||
describe "substitution", ->
|
||||
it "does nothing if there are no matches", ->
|
||||
editor.setSelectedBufferRange([[6, 0], [6, 44]])
|
||||
interpreter.eval(editor, 's/not-in-text/foo/')
|
||||
editSession.setSelectedBufferRange([[6, 0], [6, 44]])
|
||||
interpreter.eval('s/not-in-text/foo/', editSession)
|
||||
expect(buffer.lineForRow(6)).toBe ' current < pivot ? left.push(current) : right.push(current);'
|
||||
|
||||
describe "when not global", ->
|
||||
describe "when there is a single selection", ->
|
||||
it "performs a single substitution within the current selection", ->
|
||||
editor.setSelectedBufferRange([[6, 0], [6, 44]])
|
||||
interpreter.eval(editor, 's/current/foo/')
|
||||
editSession.setSelectedBufferRange([[6, 0], [6, 44]])
|
||||
interpreter.eval('s/current/foo/', editSession)
|
||||
expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(current) : right.push(current);'
|
||||
|
||||
describe "when there are multiple selections", ->
|
||||
it "performs a single substitutions within each of the selections", ->
|
||||
editor.setSelectedBufferRange([[5, 0], [5, 20]])
|
||||
editor.addSelectionForBufferRange([[6, 0], [6, 44]])
|
||||
editSession.setSelectedBufferRange([[5, 0], [5, 20]])
|
||||
editSession.addSelectionForBufferRange([[6, 0], [6, 44]])
|
||||
|
||||
interpreter.eval(editor, 's/current/foo/')
|
||||
interpreter.eval('s/current/foo/', editSession)
|
||||
expect(buffer.lineForRow(5)).toBe ' foo = items.shift();'
|
||||
expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(current) : right.push(current);'
|
||||
|
||||
describe "when global", ->
|
||||
it "performs a multiple substitutions within the current selection", ->
|
||||
editor.setSelectedBufferRange([[6, 0], [6, 44]])
|
||||
interpreter.eval(editor, 's/current/foo/g')
|
||||
editSession.setSelectedBufferRange([[6, 0], [6, 44]])
|
||||
interpreter.eval('s/current/foo/g', editSession)
|
||||
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,6s/ /!/g')
|
||||
interpreter.eval('4,6s/ /!/g', editSession)
|
||||
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)!{'
|
||||
@ -216,7 +214,7 @@ describe "CommandInterpreter", ->
|
||||
|
||||
describe "when matching $", ->
|
||||
it "matches the end of each line and avoids infinitely looping on a zero-width match", ->
|
||||
interpreter.eval(editor, ',s/$/!!!/g')
|
||||
interpreter.eval(',s/$/!!!/g', editSession)
|
||||
expect(buffer.lineForRow(0)).toBe 'var quicksort = function () {!!!'
|
||||
expect(buffer.lineForRow(2)).toBe ' if (items.length <= 1) return items;!!!'
|
||||
expect(buffer.lineForRow(6)).toBe ' current < pivot ? left.push(current) : right.push(current);!!!'
|
||||
@ -224,7 +222,7 @@ describe "CommandInterpreter", ->
|
||||
|
||||
describe "when matching ^", ->
|
||||
it "matches the beginning of each line and avoids infinitely looping on a zero-width match", ->
|
||||
interpreter.eval(editor, ',s/^/!!!/g')
|
||||
interpreter.eval(',s/^/!!!/g', editSession)
|
||||
expect(buffer.lineForRow(0)).toBe '!!!var quicksort = function () {'
|
||||
expect(buffer.lineForRow(2)).toBe '!!! if (items.length <= 1) return items;'
|
||||
expect(buffer.lineForRow(6)).toBe '!!! current < pivot ? left.push(current) : right.push(current);'
|
||||
@ -232,27 +230,27 @@ describe "CommandInterpreter", ->
|
||||
|
||||
describe "when there are multiple selections", ->
|
||||
it "performs a multiple substitutions within each of the selections", ->
|
||||
editor.setSelectedBufferRange([[5, 0], [5, 20]])
|
||||
editor.addSelectionForBufferRange([[6, 0], [6, 44]])
|
||||
editSession.setSelectedBufferRange([[5, 0], [5, 20]])
|
||||
editSession.addSelectionForBufferRange([[6, 0], [6, 44]])
|
||||
|
||||
interpreter.eval(editor, 's/current/foo/g')
|
||||
interpreter.eval('s/current/foo/g', editSession)
|
||||
expect(buffer.lineForRow(5)).toBe ' foo = items.shift();'
|
||||
expect(buffer.lineForRow(6)).toBe ' foo < pivot ? left.push(foo) : right.push(current);'
|
||||
|
||||
describe "when prefixed with an address", ->
|
||||
it "restores the original selections upon completion if it is the last command", ->
|
||||
editor.setSelectedBufferRanges([[[5, 0], [5, 20]], [[6, 0], [6, 44]]])
|
||||
interpreter.eval(editor, ',s/current/foo/g')
|
||||
expect(editor.getSelectedBufferRanges()).toEqual [[[5, 0], [5, 16]], [[6, 0], [6, 36]]]
|
||||
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", ->
|
||||
editor.createFold(1, 9)
|
||||
editor.createFold(5, 8)
|
||||
editor.setSelectedBufferRange([[0,0], [0,0]])
|
||||
editSession.createFold(1, 9)
|
||||
editSession.createFold(5, 8)
|
||||
editSession.setSelectedBufferRange([[0,0], [0,0]])
|
||||
|
||||
interpreter.eval(editor, '/push/')
|
||||
expect(editor.getSelection().getBufferRange()).toEqual [[6,29], [6,33]]
|
||||
expect(editor.lineForScreenRow(1).fold).toBeUndefined()
|
||||
expect(editor.lineForScreenRow(5).fold).toBeUndefined()
|
||||
expect(editor.lineForScreenRow(6).text).toBe buffer.lineForRow(6)
|
||||
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)
|
||||
|
@ -162,6 +162,9 @@ class RootView extends View
|
||||
else
|
||||
@panes.find('.editor:first').view()
|
||||
|
||||
getActiveEditSession: ->
|
||||
@getActiveEditor()?.activeEditSession
|
||||
|
||||
focusNextPane: ->
|
||||
panes = @panes.find('.pane')
|
||||
currentIndex = panes.toArray().indexOf(@getFocusedPane()[0])
|
||||
|
@ -3,16 +3,16 @@ PEG = require 'pegjs'
|
||||
|
||||
module.exports =
|
||||
class CommandInterpreter
|
||||
constructor: ->
|
||||
constructor: (@project) ->
|
||||
@parser = PEG.buildParser(fs.read(require.resolve 'command-panel/commands.pegjs'))
|
||||
|
||||
eval: (editor, string) ->
|
||||
eval: (string, activeEditSession) ->
|
||||
compositeCommand = @parser.parse(string)
|
||||
@lastRelativeAddress = compositeCommand if compositeCommand.isRelativeAddress()
|
||||
compositeCommand.execute(editor)
|
||||
compositeCommand.execute(@project, activeEditSession)
|
||||
|
||||
repeatRelativeAddress: (editor) ->
|
||||
@lastRelativeAddress?.execute(editor)
|
||||
repeatRelativeAddress: (activeEditSession) ->
|
||||
@lastRelativeAddress?.execute(@project, activeEditSession)
|
||||
|
||||
repeatRelativeAddressInReverse: (editor) ->
|
||||
@lastRelativeAddress?.reverse().execute(editor)
|
||||
repeatRelativeAddressInReverse: (activeEditSession) ->
|
||||
@lastRelativeAddress?.reverse().execute(@project, activeEditSession)
|
||||
|
@ -35,7 +35,7 @@ class CommandPanel extends View
|
||||
historyIndex: 0
|
||||
|
||||
initialize: (@rootView)->
|
||||
@commandInterpreter = new CommandInterpreter()
|
||||
@commandInterpreter = new CommandInterpreter(@rootView.project)
|
||||
@history = []
|
||||
|
||||
@rootView.on 'command-panel:toggle', => @toggle()
|
||||
@ -64,7 +64,7 @@ class CommandPanel extends View
|
||||
|
||||
execute: (command = @miniEditor.getText()) ->
|
||||
try
|
||||
@commandInterpreter.eval(@rootView.getActiveEditor(), command)
|
||||
@commandInterpreter.eval(command, @rootView.getActiveEditSession())
|
||||
catch error
|
||||
if error instanceof SyntaxError
|
||||
@flashError()
|
||||
@ -87,10 +87,10 @@ class CommandPanel extends View
|
||||
@miniEditor.setText(@history[@historyIndex] or '')
|
||||
|
||||
repeatRelativeAddress: ->
|
||||
@commandInterpreter.repeatRelativeAddress(@rootView.getActiveEditor())
|
||||
@commandInterpreter.repeatRelativeAddress(@rootView.getActiveEditSession())
|
||||
|
||||
repeatRelativeAddressInReverse: ->
|
||||
@commandInterpreter.repeatRelativeAddressInReverse(@rootView.getActiveEditor())
|
||||
@commandInterpreter.repeatRelativeAddressInReverse(@rootView.getActiveEditSession())
|
||||
|
||||
setSelectionAsLastRelativeAddress: ->
|
||||
selection = @rootView.getActiveEditor().getSelectedText()
|
||||
|
@ -5,8 +5,8 @@ module.exports =
|
||||
class AddressRange extends Address
|
||||
constructor: (@startAddress, @endAddress) ->
|
||||
|
||||
getRange: (editor, currentRange) ->
|
||||
new Range(@startAddress.getRange(editor, currentRange).start, @endAddress.getRange(editor, currentRange).end)
|
||||
getRange: (buffer, range) ->
|
||||
new Range(@startAddress.getRange(buffer, range).start, @endAddress.getRange(buffer, range).end)
|
||||
|
||||
isRelative: ->
|
||||
@startAddress.isRelative() and @endAddress.isRelative()
|
||||
|
@ -2,7 +2,7 @@ Command = require 'command-panel/commands/command'
|
||||
|
||||
module.exports =
|
||||
class Address extends Command
|
||||
execute: (editor, currentRange) ->
|
||||
[@getRange(editor, currentRange)]
|
||||
execute: (project, buffer, range) ->
|
||||
[@getRange(buffer, range)]
|
||||
|
||||
isAddress: -> true
|
||||
|
@ -4,19 +4,17 @@ module.exports =
|
||||
class CompositeCommand
|
||||
constructor: (@subcommands) ->
|
||||
|
||||
execute: (editor) ->
|
||||
currentRanges = editor.getSelectedBufferRanges()
|
||||
execute: (project, activeEditSession) ->
|
||||
currentRanges = activeEditSession.getSelectedBufferRanges()
|
||||
|
||||
for command in @subcommands
|
||||
newRanges = []
|
||||
for range in currentRanges
|
||||
newRanges.push(command.execute(editor, range)...)
|
||||
newRanges.push(command.execute(project, activeEditSession.buffer, range)...)
|
||||
currentRanges = newRanges
|
||||
|
||||
unless command.preserveSelections
|
||||
for range in currentRanges
|
||||
for row in [range.start.row..range.end.row]
|
||||
editor.destroyFoldsContainingBufferRow(row)
|
||||
editor.setSelectedBufferRanges(currentRanges)
|
||||
activeEditSession.setSelectedBufferRanges(currentRanges)
|
||||
|
||||
reverse: ->
|
||||
new CompositeCommand(@subcommands.map (command) -> command.reverse())
|
||||
|
@ -3,7 +3,7 @@ Range = require 'range'
|
||||
|
||||
module.exports =
|
||||
class CurrentSelectionAddress extends Address
|
||||
getRange: (editor, currentRange) ->
|
||||
currentRange
|
||||
getRange: (buffer, range) ->
|
||||
range
|
||||
|
||||
isRelative: -> true
|
||||
|
@ -3,9 +3,8 @@ Range = require 'range'
|
||||
|
||||
module.exports =
|
||||
class EofAddress extends Address
|
||||
getRange: (editor) ->
|
||||
lastRow = editor.getLastBufferRow()
|
||||
column = editor.lineLengthForBufferRow(lastRow)
|
||||
new Range([lastRow, column], [lastRow, column])
|
||||
getRange: (buffer, range) ->
|
||||
eof = buffer.getEofPosition()
|
||||
new Range(eof, eof)
|
||||
|
||||
isRelative: -> false
|
||||
|
@ -10,25 +10,25 @@ class RegexAddress extends Address
|
||||
@isReversed = isReversed
|
||||
@regex = new RegExp(pattern)
|
||||
|
||||
getRange: (editor, currentRange) ->
|
||||
rangeBefore = new Range([0, 0], currentRange.start)
|
||||
rangeAfter = new Range(currentRange.end, editor.getEofPosition())
|
||||
getRange: (buffer, range) ->
|
||||
rangeBefore = new Range([0, 0], range.start)
|
||||
rangeAfter = new Range(range.end, buffer.getEofPosition())
|
||||
|
||||
rangeToSearch = if @isReversed then rangeBefore else rangeAfter
|
||||
|
||||
rangeToReturn = null
|
||||
scanMethodName = if @isReversed then "backwardsScanInRange" else "scanInRange"
|
||||
editor[scanMethodName] @regex, rangeToSearch, (match, range) ->
|
||||
buffer[scanMethodName] @regex, rangeToSearch, (match, range) ->
|
||||
rangeToReturn = range
|
||||
|
||||
if rangeToReturn
|
||||
rangeToReturn
|
||||
else
|
||||
rangeToSearch = if @isReversed then rangeAfter else rangeBefore
|
||||
editor[scanMethodName] @regex, rangeToSearch, (match, range) ->
|
||||
buffer[scanMethodName] @regex, rangeToSearch, (match, range) ->
|
||||
rangeToReturn = range
|
||||
|
||||
rangeToReturn or currentRange
|
||||
rangeToReturn or range
|
||||
|
||||
isRelative: -> true
|
||||
|
||||
|
@ -8,8 +8,8 @@ class SelectAllMatches extends Command
|
||||
constructor: (pattern) ->
|
||||
@regex = new RegExp(pattern, 'g')
|
||||
|
||||
execute: (editor, currentRange) ->
|
||||
execute: (project, buffer, range) ->
|
||||
rangesToSelect = []
|
||||
editor.scanInRange @regex, currentRange, (match, range) ->
|
||||
rangesToSelect.push(range)
|
||||
buffer.scanInRange @regex, range, (match, matchRange) ->
|
||||
rangesToSelect.push(matchRange)
|
||||
rangesToSelect
|
||||
|
@ -10,7 +10,7 @@ class Substitution extends Command
|
||||
@replacementText = replacementText
|
||||
@regex = new RegExp(pattern, options.join(''))
|
||||
|
||||
execute: (editor, currentRange) ->
|
||||
editor.scanInRange @regex, currentRange, (match, matchRange, { replace }) =>
|
||||
execute: (project, buffer, range) ->
|
||||
buffer.scanInRange @regex, range, (match, matchRange, { replace }) =>
|
||||
replace(@replacementText)
|
||||
[currentRange]
|
||||
[range]
|
||||
|
@ -3,7 +3,7 @@ Range = require 'range'
|
||||
|
||||
module.exports =
|
||||
class ZeroAddress extends Address
|
||||
getRange: (editor) ->
|
||||
getRange: ->
|
||||
new Range([0, 0], [0, 0])
|
||||
|
||||
isRelative: -> false
|
||||
|
Loading…
Reference in New Issue
Block a user