gpt4 book ai didi

ruby - 阅读用户输入时如何避免回显换行符?

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:55 26 4
gpt4 key购买 nike

我正在用 Ruby 编写类似 curses 的程序,我正在使用 stty 和 ansi 转义字符来实现我想要的。当我想获得用户输入时,我的问题就出现了。像许多基于控制台的程序一样,我想从终端底部获取用户输入。

因此,我将光标放在屏幕底部并调用 Readline.readline(或任何获取用户输入的方法)。像往常一样,它会读取所有内容,直到我按下回车键,并打印一个换行符。由于光标位于终端的最后一行,它会滚动一行,这会弄乱屏幕。

我怎样才能避免这种情况?我试图使用 stty 来停止回显换行符,但我没有成功。也许可以使用 stty 来阻止终端滚动?当然,我可以编写自己的方法来通过一次读取一个字符(并捕获“返回”)来捕获输入,但我想使用 readline 提供的所有额外功能。

最佳答案

Ruby Readline 是 GNU Readline 库的简单包装器,它直接管理终端模式 - 这就是为什么您可能不太幸运地使用 stty 来修改终端设置。 Readline.readline 方法专门将终端置于原始模式并将所有字符回显到 STDOUT(或 Ruby 1.9 的 Readline.output,默认为 STDOUT)。

不幸的是,Ruby Readline 包装器没有完全包装GNU Readline 库; GNU Readline 为 redisplay 提供了许多功能,但 Ruby Readline 包装器不公开这些函数。

如果您特别想使用 Readline 和 Ruby 并且需要忽略该换行符,那么您没有太多选择。一个有点愚蠢的选择是打开一个管道作为中介监听它自己的线程并将所有 Readline 输出转发给它。以下实现了这一点,但请注意,这不是您真正想要的(在 OSX 上,它需要 ruby​​ 1.9.2 链接到 readline 而不是 libedit,因为 libedit 正在阻塞)...

require 'readline'

`mkfifo /tmp/readline-pipe`

Readline.output = File.open("/tmp/readline-pipe", "w+")

Thread.new {
input = open("/tmp/readline-pipe", "r+")
while true
character = input.getc
if character != "\n"
$stdout.write(character)
$stdout.flush
end
end
}

begin
while line = Readline.readline("", true)
$stdout.write(" NEWLINE ENTERED BUT NOT DISPLAYED ")
$stdout.flush
end
rescue EOFError
puts "Exiting..."
end

关于ruby - 阅读用户输入时如何避免回显换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7057196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com