]> git.cworth.org Git - sup/blob - lib/sup/keymap.rb
moved evertying to devel
[sup] / lib / sup / keymap.rb
1 require "curses"
2
3 module Redwood
4
5 class Keymap
6   def initialize
7     @map = {}
8     @order = []
9     yield self if block_given?
10   end
11
12   def keysym_to_keycode k
13     case k
14     when :down: Curses::KEY_DOWN
15     when :up: Curses::KEY_UP
16     when :left: Curses::KEY_LEFT
17     when :right: Curses::KEY_RIGHT
18     when :page_down: Curses::KEY_NPAGE
19     when :page_up: Curses::KEY_PPAGE
20     when :backspace: Curses::KEY_BACKSPACE
21     when :home: Curses::KEY_HOME
22     when :end: Curses::KEY_END
23     when :ctrl_l: "\f"[0]
24     when :ctrl_g: "\a"[0]
25     when :tab: "\t"[0]
26     when :enter, :return: 10 #Curses::KEY_ENTER
27     else
28       if k.is_a?(String) && k.length == 1
29         k[0]
30       else
31         raise ArgumentError, "unknown key name '#{k}'"
32       end
33     end
34   end
35
36   def keysym_to_string k
37     case k
38     when :down: "<down arrow>"
39     when :up: "<up arrow>"
40     when :left: "<left arrow>"
41     when :right: "<right arrow>"
42     when :page_down: "<page down>"
43     when :page_up: "<page up>"
44     when :backspace: "<backspace>"
45     when :home: "<home>"
46     when :end: "<end>"
47     when :enter, :return: "<enter>"
48     when :ctrl_l: "ctrl-l"
49     when :ctrl_l: "ctrl-g"
50     when :tab: "tab"
51     when " ": "<space>"
52     else
53       if k.is_a?(String) && k.length == 1
54         k
55       else
56         raise ArgumentError, "unknown key name \"#{k}\""
57       end
58     end
59   end
60
61   def add action, help, *keys
62     entry = [action, help, keys]
63     @order << entry
64     keys.each do |k|
65       raise ArgumentError, "key #{k} already defined (action #{action})" if @map.include? k
66       kc = keysym_to_keycode k
67       @map[kc] = entry
68     end
69   end
70
71   def action_for kc
72     action, help, keys = @map[kc]
73     action
74   end
75
76   def keysyms; @map.values.map { |action, help, keys| keys }.flatten; end
77
78   def help_text except_for={}
79     lines = @order.map do |action, help, keys|
80       valid_keys = keys.select { |k| !except_for[k] }
81       next if valid_keys.empty?
82       [valid_keys.map { |k| keysym_to_string k }.join(", "), help]
83     end.compact
84     llen = lines.map { |a, b| a.length }.max
85     lines.map { |a, b| sprintf " %#{llen}s : %s", a, b }.join("\n")
86   end
87 end
88
89 end