2011-09-04 2 views
3

В Ruby мне нужен простой поток, который будет запускать некоторый код при каждом нажатии клавиши. Есть ли способ сделать это?Как захватить нажатие клавиши в Ruby?

мне нужно, чтобы быть в состоянии захватить Page Up и Page Down

Вот что я пробовал:

#!/usr/bin/env ruby 

Thread.new do 
    while c = STDIN.getc 
    puts c.chr 
    end 
end 

loop do 
    puts Time.new 
    sleep 0.7 
end 

Это почти работает. Есть только 1 проблема, нужно нанести ответный удар после каждого нажатия клавиши. Я думаю, это из-за буферизации ввода-вывода.

ответ

12

Вы можете использовать библиотеку curses для захвата нажатия клавиш без буферизации.

require 'curses' 

Curses.noecho # do not show typed keys 
Curses.init_screen 
Curses.stdscr.keypad(true) # enable arrow keys (required for pageup/down) 

loop do 
    case Curses.getch 
    when Curses::Key::PPAGE 
    Curses.setpos(0,0) 
    Curses.addstr("Page Up") 
    when Curses::Key::NPAGE 
    Curses.setpos(0,0) 
    Curses.addstr("Page Dn") 
    end 
end 

коды клавиш здесь:

http://ruby-doc.org/stdlib/libdoc/curses/rdoc/index.html

Вы можете найти более длинный пример на GitHub:

https://github.com/grosser/tic_tac_toe/blob/master/bin/tic_tac_toe

Смежные вопросы