1

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

这个问题是退格键:

  1. 它将光标移到比提示更远的位置(例如,使用 prompt hello>,用户可以将光标退格到h. 我希望它停在最后一个空格。
  2. 当用户的文本溢出到控制台的下一行时,退格键不会向上移动到上一行。

(我知道这两种行为都是设计使然。)

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

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

我查看了 WinAPI 并试图找到可以让我这样做的函数,但我能找到的只是GetConsoleCursorInfo函数,它只返回光标的大小和可见性。

示例将不胜感激,因为我无法将 Win32API 类用于原始函数以外的任何东西。

谢谢。

4

3 回答 3

2

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

require 'readline'

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

您已经拥有标准的 readline 功能,例如退格、Alt+退格删除单词、历史记录和制表符补全。这里有很好的文档说明如何根据您的需要对其进行自定义。


编辑:

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

尽管 Ruby 主页上没有记录,但看起来您也可以使用 readline 5,可在此处获得。具体来说,您需要二进制文件分发。将 readline5.dll(在bin目录中)复制到您的ruby\bin目录,并将其重命名为readline.dll.

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

于 2009-09-29T15:48:54.690 回答
1

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

在 Ruby 中,我不相信有任何 termcap 绑定,因此您使用 ncurses,而不是将一组设备相关的控制代码硬连接到您的程序中。(无论如何,您都希望 ncurses 超过 termcap。)

一旦你切换到 ncurses,我相信你会找到 API 元素来做你需要的一切,包括备份行和不覆盖提示。(当然你不应该备份任何你没有输出的东西,不管正在使用什么库。)

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

于 2009-09-29T15:44:42.440 回答
1

对于 Windows 友好的 readline 实现,试试这个基于 ruby​​ 的 readline

于 2009-09-29T17:19:57.647 回答