在 Ruby 中用键盘诅咒数组浏览

Curses array browsing with keyboard in Ruby

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

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

我正在尝试对 soundcloud2000 的代码进行逆向工程以执行类似的操作,但他的代码与 Soundcloud API.

的使用紧密相关

我知道诅咒宝石,我正在考虑更多的东西 abstraction.Ad

有没有人见过可以做到这一点的库或一些概念证明 Ruby 可以做到这一点的代码?

您正在寻找 curses ruby gem.

Example 由@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

我不知道这是否是您正在寻找的,但也许您可以使用我的想法。

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

假设我们有一个 class 可以与名为 PlaylistDemo 一起使用,它将创建一个包含歌曲的播放列表:

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

准备一些歌曲:

# From billboard.com
songs = [
  "Taylor Swift -  Blank Space",
  "Mark Ronson Featuring Bruno Mars -  Uptown Funk!",
  "Hozier -  Take Me To Church",
  "Meghan Trainor - Lips Are Movin",
  "Meghan Trainor -  All About That Bass"
]

然后继续制作对象:

pd = PlaylistDemo.new(songs)

现在我的想法是使用 dispel 来操纵位置并准确查看您的位置(并相应地更新 "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

您也可以使用 colorize 但为此您需要 puts 某处。

请注意,我没有设置位置限制,因为这只是一个示例。

在此处查看我的示例:

完整代码:http://paste.debian.net/139651/