41 lines
1.6 KiB
CoffeeScript
41 lines
1.6 KiB
CoffeeScript
{MotionWithInput} = require './general-motions'
|
|
{ViewModel} = require '../view-models/view-model'
|
|
{Point, Range} = require 'atom'
|
|
|
|
module.exports =
|
|
class MoveToMark extends MotionWithInput
|
|
constructor: (@editorView, @vimState, @linewise=true) ->
|
|
super(@editorView, @vimState)
|
|
@viewModel = new ViewModel(@, class: 'move-to-mark', singleChar: true, hidden: true)
|
|
|
|
isLinewise: -> @linewise
|
|
|
|
execute: ->
|
|
markPosition = @vimState.getMark(@input.characters)
|
|
|
|
if @input.characters == '`' # double '`' pressed
|
|
markPosition ?= [0, 0] # if markPosition not set, go to the beginning of the file
|
|
@vimState.setMark('`', @editorView.editor.getCursorBufferPosition())
|
|
|
|
@editor.setCursorBufferPosition(markPosition) if markPosition?
|
|
if @linewise
|
|
@editorView.trigger 'vim-mode:move-to-first-character-of-line'
|
|
|
|
select: (count=1, {requireEOL}={}) ->
|
|
markPosition = @vimState.getMark(@input.characters)
|
|
return [false] unless markPosition?
|
|
currentPosition = @editor.getCursorBufferPosition()
|
|
selectionRange = null
|
|
if currentPosition.isGreaterThan(markPosition)
|
|
if @linewise
|
|
currentPosition = @editor.clipBufferPosition([currentPosition.row, Infinity])
|
|
markPosition = new Point(markPosition.row, 0)
|
|
selectionRange = new Range(markPosition, currentPosition)
|
|
else
|
|
if @linewise
|
|
markPosition = @editor.clipBufferPosition([markPosition.row, Infinity])
|
|
currentPosition = new Point(currentPosition.row, 0)
|
|
selectionRange = new Range(currentPosition, markPosition)
|
|
@editor.setSelectedBufferRange(selectionRange, requireEOL: requireEOL)
|
|
[true]
|