mirror of
https://github.com/atom/atom.git
synced 2026-02-11 07:05:11 -05: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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user