2013-04-08 83 views
2

写在Haskell一个程序,我奋力处理表单CTRL-S和CTRL-L处理联合按键哈斯克尔

我使用下面的代码的按键:

main :: IO() 
main = do 
    hSetBuffering stdin NoBuffering 
    x <- getChar 
    putStrLn ("You pressed: " ++ [x]) 

我怎样才能让它识别按下的Ctrl按钮?

回答

6

getChar可让您访问字符,而不是按键。您获得的字符取决于用户的操作系统,键盘布局和输入法的选择。没有“标准”字符,它将由按键Ctrl-S或Ctrl-L生成(但是,当然,有些系统会为这些控制字符提供标准的ASCII码,其他则不会)。

如果您想要正确的按键处理,您需要一个真正的输入库 - 例如SDL或WxWidgets或GTK;其中每一个都不仅仅是一个输入库,但它们确实具有按键抽象。

2

我目前是一个非UNIX系统上(导致unixvty的依赖,以安装失败),但下面的工作。

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 
+1

这个工作,但也有我的OS X框一些奇怪的结果:CTRL-I回报'(KASCII '\ T',[])',和Ctrl-J回报'(K输入,[]) ' – amindfv 2013-04-08 16:15:57

+0

这可能与您使用基于终端的方法相近。 Ctrl-j返回与Newline相同的值,Ctrl-i返回与bash中的Horizo​​ntal Tab相同的值。 – ScootyPuff 2013-04-08 19:18:32