]> git.r.bdr.sh - rbdr/dotfiles/blobdiff - atom/packages/vim-mode/lib/text-objects.coffee
Adds atom packages
[rbdr/dotfiles] / atom / packages / vim-mode / lib / text-objects.coffee
index 6d9741b93038ae16987ea7191d301fcdb8c509f8..bf386057f583ab8832ed77db33e1daeee7ab412c 100644 (file)
@@ -1,5 +1,7 @@
 {Range} = require 'atom'
 AllWhitespace = /^\s$/
+WholeWordRegex = /\S+/
+{mergeRanges} = require './utils'
 
 class TextObject
   constructor: (@editor, @state) ->
@@ -7,11 +9,21 @@ class TextObject
   isComplete: -> true
   isRecordable: -> false
 
+  execute: -> @select.apply(this, arguments)
+
 class SelectInsideWord extends TextObject
   select: ->
-    @editor.selectWordsContainingCursors()
+    for selection in @editor.getSelections()
+      selection.expandOverWord()
     [true]
 
+class SelectInsideWholeWord extends TextObject
+  select: ->
+    for selection in @editor.getSelections()
+      range = selection.cursor.getCurrentWordBufferRange({wordRegex: WholeWordRegex})
+      selection.setBufferRange(mergeRanges(selection.getBufferRange(), range))
+      true
+
 # SelectInsideQuotes and the next class defined (SelectInsideBrackets) are
 # almost-but-not-quite-repeated code. They are different because of the depth
 # checks in the bracket matcher.
@@ -76,7 +88,7 @@ class SelectInsideQuotes extends TextObject
         ++ start.column # skip the opening quote
         end = @findClosingQuote(start)
         if end?
-          selection.setBufferRange([start, end])
+          selection.setBufferRange(mergeRanges(selection.getBufferRange(), [start, end]))
       not selection.isEmpty()
 
 # SelectInsideBrackets and the previous class defined (SelectInsideQuotes) are
@@ -126,13 +138,13 @@ class SelectInsideBrackets extends TextObject
         ++ start.column # skip the opening quote
         end = @findClosingBracket(start)
         if end?
-          selection.setBufferRange([start, end])
+          selection.setBufferRange(mergeRanges(selection.getBufferRange(), [start, end]))
       not selection.isEmpty()
 
 class SelectAWord extends TextObject
   select: ->
     for selection in @editor.getSelections()
-      selection.selectWord()
+      selection.expandOverWord()
       loop
         endPoint = selection.getBufferRange().end
         char = @editor.getTextInRange(Range.fromPointWithDelta(endPoint, 0, 1))
@@ -140,25 +152,56 @@ class SelectAWord extends TextObject
         selection.selectRight()
       true
 
-class SelectInsideParagraph extends TextObject
-  constructor: (@editor, @inclusive) ->
+class SelectAWholeWord extends TextObject
   select: ->
     for selection in @editor.getSelections()
-      range = selection.cursor.getCurrentParagraphBufferRange()
-      if range?
-        selection.setBufferRange(range)
-        selection.selectToBeginningOfNextParagraph()
+      range = selection.cursor.getCurrentWordBufferRange({wordRegex: WholeWordRegex})
+      selection.setBufferRange(mergeRanges(selection.getBufferRange(), range))
+      loop
+        endPoint = selection.getBufferRange().end
+        char = @editor.getTextInRange(Range.fromPointWithDelta(endPoint, 0, 1))
+        break unless AllWhitespace.test(char)
+        selection.selectRight()
       true
 
-class SelectAParagraph extends TextObject
-  constructor: (@editor, @inclusive) ->
+class Paragraph extends TextObject
+
   select: ->
     for selection in @editor.getSelections()
-      range = selection.cursor.getCurrentParagraphBufferRange()
-      if range?
-        selection.setBufferRange(range)
-        selection.selectToBeginningOfNextParagraph()
-        selection.selectDown()
-      true
-
-module.exports = {TextObject, SelectInsideWord, SelectInsideQuotes, SelectInsideBrackets, SelectAWord, SelectInsideParagraph, SelectAParagraph}
+      @selectParagraph(selection)
+
+  # Return a range delimted by the start or the end of a paragraph
+  paragraphDelimitedRange: (startPoint) ->
+    inParagraph = @isParagraphLine(@editor.lineTextForBufferRow(startPoint.row))
+    upperRow = @searchLines(startPoint.row, -1, inParagraph)
+    lowerRow = @searchLines(startPoint.row, @editor.getLineCount(), inParagraph)
+    new Range([upperRow + 1, 0], [lowerRow, 0])
+
+  searchLines: (startRow, rowLimit, startedInParagraph) ->
+    for currentRow in [startRow..rowLimit]
+      line = @editor.lineTextForBufferRow(currentRow)
+      if startedInParagraph isnt @isParagraphLine(line)
+        return currentRow
+    rowLimit
+
+  isParagraphLine: (line) -> (/\S/.test(line))
+
+class SelectInsideParagraph extends Paragraph
+  selectParagraph: (selection) ->
+    oldRange = selection.getBufferRange()
+    startPoint = selection.cursor.getBufferPosition()
+    newRange = @paragraphDelimitedRange(startPoint)
+    selection.setBufferRange(mergeRanges(oldRange, newRange))
+    true
+
+class SelectAParagraph extends Paragraph
+  selectParagraph: (selection) ->
+    oldRange = selection.getBufferRange()
+    startPoint = selection.cursor.getBufferPosition()
+    newRange = @paragraphDelimitedRange(startPoint)
+    nextRange = @paragraphDelimitedRange(newRange.end)
+    selection.setBufferRange(mergeRanges(oldRange, [newRange.start, nextRange.end]))
+    true
+
+module.exports = {TextObject, SelectInsideWord, SelectInsideWholeWord, SelectInsideQuotes,
+  SelectInsideBrackets, SelectAWord, SelectAWholeWord, SelectInsideParagraph, SelectAParagraph}