@@ -15,7 +15,7 @@ import Graphics.Vty.Input.Events
16import Codec.Binary.UTF8.Generic (decode)
16import Codec.Binary.UTF8.Generic (decode)
18−import Data.List(inits)
18+import Data.List (inits, isPrefixOf, isInfixOf)
19import qualified Data.Map as M( fromList, lookup )
19import qualified Data.Map as M( fromList, lookup )
20import Data.Maybe ( mapMaybe )
20import Data.Maybe ( mapMaybe )
21import qualified Data.Set as S( fromList, member )
21import qualified Data.Set as S( fromList, member )
@@ -60,6 +60,10 @@ classify :: ClassifyMap -> [Char] -> KClass
60classify table =
60classify table =
61 let standardClassifier = compile table
61 let standardClassifier = compile table
62 in \s -> case s of
62 in \s -> case s of
63+ _ | bracketedPasteStarted s ->
64+ if bracketedPasteFinished s
65+ then parseBracketedPaste s
63 c:cs | ord c >= 0xC2 -> classifyUtf8 c cs
67 c:cs | ord c >= 0xC2 -> classifyUtf8 c cs
64 _ -> standardClassifier s
68 _ -> standardClassifier s
@@ -82,3 +86,31 @@ utf8Length c
82 | c < 0xE0 = 2
86 | c < 0xE0 = 2
83 | c < 0xF0 = 3
87 | c < 0xF0 = 3
84 | otherwise = 4
88 | otherwise = 4
90+bracketedPasteStart :: String
91+bracketedPasteStart = "\ESC[200~"
93+bracketedPasteEnd :: String
94+bracketedPasteEnd = "\ESC[201~"
96+bracketedPasteStarted :: String -> Bool
97+bracketedPasteStarted = isPrefixOf bracketedPasteStart
99+bracketedPasteFinished :: String -> Bool
100+bracketedPasteFinished = isInfixOf bracketedPasteEnd
102+takeUntil :: (Eq a) => [a] -> [a] -> ([a],[a])
103+takeUntil [] _ = ([], [])
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)
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
116+ in Valid (EvPaste p) rest'