on master help sign in
refactor some constants out of ansi_classify_table for readability and testing
fad66a4Corey O'Connor
src/Graphics/Vty/Input/Data.hs+83−50
@@ -46,62 +46,95 @@ caps_table =
46 , ("kRIT", EvKey KRight [MShift])
46 , ("kRIT", EvKey KRight [MShift])
47 ]
47 ]
48
48
49+nav_keys_0 :: [([Char], (Key, [Modifier]))]
50+nav_keys_0 =
51+ [ k "G" KNP5
52+ , k "P" KPause
53+ , k "A" KUp
54+ , k "B" KDown
55+ , k "C" KRight
56+ , k "D" KLeft
57+ , k "H" KHome
58+ , k "F" KEnd
59+ , k "E" KBegin
60+ ]
61+ where k c s = ("\ESC["++c,(s,[]))
49
62
50−-- | classify table for ANSI terminals
63+-- Support for arrows and KHome/KEnd
51−ansi_classify_table :: [[([Char], (Key, [Modifier]))]]
64+nav_keys_1 :: [([Char], (Key, [Modifier]))]
52−ansi_classify_table =
65+nav_keys_1 =
53− [ let k c s = ("\ESC["++c,(s,[])) in [ k "G" KNP5
54− , k "P" KPause
55− , k "A" KUp
56− , k "B" KDown
57− , k "C" KRight
58− , k "D" KLeft
59− , k "H" KHome
60− , k "F" KEnd
61− , k "E" KBegin
62− ],
63−
64− -- Support for arrows and KHome/KEnd
65 [("\ESC[" ++ charCnt ++ show mc++c,(s,m))
66 [("\ESC[" ++ charCnt ++ show mc++c,(s,m))
66 | charCnt <- ["1;", ""], -- we can have a count or not
67 | charCnt <- ["1;", ""], -- we can have a count or not
67 (m,mc) <- [([MShift],2::Int), ([MCtrl],5), ([MMeta],3),
68 (m,mc) <- [([MShift],2::Int), ([MCtrl],5), ([MMeta],3),
68 ([MShift, MCtrl],6), ([MShift, MMeta],4)], -- modifiers and their codes
69 ([MShift, MCtrl],6), ([MShift, MMeta],4)], -- modifiers and their codes
69 (c,s) <- [("A", KUp), ("B", KDown), ("C", KRight), ("D", KLeft), ("H", KHome), ("F", KEnd)] -- directions and their codes
70 (c,s) <- [("A", KUp), ("B", KDown), ("C", KRight), ("D", KLeft), ("H", KHome), ("F", KEnd)] -- directions and their codes
70− ],
71+ ]
71−
72+
73+nav_keys_2 :: [([Char], (Key, [Modifier]))]
74+nav_keys_2 =
72− let k n s = ("\ESC["++show n++"~",(s,[]))
75+ let k n s = ("\ESC["++show n++"~",(s,[]))
73− in zipWith k [2::Int,3,5,6,1,4]
76+ in zipWith k [2::Int,3,5,6,1,4]
74− [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],
77+ [KIns,KDel,KPageUp,KPageDown,KHome,KEnd]
75−
78+
79+nav_keys_3 :: [([Char], (Key, [Modifier]))]
80+nav_keys_3 =
76− let k n s = ("\ESC["++show n++";5~",(s,[MCtrl]))
81+ let k n s = ("\ESC["++show n++";5~",(s,[MCtrl]))
77− in zipWith k [2::Int,3,5,6,1,4]
82+ in zipWith k [2::Int,3,5,6,1,4]
78− [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],
83+ [KIns,KDel,KPageUp,KPageDown,KHome,KEnd]
79−
84+
80− -- Support for simple characters.
85+-- Support for simple characters.
86+simple_chars :: [([Char], (Key, [Modifier]))]
81− [ (x:[],(KASCII x,[])) | x <- map toEnum [0..255] ],
87+simple_chars = [ (x:[],(KASCII x,[])) | x <- map toEnum [0..255] ]
82−
88+
83− -- Support for function keys (should use terminfo)
89+-- Support for function keys (should use terminfo)
90+function_keys_0 :: [([Char], (Key, [Modifier]))]
84− [ ("\ESC[["++[toEnum(64+i)],(KFun i,[])) | i <- [1..5] ],
91+function_keys_0 = [ ("\ESC[["++[toEnum(64+i)],(KFun i,[])) | i <- [1..5] ]
92+
93+function_keys_1 :: [([Char], (Key, [Modifier]))]
94+function_keys_1 =
85− let f ff nrs m = [ ("\ESC["++show n++"~",(KFun (n-(nrs!!0)+ff), m)) | n <- nrs ] in
95+ let f ff nrs m = [ ("\ESC["++show n++"~",(KFun (n-(nrs!!0)+ff), m)) | n <- nrs ] in
86− concat [ f 6 [17..21] [], f 11 [23,24] [], f 1 [25,26] [MShift], f 3 [28,29] [MShift], f 5 [31..34] [MShift] ],
96+ concat [ f 6 [17..21] [], f 11 [23,24] [], f 1 [25,26] [MShift], f 3 [28,29] [MShift], f 5 [31..34] [MShift] ]
97+
98+function_keys_2 :: [([Char], (Key, [Modifier]))]
87− [ ('\ESC':[x],(KASCII x,[MMeta])) | x <- '\ESC':'\t':[' ' .. '\DEL'] ],
99+function_keys_2 = [ ('\ESC':[x],(KASCII x,[MMeta])) | x <- '\ESC':'\t':[' ' .. '\DEL'] ]
88−
100+
89− -- Ctrl+Char
101+-- Ctrl+Char
102+ctrl_char_keys :: [([Char], (Key, [Modifier]))]
103+ctrl_char_keys =
90− [ ([toEnum x],(KASCII y,[MCtrl]))
104+ [ ([toEnum x],(KASCII y,[MCtrl]))
91− | (x,y) <- zip ([0..31]) ('@':['a'..'z']++['['..'_']),
105+ | (x,y) <- zip ([0..31]) ('@':['a'..'z']++['['..'_']),
92− y /= 'i' -- Resolve issue #3 where CTRL-i hides TAB.
106+ y /= 'i' -- Resolve issue #3 where CTRL-i hides TAB.
93− ],
107+ ]
94−
95− -- Ctrl+Meta+Char
96− [ ('\ESC':[toEnum x],(KASCII y,[MMeta,MCtrl])) | (x,y) <- zip [0..31] ('@':['a'..'z']++['['..'_']) ],
97
108
109+-- Ctrl+Meta+Char
110+ctrl_meta_keys :: [([Char], (Key, [Modifier]))]
111+ctrl_meta_keys =
112+ [ ('\ESC':[toEnum x],(KASCII y,[MMeta,MCtrl])) | (x,y) <- zip [0..31] ('@':['a'..'z']++['['..'_']) ]
113+
98− -- Special support
114+-- Special support
115+special_support_keys :: [([Char], (Key, [Modifier]))]
116+special_support_keys =
99− [ -- special support for ESC
117+ [ -- special support for ESC
100− ("\ESC",(KEsc,[])) , ("\ESC\ESC",(KEsc,[MMeta])),
118+ ("\ESC",(KEsc,[])) , ("\ESC\ESC",(KEsc,[MMeta]))
119+ -- Special support for backspace
120+ , ("\DEL",(KBS,[])), ("\ESC\DEL",(KBS,[MMeta]))
121+ -- Special support for Enter
122+ , ("\ESC\^J",(KEnter,[MMeta])), ("\^J",(KEnter,[]))
123+ ]
101
124
102− -- Special support for backspace
125+-- | classify table for ANSI terminals
103− ("\DEL",(KBS,[])), ("\ESC\DEL",(KBS,[MMeta])),
126+ansi_classify_table :: [[([Char], (Key, [Modifier]))]]
127+ansi_classify_table =
128+ [ nav_keys_0
129+ , nav_keys_1
130+ , nav_keys_2
131+ , nav_keys_3
132+ , simple_chars
133+ , function_keys_0
134+ , function_keys_1
135+ , function_keys_2
136+ , ctrl_char_keys
137+ , ctrl_meta_keys
138+ , special_support_keys
139+ ]
104
140
105− -- Special support for Enter
106− ("\ESC\^J",(KEnter,[MMeta])), ("\^J",(KEnter,[])) ]
107− ]