2017-08-06 67 views
0

我想学习Ruby,所以我想我会尝试在同一时间学习它和Curses。我正在创建一个导航菜单,允许用户选择将运行系统命令的选项。如何在使用诅咒时正确检测返回或输入密钥

我已经到了创建导航菜单的地步,我可以使用箭头键循环选项。

现在我正在尝试读取Enter键作为输入,并在按Enter键时运行系统命令。例如:

input = menu.getch 
    if input == ENTER 

position = 3 if position < 0 
    position = 0 if position > 3 
    draw_menu(menu, position) 
    if position == 0 
    draw_info menu, 'You selected option 0' 
    input = menu.getch 
    if input == ENTER 
     menu.clear 
     menu.refresh 
     puts (system 'ls') 

    end 

当按下回车键后,系统命令不工作(种),但我有一个问题,即如果该选项的系统命令也运行只是选择或突出显示。如果按下Enter键,我只想让它工作。

如果我将其更改为

if input == 'k' 

系统命令按下回车键时,只运行。它突出显示或选择时不会运行。这是我希望它工作的方式。

有关如何让Enter键与'k'键相同的任何想法?

这是我的代码。

require 'curses' 
include Curses 

# Top Lie 
SCREEN_WIDTH  = 90 
HEADER_HEIGHT  = 4 
HEADER_WIDTH  = SCREEN_WIDTH 

# Bottom Line 
SCREEN_WIDTH2  = 90 
HEADER_HEIGHT2  = 1 
HEADER_WIDTH2  = SCREEN_WIDTH2 

Curses.init_screen 
Curses.curs_set(0) # Invisible cursor 

Curses.start_color 

Curses.noecho # echo or noecho to display user input 
Curses.nonl 
Curses.raw 
Curses.stdscr.nodelay = 1 

Curses.init_pair(1, Curses::COLOR_WHITE, Curses::COLOR_BLUE) 
Curses.init_pair(2, Curses::COLOR_WHITE, Curses::COLOR_BLUE) 

begin 

    # Top Line 
    header_window = Curses::Window.new(HEADER_HEIGHT, HEADER_WIDTH, 0, 0) # (height, width, top, left) 
    header_window.color_set(1) 
    header_window << "Curses example".center(HEADER_WIDTH) 
    header_window.refresh 

    # Bottom Line 
    header2_window = Curses::Window.new(HEADER_HEIGHT, HEADER_WIDTH, 23, 0) 
    header2_window.color_set(2) 
    header2_window << "Curses example".center(HEADER_WIDTH) 
    header2_window.refresh 

    # Building a static window 

    def draw_menu(menu, active_index=nil) 
     ["This is option 0.", "This is option 1.", "This is option 2.", "This is option 3."].each_with_index do |element, index| 
     # "w" for word array 
     # It's a shortcut for arrays 
     menu.setpos(index + 1, 1) 
     menu.attrset(index == active_index ? A_STANDOUT : A_NORMAL) 
     menu.addstr("#{index} - %-10s" % element) # %-Xs makes sure array words line up evenly if you place index after element 
                # you can change 17 to another number 
     end 
     menu.setpos(5, 1) 
    end 

    def draw_info(menu, text) 
     menu.setpos(6, 1) # sets the position of move up and down 
         # for example, menu.setpos(1, 10) moves to another 
         # location 
     menu.attrset(A_NORMAL) 
     menu.addstr text 
    end 

    position = 0 

    menu = Window.new(20, 70, 2, 2) # (height, width, top, left) 
    menu.keypad = true # enable keypad which allows arrow keys 
    #menu.box('|', '-') 
    draw_menu(menu, position) 
    while ch = menu.getch 
     stdscr.keypad = true 
     case ch 
     when KEY_UP, 'w' 
     #draw_info menu, 'move up' 
     position -= 1 
     when KEY_DOWN, '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) 
     if position == 0 
     draw_info menu, 'You selected option 0' 
     input = menu.getch 
     if input == 'k' # I want this to be ENTER 
      menu.clear 
      menu.refresh 
      puts (system 'ls') # This does not work well. I need to fix it. 

     end 
     elsif position == 1 
     draw_info menu, 'You selected option 1' 
     elsif position == 2 
     draw_info menu, 'You selected option 2' 
     else position == 3 
     draw_info menu, 'You selected option 3' 
     end  
    end 

rescue => ex 
    Curses.close_screen 
end 

回答

0

可能有更多的问题,但你可能跑入一个就是键盘上的Enter键通常没有什么诅咒(ncurses的)调用KEY_ENTER。相反,它通常分配给输入数字键盘(并且当键盘模式被启用时,它发送转义序列)。这在proper way of catching control+key in ncurses中讨论。

此外,使用

Curses.raw 

您初始化阻止诅咒在任何情况下返回KEY_ENTER。也就是说,curses不会识别分配给该代码的转义序列。你可能会想尝试

Curses.cbreak 
Curses.stdscr.keypad = 1 

它(除非未显示的东西正在KEY_UPKEY_DOWN工作)将与其他KEY_xxx符号帮助,并在你希望“ENTER”,接受一个换行符\n字符。这更可能做你期望的。

进一步阅读: