我在互联网上寻找这个答案已经有一段时间了,发现其他人也在问同样的事情,即使在这里也是如此。因此,这篇文章将介绍我的案例以及对我找到的“解决方案”的回应。
我对 Ruby 很陌生,但出于学习目的,我决定创建一个 gem,here https://github.com/fschuindt/camelog。
我正在尝试为该程序实现键盘导航,这将允许用户使用快捷方式选择他想要查看的请求类型。未来还会有箭头导航等。
我的问题:我无法找到一致的方法来使用 Ruby 从用户控制台获取键盘事件。
我尝试过的解决方案:
- Highline gem:似乎不再支持此功能。不管怎样,它使用 STDIN,继续阅读。
- STDIN.getch:我需要在并行循环中运行它,因为在用户可以使用快捷方式的同时,可以创建更多数据并且程序需要显示它。好吧,我在控制台中显示格式化文本(Rails 日志)。当这个循环运行时,我的文本丢失了所有格式。
- Curses:很酷,但我需要设置位置(x,y)来每次显示我的文本?它会变得混乱。
Here https://gist.github.com/fschuindt/5567063#file-camelog-rb-L43这就是我正在努力做到的地方。
您可能会注意到,我在显示文本之前使用“stty -raw echo”(关闭原始),在显示文本之后使用“stty raw -echo”(打开原始)。这使我的文本保持格式。
但我的关键侦听器循环不起作用。我的意思是,它有时有效,但不一致。如果按两次某个键,它就不再起作用,有时它也会单独停止。
让我把一部分代码放在这里:
def run
# Two loops run in parallel using Threads.
# stream_log loops like a normal stream in the file, but it also parser the text.
# break it into requests and store in @requests_queue.
# stream_parsed_log stream inside the @requests_queue and shows it in the screen.
@requests_queue = Queue.new
@all_requests = Array.new
# It's not working yet.
Thread.new { listen_keyboard }
Thread.new { stream_log }
stream_parsed_log
end
def listen_keyboard
# not finished
loop do
char = STDIN.getch
case char
when 'q'
puts "Exiting."
exit
when 'a'
@types_to_show = ['GET', 'POST', 'PUT', 'DELETE', 'ASSET']
requests_to_show = filter_to_show(@all_requests)
command = true
when 'p'
@types_to_show = ['POST']
requests_to_show = filter_to_show(@all_requests)
command = true
end
clear_screen if command
@requests_queue += requests_to_show if command
command = false
end
end
我的道路上需要一盏灯,我该怎么办?
那是我的错误。
这只是在另一个线程中运行的代码的另一部分中的逻辑错误,因此 ruby 默认情况下不会显示错误。我使用 ruby -d 并意识到出了什么问题。这个错误扰乱了我的键盘输入。
所以现在它已经修复了,我使用 STDIN.getch 没有问题。
我只是在显示任何字符串之前关闭原始模式。一切都很好。
你可以检查here https://gist.github.com/anonymous/5581474#file-camelog-rb-L219,或在gem https://github.com/fschuindt/camelog itself.
就是这样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)