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

时间:2009-09-29 15:26:56

标签: ruby winapi console terminal windows-console

我正在尝试在Ruby中编写一个shell,并且要实现制表符完成,我使用WinAPI函数getch一次从用户读取一个字符,检查制表符。

这个问题是退格键:

  1. 它将光标向后移动到提示之后(例如,使用提示符hello>,用户可以将光标退回到h。我希望它停在最后的空间。< / LI>
  2. 当用户的文本溢出到控制台的下一行时,退格键不会移回到上一行。
  3. (我知道这两种行为都是设计出来的。)

    我对这些问题的想象解决方案涉及控制光标移动;我需要知道光标的位置,并能够移动它。

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

    我已经查看了WinAPI并试图找到可以让我这样做的函数,但是所有I could find都是GetConsoleCursorInfo函数,它只返回游标的大小和可见性。

    示例将是值得赞赏的,因为我无法将Win32API类用于除原始函数之外的任何其他内容。

    感谢。

3 个答案:

答案 0 :(得分:2)

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

require 'readline'

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

您已经拥有标准的readline功能,例如退格,Alt +退格键删除单词,历史记录和制表符。有关如何根据您的需求自定义它的文档很好here


编辑:

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

虽然Ruby主页上没有记录,但看起来你也可以使用readline 5,here。具体而言,您需要binaries分发。将readline5.dll(在bin目录中)复制到您的ruby\bin目录,并将其重命名为readline.dll

另外,作为旁注,如果require 'readline'在使用irb时返回false,请不要惊慌,因为它似乎预装了它。

答案 1 :(得分:1)

嗯,它当然可以备份,并且具有合理的可移植代码,因为即使在dos框中,bash(1)也可以备份到前一行。我想它正在使用termcapncurses,它在termcap数据库中有一组适用于dos框的控制代码。

在Ruby中,我不相信有任何termcap绑定,所以你使用ncurses,而不是硬件连接到你的程序一组依赖于设备的控制代码。 (无论如何,你会想要使用termcap的ncurses。)

一旦你切换到ncurses,我相信你会找到API元素来做你需要的一切,包括备份行而不是覆盖提示。 (当然,无论使用哪个库,您都不应该备份任何未输出的内容。)

实际上,我有点像Pesto的回答。如果readline无效,或者由于其他原因需要游标寻址,请使用ncurses。

答案 2 :(得分:1)

对于Windows友好的readline实现,请尝试此ruby-based readline