 
     jim.setMode @switchToMode
 
+  # Select the amount of text that the motion moves over and operate
+  # on that selection
   exec: (jim) ->
     @startingPosition = jim.adaptor.position()
     jim.adaptor.setSelectionAnchor()

    @visualExec jim


map 'c', class Change extends Operation
  visualExec: (jim) ->
    super

    if @repeatableInsert
      jim.adaptor.insert @repeatableInsert.string
      jim.setMode 'normal'
    else
      jim.afterInsertSwitch = true

  operate: (jim) ->

    jim.deleteSelection @motion?.exclusive, @linewise
  switchToMode: 'insert'

# Delete the selection or the text that `@motion` moves over
map 'd', class Delete extends Operation
  operate: (jim) ->
    jim.deleteSelection @motion?.exclusive, @linewise
    new MoveToFirstNonBlank().exec jim if @linewise

# Yank the selection or the text that `@motion` moves over into a register
map 'y', class Yank extends Operation
  operate: (jim) ->
    jim.yankSelection @motion?.exclusive, @linewise
    jim.adaptor.moveTo @startingPosition... if @startingPosition

# Indent the selection or the text that `@motion` moves over
map '>', class Indent extends Operation
  operate: (jim) ->
    [minRow, maxRow] = jim.adaptor.selectionRowRange()
    jim.adaptor.indentSelection()
    new GoToLine(minRow + 1).exec jim

# Outdent the selection or the text that `@motion` moves over
map '<', class Outdent extends Operation
  operate: (jim) ->
    [minRow, maxRow] = jim.adaptor.selectionRowRange()
