2016-11-21 48 views
1

我想從控制檯使用IO::console::getch在循環中輸入,但getch似乎不捕獲第一個換行(我需要爲輸入循環打破),而getc確實,但不能與我想要做的其他事情一起工作。不能捕獲第一個CRLF與原始IO ::控制檯

如何捕獲第一個CRLF,因此我不需要再次敲入兩次?

相關代碼:

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

你不說你在使用什麼操作系統,但通常你只能在Windows上看到CRLF。 Linux和Mac OS只使用'「\ n」'。如果你想解釋你想做什麼,這可能會有所幫助,因爲通常人們不會試圖寫入控制檯或使用'getch'讀取單個字符,所以看起來你正在爲自己做更多的工作。 –

回答

0

看源Highline的系統擴展模塊後,我想通了,我可以用WinAPI._getch在Windows和STDIN.getbyte在Unix來完成自己想做的(顯然不完整的代碼,因爲我還沒有檢查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