commandParsers :: [CommandParser]
commandParsers =
    [ CommandParser
          "Buffer.parse"
          (Buffer.parse . Ev . T.pack)
          ["buffer", "buf", "bu", "b"]
          True
          True
          bufferIdentifier

    , CommandParser
          "BufferDelete.parse"
          (BufferDelete.parse . Ev . T.pack)
          ["bdelete", "bdel", "bd"]
          True
          False
          (unwords <$> listOf bufferIdentifier)

    , CommandParser
          "Delete.parse"
          (Delete.parse . Ev . T.pack)
          ["delete", "del", "de", "d"]
          -- XXX TODO support these weird abbreviations too?
          -- :dl, :dell, :delel, :deletl, :deletel
          -- :dp, :dep, :delp, :delep, :deletp, :deletep
          True
          False
          (oneof [ pure ""
                 , addingSpace registerName
                 , addingSpace count
                 , (<>) <$> addingSpace registerName <*> addingSpace count
                 ])

    , CommandParser
          "Registers.parse"
          (Registers.parse . Ev . T.pack)
          [ "reg"
          , "regi"
          , "regis"
          , "regist"
          , "registe"
          , "register"
          , "registers"
          ]
          False
          False
          (pure "")

    , CommandParser
          "Nohl.parse"
          (Nohl.parse . Ev . T.pack)
          (drop 3 $ inits "nohlsearch")
          False
          False
          (pure "")
    ]
commandParsers :: [CommandParser]
commandParsers =
    [ CommandParser
          "Buffer.parse"
          (Buffer.parse . Ev . T.pack)
          ["buffer", "buf", "bu", "b"]
          True
          True
          bufferIdentifier

    , CommandParser
          "BufferDelete.parse"
          (BufferDelete.parse . Ev . T.pack)
          ["bdelete", "bdel", "bd"]
          True
          False
          (unwords <$> listOf bufferIdentifier)

    , CommandParser
          "Delete.parse"
          (Delete.parse . Ev . T.pack)
          ["delete", "del", "de", "d"]
          -- XXX TODO support these weird abbreviations too?
          -- :dl, :dell, :delel, :deletl, :deletel
          -- :dp, :dep, :delp, :delep, :deletp, :deletep
          True
          False
          (oneof [ pure ""
                 , addingSpace registerName
                 , addingSpace count
                 , (<>) <$> addingSpace registerName <*> addingSpace count
                 ])

    , CommandParser
          "Registers.parse"
          (Registers.parse . Ev . T.pack)
          [ "reg"
          , "regi"
          , "regis"
          , "regist"
          , "registe"
          , "register"
          , "registers"
          ]
          False
          False
          (pure "")

    , CommandParser
          "Nohl.parse"
          (Nohl.parse . Ev . T.pack)
          (drop 3 $ inits "nohlsearch")
          False
          False
          (pure "")
    ]
commandParsers =
    [ CommandParser
          "Buffer.parse"
          (Buffer.parse . Ev . T.pack)
          ["buffer", "buf", "bu", "b"]
          True
          True
          bufferIdentifier

    , CommandParser
          "BufferDelete.parse"
          (BufferDelete.parse . Ev . T.pack)
          ["bdelete", "bdel", "bd"]
          True
          False
          (unwords <$> listOf bufferIdentifier)

    , CommandParser
          "Delete.parse"
          (Delete.parse . Ev . T.pack)
          ["delete", "del", "de", "d"]
          -- XXX TODO support these weird abbreviations too?
          -- :dl, :dell, :delel, :deletl, :deletel
          -- :dp, :dep, :delp, :delep, :deletp, :deletep
          True
          False
          (oneof [ pure ""
                 , addingSpace registerName
                 , addingSpace count
                 , (<>) <$> addingSpace registerName <*> addingSpace count
                 ])

    , CommandParser
          "Registers.parse"
          (Registers.parse . Ev . T.pack)
          [ "reg"
          , "regi"
          , "regis"
          , "regist"
          , "registe"
          , "register"
          , "registers"
          ]
          False
          False
          (pure "")

    , CommandParser
          "Nohl.parse"
          (Nohl.parse . Ev . T.pack)
          (drop 3 $ inits "nohlsearch")
          False
          False
          (pure "")
    ]