@@ -15,7 +15,7 @@ import Graphics.Vty.Input.Events
1515
1616import Codec.Binary.UTF8.Generic (decode)
1717
18−import Data.List(inits)
18+import Data.List (inits, isPrefixOf, isInfixOf)
1919import qualified Data.Map as M( fromList, lookup )
2020import Data.Maybe ( mapMaybe )
2121import qualified Data.Set as S( fromList, member )
@@ -60,6 +60,10 @@ classify :: ClassifyMap -> [Char] -> KClass
6060classify table =
6161 let standardClassifier = compile table
6262 in \s -> case s of
63+ _ | bracketedPasteStarted s ->
64+ if bracketedPasteFinished s
65+ then parseBracketedPaste s
66+ else Prefix
6367 c:cs | ord c >= 0xC2 -> classifyUtf8 c cs
6468 _ -> standardClassifier s
6569
@@ -82,3 +86,31 @@ utf8Length c
8286 | c < 0xE0 = 2
8387 | c < 0xF0 = 3
8488 | otherwise = 4
89+
90+bracketedPasteStart :: String
91+bracketedPasteStart = "\ESC[200~"
92+
93+bracketedPasteEnd :: String
94+bracketedPasteEnd = "\ESC[201~"
95+
96+bracketedPasteStarted :: String -> Bool
97+bracketedPasteStarted = isPrefixOf bracketedPasteStart
98+
99+bracketedPasteFinished :: String -> Bool
100+bracketedPasteFinished = isInfixOf bracketedPasteEnd
101+
102+takeUntil :: (Eq a) => [a] -> [a] -> ([a],[a])
103+takeUntil [] _ = ([], [])
104+takeUntil cs sub
105+ | length cs < length sub = (cs, [])
106+ | take (length sub) cs == sub = ([], drop (length sub) cs)
107+ | otherwise = let (pre, suf) = takeUntil (tail cs) sub
108+ in (head cs:pre, suf)
109+
110+parseBracketedPaste :: String -> KClass
111+parseBracketedPaste s =
112+ let (p, rest) = takeUntil (drop (length bracketedPasteStart) s) bracketedPasteEnd
113+ rest' = if bracketedPasteEnd `isPrefixOf` rest
114+ then drop (length bracketedPasteEnd) rest
115+ else rest
116+ in Valid (EvPaste p) rest'