写在Haskell一个程序,我奋力处理表单CTRL-S和CTRL-L处理联合按键哈斯克尔
我使用下面的代码的按键:
main :: IO()
main = do
hSetBuffering stdin NoBuffering
x <- getChar
putStrLn ("You pressed: " ++ [x])
我怎样才能让它识别按下的Ctrl按钮?
写在Haskell一个程序,我奋力处理表单CTRL-S和CTRL-L处理联合按键哈斯克尔
我使用下面的代码的按键:
main :: IO()
main = do
hSetBuffering stdin NoBuffering
x <- getChar
putStrLn ("You pressed: " ++ [x])
我怎样才能让它识别按下的Ctrl按钮?
getChar
可让您访问字符,而不是按键。您获得的字符取决于用户的操作系统,键盘布局和输入法的选择。没有“标准”字符,它将由按键Ctrl-S或Ctrl-L生成(但是,当然,有些系统会为这些控制字符提供标准的ASCII码,其他则不会)。
如果您想要正确的按键处理,您需要一个真正的输入库 - 例如SDL或WxWidgets或GTK;其中每一个都不仅仅是一个输入库,但它们确实具有按键抽象。
我目前是一个非UNIX系统上(导致unix
的vty
的依赖,以安装失败),但下面的工作。
import Control.Exception
import Graphics.Vty.LLInput
import System.Console.Terminfo
main :: IO()
main = do
term <- setupTermFromEnv
bracket (initTermInput 0 term) (\ (_, exit) -> exit) $ \ (readEvent, _) -> do
let readKeyEvent = do
ev <- readEvent
case ev of
EvKey k ms -> return (k, ms)
_ -> readKeyEvent
readKeyEvent >>= print
这个工作,但也有我的OS X框一些奇怪的结果:CTRL-I回报'(KASCII '\ T',[])',和Ctrl-J回报'(K输入,[]) ' – amindfv 2013-04-08 16:15:57
这可能与您使用基于终端的方法相近。 Ctrl-j返回与Newline相同的值,Ctrl-i返回与bash中的Horizontal Tab相同的值。 – ScootyPuff 2013-04-08 19:18:32