anchor.diff:          | ["b"] -> Some WordBackwards
           | ["B"] -> Some WORDBackwards
           | ["e"] -> Some ForwardToEndOfWord
  -
           | ["E"] -> Some ForwardToEndOfWORD
           | ["g"; "e"] -> Some BackwardToEndOfWord
           | ["g"; "E"] -> Some BackwardToEndOfWORD
  
positive.code:             | NotInsertMode, [ "q" ] when state.macro.IsNone -> wait
              | NotInsertMode, [ "q"; c ] -> [ run (MacroStart (char c)) Nothing ]
              | NotInsertMode, [ "q" ] -> [ run MacroEnd Nothing ]
              | NotInsertMode, [ "@" ] -> wait
              | NotInsertMode, [ "@"; c ] -> [ run (ReplayMacro (char c)) Nothing ]
              | NotInsertMode, [ "g" ] -> wait
              | NotInsertMode, [ "m" ] -> wait
              | NotInsertMode, [ "`" ] -> wait
              | NotInsertMode, [ "'" ] -> wait
              | NotInsertMode, [ "g"; "g" ] ->
                  let lineNumber = match numericArgument with Some n -> n | None -> 1
                  [ runOnce Move (Jump (StartOfLineNumber lineNumber)) ]
  
negative.code:                 | Some chars -> [ switchMode VisualMode; getCommand (chars-1 |> Some) Move (Right StopAtEndOfLine) ]
                  | None -> [ switchMode VisualMode ]
              | NormalMode, [ "d"; "G" ] -> [ runOnce DeleteWholeLines (Jump LastLine)]
              | NotInsertMode, [ (Action _) ; UnfinishedMovement ] -> wait
              | NotInsertMode, [ UnfinishedMovement ] -> wait
              | NormalMode, [ "d"; "g"; "g" ] -> [ runOnce DeleteWholeLines (Jump StartOfDocument)]
              | ReplaceMode, [ c ] -> [ run (ReplaceChar c) Nothing; run Move (Right IncludeDelimiter) ]
              | NotInsertMode, Movement m -> [ run Move m ]
              | NotInsertMode, [ FindChar m; c ] -> [ run Move (m c) ]
  