2013-04-06 1 views
4

키보드 입력을 사용하여 보드에서 움직이는 캐릭터를 제어하는 ​​어리석은 터미널 게임을 만들고 있습니다. 사용자가 키를 누르면 내 코드는 getChar을 사용하여 올바르게 응답하지만 사용자가 누른 문자도 터미널에 나타납니다. 사용자가 입력 한 내용을 표시하지 않고 터미널 앱에서 키보드 입력을받는 방법이 있습니까?터미널에 나타나는 입력 문자 방지하기

편집 : 저는 Mac에 있지만 모든 플랫폼에서 알아두면 좋을 것입니다.

+0

있습니까? – AndrewC

+2

Windows에서 [이 문제를 해결하는 문자 버퍼링 버그] (http://stackoverflow.com/questions/2983974/haskell-read-input-character-from-console-immediately-not-after-newline/13370293#13370293) 'Char's의 침묵하는 얻기를 위해. – AndrewC

답변

8

기본적으로이 목표에 도달하기는 위해해야 ​​할 두 가지이다 : 당신은 당신의 프로그램이 한 번에 누른 키를 얻을 수 있도록 터미널에서 버퍼링을 해제해야

  1. 을 (그리고 ENTER로 확인하지 않아도됩니다.)

    hSetBuffering stdin NoBuffering 
    
  2. 그런 다음 문자가 터미널에 에코 백되지 않도록해야합니다. 당신의 프로그램이 터미널의 추가 사용을 허용하기 위해 이전 설정을 복원하는 종료 직전

hSetEcho stdin False 

은주의하시기 바랍니다.

모든 것을 함께 퍼팅 코드는 다음과 같이 표시됩니다 : 당신은 윈도우 나 유닉스/리눅스/OS의 X에

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) 
+0

정말 고마워. 고마워! –

+1

AndrewC는 이미 Windows에서 GHC와 작동하지 않을 수도 있음을 지적했습니다. – Jakub