diff --git a/spec/extensions/command-interpreter-spec.coffee b/spec/extensions/command-interpreter-spec.coffee index 57239d638..816bb5bd8 100644 --- a/spec/extensions/command-interpreter-spec.coffee +++ b/spec/extensions/command-interpreter-spec.coffee @@ -239,6 +239,12 @@ describe "CommandInterpreter", -> 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, 20]], [[6, 0], [6, 44]]] + describe "when command selects folded text", -> it "unfolds lines that command selects", -> editor.createFold(1, 9) diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 42da5e430..3a70a89c0 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -351,7 +351,7 @@ class EditSession @getLastSelection().getBufferRange() getSelectedBufferRanges: -> - selection.getBufferRange() for selection in @selections + selection.getBufferRange() for selection in @getSelectionsOrderedByBufferPosition() getSelectedText: -> @getLastSelection().getText() diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 1bd818d56..a93cd06ae 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -184,6 +184,7 @@ class Editor extends View getSelectionsOrderedByBufferPosition: -> @activeEditSession.getSelectionsOrderedByBufferPosition() getLastSelectionInBuffer: -> @activeEditSession.getLastSelectionInBuffer() getSelectedText: -> @activeEditSession.getSelectedText() + getSelectedBufferRanges: -> @activeEditSession.getSelectedBufferRanges() getSelectedBufferRange: -> @activeEditSession.getSelectedBufferRange() setSelectedBufferRange: (bufferRange, options) -> @activeEditSession.setSelectedBufferRange(bufferRange, options) setSelectedBufferRanges: (bufferRanges, options) -> @activeEditSession.setSelectedBufferRanges(bufferRanges, options) diff --git a/src/extensions/command-interpreter/command.coffee b/src/extensions/command-interpreter/command.coffee index c60b685b0..5c6487384 100644 --- a/src/extensions/command-interpreter/command.coffee +++ b/src/extensions/command-interpreter/command.coffee @@ -3,3 +3,4 @@ _ = require 'underscore' module.exports = class Command isAddress: -> false + restoreSelections: false diff --git a/src/extensions/command-interpreter/composite-command.coffee b/src/extensions/command-interpreter/composite-command.coffee index 0dc9ceed2..90323ef19 100644 --- a/src/extensions/command-interpreter/composite-command.coffee +++ b/src/extensions/command-interpreter/composite-command.coffee @@ -5,9 +5,10 @@ class CompositeCommand constructor: (@subcommands) -> execute: (editor) -> + initialRanges = editor.getSelectedBufferRanges() for command in @subcommands newRanges = [] - currentRanges = editor.getSelectionsOrderedByBufferPosition().map (selection) -> selection.getBufferRange() + currentRanges = editor.getSelectedBufferRanges() for currentRange in currentRanges newRanges.push(command.execute(editor, currentRange)...) @@ -16,6 +17,7 @@ class CompositeCommand editor.destroyFoldsContainingBufferRow(row) editor.setSelectedBufferRanges(newRanges) + editor.setSelectedBufferRanges(initialRanges) if command.restoreSelections reverse: -> new CompositeCommand(@subcommands.map (command) -> command.reverse()) diff --git a/src/extensions/command-interpreter/substitution.coffee b/src/extensions/command-interpreter/substitution.coffee index 9851d2137..2fd3473cc 100644 --- a/src/extensions/command-interpreter/substitution.coffee +++ b/src/extensions/command-interpreter/substitution.coffee @@ -4,6 +4,7 @@ module.exports = class Substitution extends Command regex: null replacementText: null + restoreSelections: true constructor: (pattern, replacementText, options) -> @replacementText = replacementText