如何在 Ruby 中获取/设置控制台光标位置 (Windows)
-
18-09-2019 - |
题
我正在尝试用 Ruby 编写一个 shell,并使用 WinAPI 函数来实现制表符补全 getch
一次从用户处读取一个字符,检查制表符。
这样做的问题是 退格键 钥匙:
- 它将光标移动到比提示更靠后的位置(例如,使用提示
hello>
, ,用户可以将光标退格到h
. 。我希望它停在最后一个空格。 - 当用户的文本溢出到控制台的下一行时,退格键不会移回到上一行。
(我知道这两种行为都是设计使然。)
我想象中的这些问题的解决方案包括控制光标移动;我需要知道光标在哪里,并且能够移动它。
在 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