anchor.diff:      | ABlock of string * string
       | InnerBlock of string * string
       | WholeLine
  +    | LastLine
       // motions
       | Up
       | Down
  
positive.code:             | InsertMode, [ "<esc>" ] -> [ run (SwitchMode NormalMode) Nothing ]
              | NormalMode, [ Movement m ] -> [ run Move m ]
              | NormalMode, [ FindChar m; c ] -> [ run Move (m c) ]
              | NormalMode, [ Action action; Movement m ] -> [ run action m ]
              | NormalMode, [ "u" ] -> [ run Undo Nothing ]
              | NormalMode, [ "d"; "d" ] -> [ run Delete WholeLine ]
  
negative.code:         | StartOfDocument -> editor.Caret.Offset, 0
          | FirstNonWhitespace -> editor.Caret.Offset, line.Offset + editor.GetLineIndent(editor.Caret.Line).Length
          | WholeLine -> line.Offset, line.EndOffset
          | LastLine -> 
              let lastLine = editor.GetLine editor.Document.LineCount
              editor.Caret.Offset, lastLine.Offset
          | ToCharInclusiveBackwards c ->
              match findCharBackwardsOnLine editor line c with
              | Some index -> editor.Caret.Offset, index
  