aboutsummaryrefslogtreecommitdiff
path: root/atom/packages/vim-mode/lib/operators/increase-operators.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'atom/packages/vim-mode/lib/operators/increase-operators.coffee')
-rw-r--r--atom/packages/vim-mode/lib/operators/increase-operators.coffee57
1 files changed, 57 insertions, 0 deletions
diff --git a/atom/packages/vim-mode/lib/operators/increase-operators.coffee b/atom/packages/vim-mode/lib/operators/increase-operators.coffee
new file mode 100644
index 0000000..e62f781
--- /dev/null
+++ b/atom/packages/vim-mode/lib/operators/increase-operators.coffee
@@ -0,0 +1,57 @@
+{Operator} = require './general-operators'
+{Range} = require 'atom'
+settings = require '../settings'
+
+#
+# It increases or decreases the next number on the line
+#
+class Increase extends Operator
+ step: 1
+
+ constructor: ->
+ super
+ @complete = true
+ @numberRegex = new RegExp(settings.numberRegex())
+
+ execute: (count=1) ->
+ @editor.transact =>
+ increased = false
+ for cursor in @editor.getCursors()
+ if @increaseNumber(count, cursor) then increased = true
+ atom.beep() unless increased
+
+ increaseNumber: (count, cursor) ->
+ # find position of current number, adapted from from SearchCurrentWord
+ cursorPosition = cursor.getBufferPosition()
+ numEnd = cursor.getEndOfCurrentWordBufferPosition(wordRegex: @numberRegex, allowNext: false)
+
+ if numEnd.column is cursorPosition.column
+ # either we don't have a current number, or it ends on cursor, i.e. precedes it, so look for the next one
+ numEnd = cursor.getEndOfCurrentWordBufferPosition(wordRegex: @numberRegex, allowNext: true)
+ return if numEnd.row isnt cursorPosition.row # don't look beyond the current line
+ return if numEnd.column is cursorPosition.column # no number after cursor
+
+ cursor.setBufferPosition numEnd
+ numStart = cursor.getBeginningOfCurrentWordBufferPosition(wordRegex: @numberRegex, allowPrevious: false)
+
+ range = new Range(numStart, numEnd)
+
+ # parse number, increase/decrease
+ number = parseInt(@editor.getTextInBufferRange(range), 10)
+ if isNaN(number)
+ cursor.setBufferPosition(cursorPosition)
+ return
+
+ number += @step*count
+
+ # replace current number with new
+ newValue = String(number)
+ @editor.setTextInBufferRange(range, newValue, normalizeLineEndings: false)
+
+ cursor.setBufferPosition(row: numStart.row, column: numStart.column-1+newValue.length)
+ return true
+
+class Decrease extends Increase
+ step: -1
+
+module.exports = {Increase, Decrease}