【问题标题】:Ruby line editing telnet serverRuby 行编辑 telnet 服务器
【发布时间】:2011-09-15 15:11:09
【问题描述】:

我正在用 Ruby 实现一个小型 telnet 服务器。我目前面临的问题是我想添加 readline 支持,以便我可以拥有制表符完成和命令行历史记录支持。我查看了Readline 库,但它似乎只能通过标准输入工作。有没有办法在 Ruby 中做到这一点(我注意到Python 的解决方案)?

【问题讨论】:

  • 对不起,您尝试在服务器上实现 readline 吗?我相信 readline 是在客户端实现的。
  • Jip,这是我目前的问题。 Readline 仅适用于标准输入(因此,仅适用于客户端)。我想知道是否可以让 readline 通过 telnet 工作,以便我可以为我的 telnet 服务器公开的服务器端命令自动完成等。
  • 我不认为 readline 可以在 stdin 以外的任何地方工作。您希望用户使用标准 telnet 客户端进行连接吗?我实际上不确定 telnet 是否支持制表符补全。我认为最直接的方法是简单地实现您自己的客户端并在那里添加带有选项卡完成的 readline 支持。
  • ruby Readline 有 .input= 和 .output= 方法,根据文档,它们应该将文件设置为输入/输出。不过,在我的 1.9.2 安装中,它们似乎被忽略了。

标签: ruby sockets telnet libreadline


【解决方案1】:

您可以通过将管道连接到 readline 来做到这一点。这是使用 ri readline 文档中的 while 循环的示例,该循环仅将 command 1command2command 3 发送到 readline。

require 'readline'

rd, wr = IO.pipe

(1..3).each do |i|
  wr.puts "command #{i}"
end
wr.close

Readline.input = rd
while buf = Readline.readline('', true)
  p Readline::HISTORY.to_a
  print("-> ", buf, "\n")
end

输出:

["command 1"]
-> command 1
["command 1", "command 2"]
-> command 2
["command 1", "command 2", "command 3"]
-> command 3

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 2011-04-30
    • 2013-11-10
    • 2011-06-27
    • 2014-03-29
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2018-12-25
    相关资源
    最近更新 更多