Skip to content

Commit

Permalink
Support text vim options in addition to boolean ones.
Browse files Browse the repository at this point in the history
  • Loading branch information
ethercrow committed Dec 6, 2014
1 parent 1ac76a7 commit 7f6d30c
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 19 deletions.
48 changes: 35 additions & 13 deletions src/library/Yi/Keymap/Vim/Ex/Commands/Common.hs
Expand Up @@ -16,8 +16,10 @@ module Yi.Keymap.Vim.Ex.Commands.Common
, parseWithBang
, parseWithBangAndCount
, parseRange
, OptionAction(..)
, parseOption
, BoolOptionAction(..)
, TextOptionAction(..)
, parseBoolOption
, parseTextOption
, filenameComplete
, forAllBuffers
, pureExCommand
Expand Down Expand Up @@ -50,7 +52,6 @@ parse :: P.GenParser Char () ExCommand -> EventString -> Maybe ExCommand
parse parser (Ev s) =
either (const Nothing) Just (P.parse parser "" $ T.unpack s)


parseWithBangAndCount :: P.GenParser Char () a
-- ^ The command name parser.
-> (a -> Bool
Expand Down Expand Up @@ -94,29 +95,50 @@ parseCount :: P.GenParser Char () (Maybe Int)
parseCount = do
readMaybe <$> P.many P.digit

data OptionAction = Set !Bool | Invert | Ask
data BoolOptionAction = BoolOptionSet !Bool | BoolOptionInvert | BoolOptionAsk

parseOption :: String -> (OptionAction -> Action) -> EventString -> Maybe ExCommand
parseOption name action = parse $ do
parseBoolOption :: T.Text -> (BoolOptionAction -> Action) -> EventString
-> Maybe ExCommand
parseBoolOption name action = parse $ do
void $ P.string "set "
nos <- P.many (P.string "no")
invs <- P.many (P.string "inv")
void $ P.string name
void $ P.string (T.unpack name)
bangs <- P.many (P.string "!")
qs <- P.many (P.string "?")
return $ pureExCommand {
cmdShow = T.concat [ "set "
, T.pack $ concat nos
, T.pack name
, name
, T.pack $ concat bangs
, T.pack $ concat qs ]
, cmdAction = action $
case fmap (not . null) [qs, bangs, invs, nos] of
[True, _, _, _] -> Ask
[_, True, _, _] -> Invert
[_, _, True, _] -> Invert
[_, _, _, True] -> Set False
_ -> Set True
[True, _, _, _] -> BoolOptionAsk
[_, True, _, _] -> BoolOptionInvert
[_, _, True, _] -> BoolOptionInvert
[_, _, _, True] -> BoolOptionSet False
_ -> BoolOptionSet True
}

data TextOptionAction = TextOptionSet !T.Text | TextOptionAsk

parseTextOption :: T.Text -> (TextOptionAction -> Action) -> EventString
-> Maybe ExCommand
parseTextOption name action = parse $ do
void $ P.string "set "
void $ P.string (T.unpack name)
maybeNewValue <- P.optionMaybe $ do
void $ P.many1 P.space
void $ P.char '='
void $ P.many1 P.space
T.pack <$> P.many P.anyChar
return $ pureExCommand
{ cmdShow = T.concat [ "set "
, name
, maybe "" (" = " <>) maybeNewValue
]
, cmdAction = action $ maybe TextOptionAsk TextOptionSet maybeNewValue
}

removePwd :: T.Text -> YiM T.Text
Expand Down
10 changes: 5 additions & 5 deletions src/library/Yi/Keymap/Vim/Ex/Commands/Paste.hs
Expand Up @@ -23,14 +23,14 @@ import Yi.Keymap.Vim.StateUtils
import Yi.String (showT)

parse :: EventString -> Maybe ExCommand
parse = parseOption "paste" action
parse = parseBoolOption "paste" action

action :: OptionAction -> Action
action Ask = EditorA $ do
action :: BoolOptionAction -> Action
action BoolOptionAsk = EditorA $ do
value <- vsPaste <$> getEditorDyn
printMsg $ "paste = " <> showT value
action (Set b) = modPaste $ const b
action Invert = modPaste not
action (BoolOptionSet b) = modPaste $ const b
action BoolOptionInvert = modPaste not

modPaste :: (Bool -> Bool) -> Action
modPaste f = EditorA . modifyStateE $ \s -> s { vsPaste = f (vsPaste s) }
2 changes: 1 addition & 1 deletion yi.cabal
Expand Up @@ -290,7 +290,7 @@ library
yi-rope >= 0.6.0.0 && < 0.7,
exceptions

ghc-options: -Wall -fno-warn-orphans
ghc-options: -Wall -fno-warn-orphans -ferror-spans
ghc-prof-options: -prof -auto-all -rtsopts

if flag(profiling)
Expand Down

0 comments on commit 7f6d30c

Please sign in to comment.