2016-11-21 5 views
1

IO::console::getchをループで使用してコンソールからの入力を取得しようとしていますが、getchは最初の改行をキャプチャしていないようですループを破る)、getcはそうしていますが、残りの部分ではうまくいきません。raw IO :: consoleで最初のCRLFをキャプチャできない

最初のCRLFをキャプチャするにはどうすればよいですか?2回入力する必要はありません。

関連するコード:

require 'io/console' 

buffer,str=IO::console(),"" 
loop do 
    buffer.write "\r\033[32m"+str+"\033[0m" 
    chr=buffer.getch 

    break if chr=="\r" 
    str+=chr 
end 
print "\n"+str 
+0

あなたはどのOSを使用しているのかは言いませんが、通常はWindows上でのみCRLFが表示されます。 LinuxとMac OSは '" \ n ""のみを使用します。通常、人々がコンソールに書き込もうとしていないか、 'getch'を使って単一の文字を読み込もうとしていないので、あなたが何をしようとしているのかを説明すると役に立ちます。 –

答えて

0

Highlineのシステム拡張モジュールのソースを見た後、私は私が明らかに(私が欲しかったものではない達成するためにUnix上でWindows上WinAPI._getchSTDIN.getbyteを使用できることを考え出しました私がSIGINTなどのようなものはまだチェックしていないので、完全なコードです)。

require 'highline/system_extensions' 
include HighLine::SystemExtensions 

# assign getchar as a lambda based on OS 
if (/mingw|win|emx/=~RUBY_PLATFORM)!=nil 
    getchar=lambda{WinAPI._getch} # Windows 
else 
    getchar=lambda{STDIN.getbyte} # Unix 
end 

str="" # empty string to start 
loop do 
    # write the string to STDOUT in green as a test 
    STDOUT.write "\r\033[32m"+str+"\033[0m" 
    # call the lambda, convert to character 
    chr=getchar[].chr 

    return str if chr=="\r" 
    str+=chr 
end 
関連する問題