ESCボタンが押されるまで実際の線を引く必要があります。どうすれば確認できますか?
lines
= do
line <- getLine
if (== "/ESC") --this condition is wrong
then ...
else do
ln <- lines
return ...
誰かが私の問題を解決できますか?
エスケープする正しい方法はバックスラッシュを使用することで、文字は'\ESC'
であるため、条件は次のようになります。
if line == "\ESC"
'\ESC'
しかし、すべての端末がアプリケーションにパススルーするかどうかはわかりません。
ESCキーが押されたときにすぐに停止したい場合は、
module Main (main) where
import System.IO
main :: IO ()
main = do
hSetBuffering stdin NoBuffering
getUntilEsc ""
getUntilEsc :: String -> IO ()
getUntilEsc acc = do
c <- getChar
case c of
'\ESC' -> return ()
'\n' -> do putStrLn $ "You entered " ++ reverse acc
getUntilEsc ""
_ -> getUntilEsc (c:acc)
必要なものです。文字単位で読む必要があり、のバッファリングをオフにする必要があるstdin
ため、改行が入力された後だけでなく、文字がすぐに読み取れるようになります。
Windows では、バッファリングをオフにしても機能しないことに注意してください。これが最近修正されたかどうかはわかりません。また、@Daniel Wagner が報告したように、Windows コマンド プロンプトがアプリケーションに渡さない可能性がありESCます。