     @selection.editor.clipBufferPosition(point)
 
   getInitialPoint: ({clip, wise}={}) ->
-    if @stayByMarker
-      point = @initialPointMarker.getHeadBufferPosition()
-    else
-      point = @initialPoint
-
+    point = @initialPointMarker?.getHeadBufferPosition() ? @initialPoint
     clip ?= not @getBufferRangeForCheckpoint('did-select')?.isEqual(@marker.getBufferRange())
     if clip
       if wise is 'linewise'

      @setCheckpointForSelection(selection, checkpoint)

  setCheckpointForSelection: (selection, checkpoint) ->
    unless @mutationsBySelection.has(selection)
      initialPoint = swrap(selection).getBufferPositionFor('head', from: ['property', 'selection'])
      options = {selection, initialPoint, checkpoint, @markerLayer, @stayByMarker, @vimState}
      @mutationsBySelection.set(selection, new Mutation(options))

    @mutationsBySelection.get(selection).update(checkpoint)

  migrateMutation: (oldSelection, newSelection) ->
    mutation = @mutationsBySelection.get(oldSelection)

#  e.g. Some selection is created at 'will-select' checkpoint, others at 'did-select' or 'did-select-occurrence'
class Mutation
  constructor: (options) ->
    {@selection, @initialPoint, @initialPointMarker, checkpoint, @vimState} = options
    @createdAt = checkpoint
    @bufferRangeByCheckpoint = {}
    @marker = null

  isCreatedAt: (checkpoint) ->
    @createdAt is checkpoint

  update: (checkpoint, marker) ->
    if marker?
      @marker?.destroy()
      @marker = marker
    @bufferRangeByCheckpoint[checkpoint] = @marker.getBufferRange()

  getEndBufferPosition: ->
