私はキーボード入力を使用してボード上を移動するキャラクターを制御するばかげた端末ゲームを作成しています。ユーザーがキーを押すと、私のコードは を使用して正しく応答しますがgetChar
、ユーザーが押した文字も端末に表示されます。ユーザーが入力したものを表示せずに、端末アプリでキーボード入力を受け取る方法はありますか?
編集: 私は Mac を使用していますが、すべてのプラットフォームについて知っておくとよいでしょう。
基本的に、目標を達成するために必要なことが 2 つあります。
プログラムが押されたキーをすぐに取得できるように、ターミナルでのバッファリングを無効にする必要があります (ENTER で確認する必要はありません)。
hSetBuffering stdin NoBuffering
次に、文字が端末にエコーバックされないようにする必要があります。
hSetEcho stdin False
プログラムを終了する直前に、端末をさらに使用できるようにするために、以前の設定を復元する必要があることに注意してください。
すべてをまとめると、コードは次のようになります。
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)