防止输入字符出现在终端中

时间:2013-04-06 09:04:56

标签: haskell terminal

我正在做一个愚蠢的终端游戏,它使用键盘输入来控制在棋盘上移动的角色。当用户按下某个键时,我的代码使用getChar正确响应,但用户按下的字符也会出现在终端中。有没有办法在终端应用程序中接收键盘输入,而不显示用户输入的内容?

编辑:我在Mac上,但在所有平台上都会很高兴。

1 个答案:

答案 0 :(得分:10)

基本上,为了实现目标,您需要做两件事:

  1. 您必须禁用终端中的任何缓冲,以便您的程序立即获得按下的键(并且您不必使用ENTER确认)。

    hSetBuffering stdin NoBuffering
    
  2. 然后你必须确保角色不会回显到终端。

    hSetEcho stdin False
    
  3. 请注意,在程序退出之前,它必须恢复以前的设置,以便进一步使用终端。

    将所有内容放在一起代码如下:

    import System.IO
    import Control.Exception (bracket)
    
    withHiddenTerminalInput :: IO a -> IO a
    withHiddenTerminalInput io = bracket
       (do prevBuff <- hGetBuffering stdin
           prevEcho <- hGetEcho stdin
    
           hSetBuffering stdin NoBuffering
           hSetEcho stdin False
    
           return (prevBuff, prevEcho)
       )
    
       (\(prevBuff, prevEcho) -> do
           hSetBuffering stdin prevBuff
           hSetEcho stdin prevEcho
       )
    
       (const io)