我正在尝试用 Ruby 编写一个 shell,并使用 WinAPI 函数来实现制表符补全 getch 一次从用户处读取一个字符,检查制表符。

这样做的问题是 退格键 钥匙:

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

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

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

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

我研究了 WinAPI 并试图找到可以让我做到这一点的函数,但我所有的 能找到 曾是 GetConsoleCursorInfo 函数,仅返回光标的大小和可见性。

示例将不胜感激,因为我对将 Win32API 类用于除原始函数之外的任何内容都无望。

谢谢。

有帮助吗?

解决方案

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

require 'readline'

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

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


编辑:

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

虽然 Ruby 主页上没有记录它,但看起来您也可以使用 readline 5,可用 这里. 。具体来说,您需要 二进制文件 分配。复制 readline5.dll(在 bin 目录)到您的 ruby\bin 目录,并将其重命名为 readline.dll.

另外,作为旁注,如果出现以下情况,请不要惊慌 require 'readline' 使用 irb 时返回 false,因为它似乎预加载了它。

其他提示

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

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

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

其实我有点喜欢 香蒜的回答。使用 ncurses 如果 readline 不起作用或者如果您因其他原因需要光标寻址。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top