2012-06-11 2 views
1

Мне нужны реальные строки до нажатия кнопки ESC. Как я могу проверить это?прочитайте строку до тех пор, пока кнопка ESC не будет нажата в haskell

lines 
    = do 
     line <- getLine 
     if (== "/ESC") --this condition is wrong 
     then ... 
     else do 
      ln <- lines 
      return ... 

Может ли кто-нибудь исправить мою проблему?

+0

Вам нужно * сделать так? Было бы проще реализовать целую цепочку, например «quit». Затем вы просто пишете 'if (line ==" quit "), затем ... else ...' –

ответ

3

Правильный способ избежать это с обратной косой черты, характер '\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 не работает. Я не знаю, было ли это исправлено в последнее время. Кроме того, как сообщал @ Даниэль Вагнер, вполне возможно, что командная строка Windows не передает приложение ESC.

+0

mmm ... он проверяет, соответствует ли значение «\ ECS». Но он не проверяет, нажата ли кнопка. Или я ошибаюсь? –

+0

Он проверяет, была ли полученная строка '' \ ESC "', поэтому ему нужна клавиша возврата или ввода. Если вы хотите действовать немедленно, когда нажата кнопка '\ ESC', вам нужно прочитать одиночные символы, то есть использовать' getChar' вместо 'getLine' и отключить буферизацию для' stdin' - последний использовался, чтобы не работать в Windows, Я не знаю, теперь ли это делает. –

+0

Я думаю, что в прошлом люди говорили мне, что командная строка Windows не передает ключ эвакуации, так что это может быть частью проблемы. –

Смежные вопросы