读取行,直到按下haskell中的ESC按钮
在按下ESC按钮之前,我需要查看实际线路。我怎么检查读取行,直到按下haskell中的ESC按钮,haskell,line,stdin,Haskell,Line,Stdin,在按下ESC按钮之前,我需要查看实际线路。我怎么检查 lines = do line <- getLine if (== "/ESC") --this condition is wrong then ... else do ln <- lines return ... 行 做 行正确的转义方法是使用反斜杠,字符是'\ESC',因此条件是 if line == "\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)
主模块(Main),其中
导入系统.IO
main::IO()
main=do
hSetBuffering标准不缓冲
getUntilEsc“”
getUntilEsc::字符串->IO()
getUntilEsc acc=do
c返回()
“\n'->do putStrLn$”您输入了“++反向acc”
getUntilEsc“”
_->getUntilEsc(c:acc)
这就是你需要的。您必须按字符进行读取,并且需要关闭stdin的缓冲区,以便可以立即读取字符,而不仅仅是在输入换行符之后
请注意,在Windows上关闭缓冲不起作用。我不知道这个问题最近是否得到了解决。
此外,正如@Daniel Wagner所报告的,很可能是Windows命令提示符没有将ESC传递给应用程序。mmm。。。检查输入是否等于“\ECS”。但它不会检查按钮是否按下。或者我错了?它检查它得到的行是否是“\ESC”
,因此需要按下回车键或回车键。如果要在按下\ESC
时立即执行操作,则需要读取单个字符,这意味着使用getChar
而不是getLine
,并关闭stdin
的缓冲-后者在Windows上不起作用,我不知道现在是否有。我想以前有人告诉过我Windows的命令提示符没有发送escape密钥,所以这可能也是问题的一部分。你需要这样做吗?实现sentinel字符串会更容易,例如“quit”。然后您只需编写如果(line==“quit”),那么。。。否则…