在 Ruby 控制台应用程序中获取键盘事件(无需按“Enter”输入)的最佳方法是什么?

2024-05-23

我在互联网上寻找这个答案已经有一段时间了,发现其他人也在问同样的事情,即使在这里也是如此。因此,这篇文章将介绍我的案例以及对我找到的“解决方案”的回应。

我对 Ruby 很陌生,但出于学习目的,我决定创建一个 gem,here https://github.com/fschuindt/camelog。 我正在尝试为该程序实现键盘导航,这将允许用户使用快捷方式选择他想要查看的请求类型。未来还会有箭头导航等。

我的问题:我无法找到一致的方法来使用 Ruby 从用户控制台获取键盘事件。

我尝试过的解决方案:

  1. Highline gem:似乎不再支持此功能。不管怎样,它使用 STDIN,继续阅读。
  2. STDIN.getch:我需要在并行循环中运行它,因为在用户可以使用快捷方式的同时,可以创建更多数据并且程序需要显示它。好吧,我在控制台中显示格式化文本(Rails 日志)。当这个循环运行时,我的文本丢失了所有格式。
  3. 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(使用前将#替换为@)

在 Ruby 控制台应用程序中获取键盘事件(无需按“Enter”输入)的最佳方法是什么? 的相关文章

  • Rails 从视图中调用操作

    希望这里有一个简单的问题 但我似乎无法找到答案 刚刚开始使用 RoR 但之前来自 ASP MVC 我在渲染部分视图时遇到问题 其局部变量不一定与主视图的变量相关联 例如 对于一个博客 我试图渲染一个链接到存档的侧边栏 def sidebar
  • 如何访问 IRB 中所需的 Ruby 文件中定义的变量?

    文件welcome rb包含 welcome message hi there 但在 IRB 中 我无法访问刚刚创建的变量 require welcome rb puts welcome message gt undefined local
  • Rails 3.2.3 命名空间控制器被同名的全局控制器覆盖

    当全局应用程序控制器首先加载时 命名空间应用程序控制器在加载该命名空间内的页面时不会加载 应用程序控制器如下所示 class ApplicationController lt ActionController Base protect fr
  • 如何在 rake 任务中强制使用 RAILS_ENV?

    我有这个小耙子任务 namespace db do namespace test do task reset do ENV RAILS ENV test Rake Task db drop invoke Rake Task db creat
  • Ruby Net:SSH控制大师?

    我目前有一个 Ruby Rails 应用程序 需要建立大量的短 SSH 连接 使用 Ruby Net SSH 库可以正常工作 只是每次我想发出命令时应用程序都必须登录并协商密钥 这太慢了 有没有办法使用 Ruby Net SSH 启用 Co
  • Riod-iOS 错误:您没有写入权限“Gem::FilePermissionError”

    我已经下载了一个Riot iOS https github com vector im riot ios并遵循构建说明 当我跑步时 捆绑安装 回溯 最近一次调用 2 来自 usr bin bundle 23 in
  • Rails 返回 JSON 序列化属性 with_in Different_access

    我以前有 serialize params JSON 但这会返回 JSON 并将哈希键符号转换为字符串 我想使用符号引用哈希 这在使用哈希时最常见 我向它提供符号 Rails 返回字符串 为了避免这种情况 我创建了自己的 getter se
  • 强制 DataMapper 断开与 postgresql 的连接

    我有一个测试 正在 postgresql 中创建和销毁多个数据库 为了能够删除数据库 我需要告诉 DataMapper 断开连接 我似乎找不到任何有关如何执行此操作的文档 DataMapper Adapters PostgresAdapte
  • 地图、每个和收集之间有什么区别? [复制]

    这个问题在这里已经有答案了 在 Ruby 中 功能之间有什么区别吗 each map and collect each不同于map and collect but map and collect是相同的 技术上map是一个别名collect
  • Ruby:如何计算相对于另一条路径的路径?

    假设我知道我开始的绝对路径和我试图到达的绝对路径 first first path second second path 现在我想弄清楚如何构建一条相对于第一个路径 例如 answer should be first path second
  • 从 ActiveRecord 获取表名

    I used ActiveRecord Base set table name在动态创建的 ActiveRecord 类上设置我的表名称 现在我需要知道稍后如何获得该值 api 文档没有提及如何执行此操作 另外 我无法从 ActiveRec
  • Ruby 代码到 JAR

    我希望能够将 ruby 程序编译为 java JAR 程序 我研究过 JRuby 看到了几个能够 eval ruby 代码的 Java 应用程序示例 但是是否有更优雅的解决方案允许简单地用 ruby 编写所有内容 然后将其直接编译为 JAR
  • 我什么时候应该使用 file.read() 或 file.readlines() ?

    我注意到 如果我迭代打开的文件 则迭代它的速度要快得多 而无需read首先 那是 l open file r for line in l 比 l open file r for line in l read or l open file r
  • Ruby 在带有偏移量的数组中查找

    我正在寻找一种以更简洁的方式在 Ruby 中执行以下操作的方法 class Array def find index with offset offset block offset 1 find block end end offset a
  • 标记(lex?parse?)正则表达式

    使用 Ruby 我想获取一个 Regexp 对象 或表示有效正则表达式的字符串 您的选择 并将其标记化 以便我可以操作某些部分 具体来说 我想采用这样的正则表达式 字符串 regex var w parts foo bar 并创建一个替换字
  • 将对象数组中的属性映射到另一个数组的更有效的 Ruby 方法?

    我不会在这里重复我的问题 但是有没有更有效的方法来写这个 def recruits names names for r in self referrals do names lt lt r display name end return n
  • NodeJs 控制台中的 GET /bla - - ms - - 是什么意思?

    当我进入页面时 bla在我的 NodeJS 应用程序中 控制台打印出 GET bla ms 用文字来说 为了更容易谷歌搜索 dash dash ms dash dash 这是什么意思 这是输出morgan https github com
  • Java 控制台 JPanel

    你好 是否可以在 JPanel 中绘制 java 控制台返回的内容 你有教程可以遵循吗 谢谢 SW 我不记得在哪里找到这个 但我已使用我称为 TextAreaOutputStream 的类将输出流输出到 JPanel 中保存的 JTextA
  • Capybara 的 has_selector 有哪些选项?

    我在 RSpec 中遇到此错误 有没有任何文档have selector解释了选项哈希中的每个键以及它到底有什么作用 invalid keys content should be one of text visible between co
  • C# 写入文件的性能

    我的情况概述 我的任务是从文件中读取字符串 并将它们重新格式化为更有用的格式 重新格式化输入后 我必须将其写入输出文件 这是必须完成的操作的示例 文件行示例 ANO 2010 CPF 17834368168 YEARS 2010 2009

随机推荐