{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_HADDOCK show-extensions #-}
module Yi.Keymap.Vim.Ex.Commands.Registers (printRegisters, parse) where
import Control.Applicative (Alternative ((<|>)))
import Control.Monad (void)
import Data.Monoid ((<>))
import Yi.Keymap (Action (EditorA))
import Yi.Keymap.Vim.Ex.Types (ExCommand (cmdAction, cmdShow))
import Yi.Keymap.Vim.Common (EventString, RegisterName, Register (regContent), VimState (vsRegisterMap))
import Yi.Editor (EditorM, getEditorDyn, newBufferE)
import Yi.Rope (YiString)
import Yi.Types (withEditor, BufferId (MemBuffer))
import qualified Data.Attoparsec.Text as P (string, try, endOfInput)
import qualified Data.HashMap.Strict as HM (toList)
import qualified Yi.Keymap.Vim.Ex.Commands.Common as Common (parse, pureExCommand)
import qualified Yi.Rope as R (concat, toString, fromString)
printRegisters :: EditorM ()
printRegisters = do
xs <- HM.toList . vsRegisterMap <$> getEditorDyn
let xs' = visualizeConvert xs
registers = flip map xs' $ \(nameWithSep, content) -> nameWithSep <> content <> "\n"
bufDetail = "--- Register ---\n" <> R.concat registers
void $ newBufferE (MemBuffer "Register list") bufDetail
where
replaceName n | n == '\NUL' = "\\NUL | "
| otherwise = ['"', n] ++ " | "
replaceContent = let replaceContentChar c | c == '\n' = "^J"
| otherwise = [c]
in concatMap replaceContentChar
visualizeConvert :: [(RegisterName, Register)] -> [(YiString, YiString)]
visualizeConvert = map $ \(name, reg) ->
let content = R.toString . regContent $ reg
in ( R.fromString . replaceName $ name
, R.fromString . replaceContent $ content
)
parse :: EventString -> Maybe ExCommand
parse = Common.parse $ do
_ <- P.string "reg" <* ( P.try (P.string "isters")
<|> P.try (P.string "ister")
<|> P.try (P.string "iste")
<|> P.try (P.string "ist")
<|> P.try (P.string "is")
<|> P.try (P.string "i")
<|> P.string ""
)
<* P.endOfInput
return Common.pureExCommand
{ cmdShow = "registers"
, cmdAction = EditorA $ withEditor printRegisters
}