3

在 Haskell 中编写程序,我正在努力处理 ctrl-s 和 ctrl-l 形式的按键

我正在使用以下代码:

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

如何让它识别被按下的 Ctrl 按钮?

4

2 回答 2

6

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

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

于 2013-04-08T15:00:52.950 回答
2

我目前在非 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
于 2013-04-08T15:12:08.340 回答