54 lines
1.6 KiB
CoffeeScript
54 lines
1.6 KiB
CoffeeScript
{MotionWithInput} = require './general-motions'
|
|
{ViewModel} = require '../view-models/view-model'
|
|
{Point, Range} = require 'atom'
|
|
|
|
class Find extends MotionWithInput
|
|
constructor: (@editorView, @vimState) ->
|
|
super(@editorView, @vimState)
|
|
@viewModel = new ViewModel(@, class: 'find', singleChar: true, hidden: true)
|
|
@reversed = false
|
|
@offset = 0
|
|
|
|
match: (count) ->
|
|
currentPosition = @editorView.editor.getCursorBufferPosition()
|
|
line = @editorView.editor.lineForBufferRow(currentPosition.row)
|
|
if @reversed
|
|
index = currentPosition.column
|
|
for i in [0..count-1]
|
|
index = line.lastIndexOf(@input.characters, index-1)
|
|
if index != -1
|
|
point = new Point(currentPosition.row, index+@offset)
|
|
return {} =
|
|
point: point
|
|
range: new Range(point, currentPosition)
|
|
else
|
|
index = currentPosition.column
|
|
for i in [0..count-1]
|
|
index = line.indexOf(@input.characters, index+1)
|
|
if index != -1
|
|
point = new Point(currentPosition.row, index-@offset)
|
|
return {} =
|
|
point: point
|
|
range: new Range(currentPosition, point.translate([0,1]))
|
|
|
|
reverse: ->
|
|
@reversed = !@reversed
|
|
@
|
|
|
|
execute: (count=1) ->
|
|
if (match = @match(count))?
|
|
@editorView.editor.setCursorBufferPosition(match.point)
|
|
|
|
select: (count=1, {requireEOL}={}) ->
|
|
if (match = @match(count))?
|
|
@editorView.editor.setSelectedBufferRange(match.range)
|
|
return [true]
|
|
[false]
|
|
|
|
class Till extends Find
|
|
constructor: (@editorView, @vimState) ->
|
|
super(@editorView, @vimState)
|
|
@offset = 1
|
|
|
|
module.exports = {Find, Till}
|