代码之家  ›  专栏  ›  技术社区  ›  Lucas Jones

如何在Ruby(Windows)中获取/设置控制台光标位置

  •  1
  • Lucas Jones  · 技术社区  · 15 年前

    我正在尝试用Ruby编写一个shell,为了实现选项卡的完成,我使用的是winapi函数 getch 要从用户处一次读入一个字符,请检查制表符。

    问题在于 退格 密钥:

    1. 它将光标移回提示之外的位置(例如,使用提示 hello> ,用户可以将光标退格到 h . 我想把它停在最后一个地方。
    2. 当用户的文本溢出到控制台的下一行时,退格键不会移回上一行。

    (我知道这两种行为都是设计出来的。)

    我对这些问题的设想解决方案包括控制光标的移动;我需要知道光标在哪里,并且能够移动它。

    在Linux上,我将使用ansi转义序列,但Windows控制台不支持这些序列。

    我已经研究了winapi并试图找到可以让我这样做的函数,但是我 could find GetConsoleCursorInfo 函数,它只返回光标的大小和可见性。

    我们将不胜感激这些示例,因为我对于使用win32api类来处理除基元函数之外的任何其他函数都毫无希望。

    谢谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Pesto    15 年前

    你最好使用readline。它包含在RubyOne-Click安装程序中。基本设置是:

    require 'readline'
    
    while line = Readline.readline('hello> ', true)
      #do something with line
      break if line == 'quit'
    end
    

    您已经拥有了标准的阅读线功能,比如退格、alt+backspace来删除单词、历史记录和制表符完成。有很好的文档说明如何根据您的需要定制它 here .


    编辑:

    如果没有安装readline,则可以获取它和其他外部库。 here .你要的是 readline-4.3-2-mswin32 包裹。复制readline.dll文件(位于 bin 目录)到您的 ruby\bin 目录。这应该可以做到。

    虽然Ruby主页上没有记录,但看起来您也可以使用readline 5。 here . 具体来说,你需要 binaries 分发。复制readline5.dll(在 箱子 目录)到您的 红宝石桶 目录,并将其重命名为 readline.dll .

    另外,作为旁注,如果 require 'readline' 使用IRB时返回false,因为它似乎是预加载的。

        2
  •  1
  •   Community Michael Schmitz    7 年前

    嗯,当然可以备份,并且使用相当可移植的代码,因为bash(1)甚至可以在DOS框中备份到前一行。我想它正在使用 termcap ncurses 它在termcap数据库中有一组控制代码,可用于DOS设备。

    在Ruby中,我不相信有任何termcap绑定,所以您使用ncurses,而不是将一组与设备相关的控制代码硬连接到程序中。(不管怎样,你还是想对termcap感到内疚。)

    一旦您切换到ncurses,我相信您将找到API元素来完成所需的一切工作,包括备份行,而不是覆盖提示。(当然,无论使用的是什么库,都不应该备份任何没有输出的内容。)

    实际上,我有点喜欢 Pesto 的答案。如果使用NCISESIF readline 不起作用,或者由于其他原因需要光标寻址。

        3
  •  1
  •   cldwalker    15 年前

    对于Windows友好的readline实现,请尝试以下操作 ruby-based readline