Module: Exfuz::Key

Defined in:
lib/exfuz/key_map.rb

Constant Summary collapse

CTRL_A =

input_to_name_and_charで、文字と区別するためにシンボルで定義

:ctrl_a
CTRL_E =
:ctrl_e
CTRL_R =
:ctrl_r
CTRL_H =
:ctrl_h
CTRL_L =
:ctrl_l
ESC =
:esc
F1 =
:f1
F2 =
:f2
F3 =
:f3
F4 =
:f4
F5 =
:f5
F6 =
:f6
F7 =
:f7
F8 =
:f8
F9 =
:f9
F10 =
:f10
F11 =
:f11
F12 =
:f12
UP =
:down
DOWN =
:up
RIGHT =
:right
LEFT =
:left
BACKSPACE =
:backspace
ENTER =
:enter
CHAR =
:char
INPUT_TO_SPECIAL_KEY_NAME =

メモ化してもカーソル移動が若干遅い

{
  'OP' => F1,
  'OQ' => F2,
  'OR' => F3,
  'OS' => F4,
  '[15' => F5,
  '[17' => F6,
  '[18' => F7,
  '[19' => F8,
  '[20' => F9,
  '[21' => F10,
  '[23' => F11,
  '[24' => F12,
  '[A' => UP,
  '[B' => DOWN,
  '[C' => RIGHT,
  '[D' => LEFT,
  Curses::Key::ENTER => ENTER,
  10 => ENTER,
  27 => ESC,
  Curses::KEY_CTRL_E => CTRL_E,
  Curses::KEY_CTRL_R => CTRL_R,
  Curses::KEY_CTRL_H => CTRL_H,
  Curses::KEY_CTRL_L => CTRL_L,
  127 => BACKSPACE # 現状は開発環境の値に合わせる (127 or 263)
}.freeze

Class Method Summary collapse

Class Method Details

.can_convert_to_name_and_char?(input) ⇒ Boolean

Returns:

  • (Boolean)


103
104
105
106
# File 'lib/exfuz/key_map.rb', line 103

def can_convert_to_name_and_char?(input)
  name = input_to_name_and_char(input)
  !name.nil? && name != ESC
end

.input_to_name_and_char(input) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/exfuz/key_map.rb', line 83

def input_to_name_and_char(input)
  case input
  when Array
    first = input.first
    if special_key?(first)
      input_to_special_key_name(input.slice(1, input.size - 1).join)
    else
      [CHAR, multibytes_to_char(input)]
    end
  when Integer
    input_to_special_key_name(input)
  when String
    [CHAR, input]
  end
end

.input_to_special_key_name(str_or_number) ⇒ Object



99
100
101
# File 'lib/exfuz/key_map.rb', line 99

def input_to_special_key_name(str_or_number)
  INPUT_TO_SPECIAL_KEY_NAME[str_or_number]
end

.multibytes_to_char(multi_bytes) ⇒ Object



112
113
114
# File 'lib/exfuz/key_map.rb', line 112

def multibytes_to_char(multi_bytes)
  multi_bytes.pack('C*').force_encoding(Encoding::UTF_8)
end

.special_key?(number) ⇒ Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/exfuz/key_map.rb', line 108

def special_key?(number)
  number == 27
end