用Ruby中的键盘浏览数组

用Ruby中的键盘浏览数组,ruby,command-line-interface,curses,Ruby,Command Line Interface,Curses,我正在尝试用Ruby制作一个cli应用程序,它接受给定的数组,然后将其显示为一个列表,我可以用箭头键浏览 我觉得我已经看到Ruby中的一个库已经做到了这一点,但是我记不起它的名字了 我正试图对源代码进行反向工程,以执行类似的操作,但他的代码与SoundCloudAPI的使用紧密耦合 我意识到诅咒宝石,我在思考一些更抽象的东西 有没有人见过这样做的库,或者有什么概念验证的Ruby代码可以做到这一点?您正在寻找Ruby gem 由@phoet创建的菜单的名称 require "curses" inc

我正在尝试用Ruby制作一个cli应用程序,它接受给定的数组,然后将其显示为一个列表,我可以用箭头键浏览

我觉得我已经看到Ruby中的一个库已经做到了这一点,但是我记不起它的名字了

我正试图对源代码进行反向工程,以执行类似的操作,但他的代码与SoundCloudAPI的使用紧密耦合

我意识到诅咒宝石,我在思考一些更抽象的东西

有没有人见过这样做的库,或者有什么概念验证的Ruby代码可以做到这一点?

您正在寻找Ruby gem

由@phoet创建的菜单的名称

require "curses"
include Curses

init_screen
start_color
noecho

def draw_menu(menu, active_index=nil)
  4.times do |i|
    menu.setpos(i + 1, 1)
    menu.attrset(i == active_index ? A_STANDOUT : A_NORMAL)
    menu.addstr "item_#{i}"
  end
end

def draw_info(menu, text)
  menu.setpos(1, 10)
  menu.attrset(A_NORMAL)
  menu.addstr text
end

position = 0

menu = Window.new(7,40,7,2)
menu.box('|', '-')
draw_menu(menu, position)
while ch = menu.getch
  case ch
  when 'w'
    draw_info menu, 'move up'
    position -= 1
  when 's'
    draw_info menu, 'move down'
    position += 1
  when 'x'
    exit
  end
  position = 3 if position < 0
  position = 0 if position > 3
  draw_menu(menu, position)
end
需要“诅咒”
包括诅咒
初始屏幕
起始颜色
诺埃乔
def draw_菜单(菜单,活动索引=nil)
4.我是|
菜单设置位置(i+1,1)
属性集(i==活动索引?突出:正常)
menu.addstr“项{i}”
结束
结束
def绘图信息(菜单,文本)
菜单设置位置(1,10)
菜单属性集(A_正常)
menu.addstr文本
结束
位置=0
菜单=窗口。新建(7,40,7,2)
菜单框(“|”和“-”)
绘图菜单(菜单、位置)
而ch=menu.getch
案例ch
当“w”
绘制信息菜单“上移”
位置-=1
什么时候
绘图信息菜单“下移”
位置+=1
当‘x’
出口
结束
如果位置<0,则位置=3
如果位置>3,则位置=0
绘图菜单(菜单、位置)
结束

我不知道这是否是你想要的,但也许你可以利用我的想法

由于我没有更多关于您要完成什么、您的输入是什么等的信息,所以这个示例将非常简单

假设我们有一个名为PlayDemo的类,它将创建包含歌曲的播放列表:

class PlaylistDemo
  attr_accessor :position

  def initialize songs
    @playlist = Array.new
    songs.each { |song| @playlist << song }
    @position = 0
  end

  def show_playlist
    @playlist.each_with_index.map do |song, index|
      position == index ? "[#{song}]" : " #{song} "
    end
  end

end
继续做一个物体:

pd = PlaylistDemo.new(songs)
现在我的想法是使用它来操纵位置,并准确地看到您所在的位置(并相应地更新“UI”)

为此,我准备了一个函数,它将为您的CLI应用程序创建UI:

def show_ui playlist_obj
  ["\n", playlist_obj.show_playlist, "\nCurrent position: #{playlist_obj.position + 1} "].join("\n")
end
最后一段代码:

Dispel::Screen.open do |screen|
  screen.draw show_ui(pd)

  Dispel::Keyboard.output do |key|
    case key
    when :up then pd.position -= 1
    when :down then pd.position += 1
    when "q" then break
    end

    screen.draw show_ui(pd)
  end
end
您也可以使用,但为此,您需要将
放在某个地方

请不要说我没有设置职位限制,因为这只是一个例子

请参见我的示例:


完整代码:

我知道诅咒宝石,我说的是一个有更多抽象的库。很抱歉,这没有帮助,下次请包括你知道适用的宝石,以便其他人可以更准确地回答你的问题。不用担心,只需将它添加到我的答案中。砰,我想就是这样了!Discure是我想到的库和一些完美的示例代码!今晚让我试试这个,给你赏金:)我很高兴它有帮助:)我的第一笔赏金
Dispel::Screen.open do |screen|
  screen.draw show_ui(pd)

  Dispel::Keyboard.output do |key|
    case key
    when :up then pd.position -= 1
    when :down then pd.position += 1
    when "q" then break
    end

    screen.draw show_ui(pd)
  end
end