Skip to content
This repository was archived by the owner on Apr 6, 2018. It is now read-only.

Commit 2ab86b2

Browse files
author
Max Brunsfeld
committed
Merge pull request #844 from jacekkopecky/text-objects-expand-selection
make text objects expand the selection, not replace it
2 parents d5e6779 + 28ad1a7 commit 2ab86b2

File tree

3 files changed

+258
-13
lines changed

3 files changed

+258
-13
lines changed

lib/text-objects.coffee

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{Range} = require 'atom'
22
AllWhitespace = /^\s$/
33
WholeWordRegex = /\S+/
4+
{mergeRanges} = require './utils'
45

56
class TextObject
67
constructor: (@editor, @state) ->
@@ -12,14 +13,15 @@ class TextObject
1213

1314
class SelectInsideWord extends TextObject
1415
select: ->
15-
@editor.selectWordsContainingCursors()
16+
for selection in @editor.getSelections()
17+
selection.expandOverWord()
1618
[true]
1719

1820
class SelectInsideWholeWord extends TextObject
1921
select: ->
2022
for selection in @editor.getSelections()
2123
range = selection.cursor.getCurrentWordBufferRange({wordRegex: WholeWordRegex})
22-
selection.setBufferRange(range)
24+
selection.setBufferRange(mergeRanges(selection.getBufferRange(), range))
2325
true
2426

2527
# SelectInsideQuotes and the next class defined (SelectInsideBrackets) are
@@ -86,7 +88,7 @@ class SelectInsideQuotes extends TextObject
8688
++ start.column # skip the opening quote
8789
end = @findClosingQuote(start)
8890
if end?
89-
selection.setBufferRange([start, end])
91+
selection.setBufferRange(mergeRanges(selection.getBufferRange(), [start, end]))
9092
not selection.isEmpty()
9193

9294
# SelectInsideBrackets and the previous class defined (SelectInsideQuotes) are
@@ -136,13 +138,13 @@ class SelectInsideBrackets extends TextObject
136138
++ start.column # skip the opening quote
137139
end = @findClosingBracket(start)
138140
if end?
139-
selection.setBufferRange([start, end])
141+
selection.setBufferRange(mergeRanges(selection.getBufferRange(), [start, end]))
140142
not selection.isEmpty()
141143

142144
class SelectAWord extends TextObject
143145
select: ->
144146
for selection in @editor.getSelections()
145-
selection.selectWord()
147+
selection.expandOverWord()
146148
loop
147149
endPoint = selection.getBufferRange().end
148150
char = @editor.getTextInRange(Range.fromPointWithDelta(endPoint, 0, 1))
@@ -154,7 +156,7 @@ class SelectAWholeWord extends TextObject
154156
select: ->
155157
for selection in @editor.getSelections()
156158
range = selection.cursor.getCurrentWordBufferRange({wordRegex: WholeWordRegex})
157-
selection.setBufferRange(range)
159+
selection.setBufferRange(mergeRanges(selection.getBufferRange(), range))
158160
loop
159161
endPoint = selection.getBufferRange().end
160162
char = @editor.getTextInRange(Range.fromPointWithDelta(endPoint, 0, 1))
@@ -186,17 +188,19 @@ class Paragraph extends TextObject
186188

187189
class SelectInsideParagraph extends Paragraph
188190
selectParagraph: (selection) ->
189-
startPoint = selection.getBufferRange().start
190-
range = @paragraphDelimitedRange(startPoint)
191-
selection.setBufferRange(range)
191+
oldRange = selection.getBufferRange()
192+
startPoint = selection.cursor.getBufferPosition()
193+
newRange = @paragraphDelimitedRange(startPoint)
194+
selection.setBufferRange(mergeRanges(oldRange, newRange))
192195
true
193196

194197
class SelectAParagraph extends Paragraph
195198
selectParagraph: (selection) ->
196-
startPoint = selection.getBufferRange().start
197-
range = @paragraphDelimitedRange(startPoint)
198-
nextRange = @paragraphDelimitedRange(range.end)
199-
selection.setBufferRange([range.start, nextRange.end])
199+
oldRange = selection.getBufferRange()
200+
startPoint = selection.cursor.getBufferPosition()
201+
newRange = @paragraphDelimitedRange(startPoint)
202+
nextRange = @paragraphDelimitedRange(newRange.end)
203+
selection.setBufferRange(mergeRanges(oldRange, [newRange.start, nextRange.end]))
200204
true
201205

202206
module.exports = {TextObject, SelectInsideWord, SelectInsideWholeWord, SelectInsideQuotes,

lib/utils.coffee

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
{Range} = require 'atom'
2+
13
module.exports =
24
# Public: Determines if a string should be considered linewise or character
35
#
@@ -12,3 +14,14 @@ module.exports =
1214
'linewise'
1315
else
1416
'character'
17+
18+
# Public: return a union of two ranges, or simply the newRange if the oldRange is empty.
19+
#
20+
# Returns a Range
21+
mergeRanges: (oldRange, newRange) ->
22+
oldRange = Range.fromObject oldRange
23+
newRange = Range.fromObject newRange
24+
if oldRange.isEmpty()
25+
newRange
26+
else
27+
oldRange.union(newRange)

0 commit comments

Comments
 (0)