我正在尝试在Ruby中编写一个shell,并且要实现制表符完成,我使用WinAPI函数getch
一次从用户读取一个字符,检查制表符。
这个问题是退格键:
hello>
,用户可以将光标退回到h
。我希望它停在最后的空间。< / LI>
(我知道这两种行为都是设计出来的。)
我对这些问题的想象解决方案涉及控制光标移动;我需要知道光标的位置,并能够移动它。
在Linux上,我会使用ANSI转义序列,但Windows控制台不支持这些转义序列。
我已经查看了WinAPI并试图找到可以让我这样做的函数,但是所有I could find都是GetConsoleCursorInfo
函数,它只返回游标的大小和可见性。
示例将是值得赞赏的,因为我无法将Win32API类用于除原始函数之外的任何其他内容。
感谢。
答案 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)也可以备份到前一行。我想它正在使用termcap
或ncurses
,它在termcap数据库中有一组适用于dos框的控制代码。
在Ruby中,我不相信有任何termcap绑定,所以你使用ncurses,而不是硬件连接到你的程序一组依赖于设备的控制代码。 (无论如何,你会想要使用termcap的ncurses。)
一旦你切换到ncurses,我相信你会找到API元素来做你需要的一切,包括备份行而不是覆盖提示。 (当然,无论使用哪个库,您都不应该备份任何未输出的内容。)
实际上,我有点像Pesto的回答。如果readline
无效,或者由于其他原因需要游标寻址,请使用ncurses。
答案 2 :(得分:1)
对于Windows友好的readline实现,请尝试此ruby-based readline