]> git.cworth.org Git - sup/blob - lib/sup/mode.rb
91bdbe6c059d7791b28832d825fd269809caa600
[sup] / lib / sup / mode.rb
1 module Redwood
2
3 class Mode
4   attr_accessor :buffer
5   @@keymaps = {}
6
7   def self.register_keymap keymap=nil, &b
8     keymap = Keymap.new(&b) if keymap.nil?
9     @@keymaps[self] = keymap
10   end
11
12   def initialize
13     @buffer = nil
14   end
15
16   def self.make_name s; s.gsub(/.*::/, "").camel_to_hyphy; end
17   def name; Mode.make_name self.class.name; end
18
19   def self.load_all_modes dir
20     Dir[File.join(dir, "*.rb")].each do |f|
21       $stderr.puts "## loading mode #{f}"
22       require f
23     end
24   end
25
26   def killable?; true; end
27   def draw; end
28   def focus; end
29   def blur; end
30   def status; ""; end
31   def resize rows, cols; end
32   def cleanup
33     @buffer = nil
34   end
35
36   ## turns an input keystroke into an action symbol
37   def resolve_input c
38     ## try all keymaps in order of age
39     action = nil
40     klass = self.class
41
42     ancestors.each do |klass|
43       action = @@keymaps.member?(klass) && @@keymaps[klass].action_for(c)
44       return action if action
45     end
46
47     nil
48   end
49
50   def handle_input c
51     if(action = resolve_input c)
52       send action
53       true
54     else
55       false
56     end
57   end
58
59   def help_text
60     used_keys = {}
61     ancestors.map do |klass|
62       km = @@keymaps[klass] or next
63       title = "Keybindings from #{Mode.make_name klass.name}"
64       s = <<EOS
65 #{title}
66 #{'-' * title.length}
67
68 #{km.help_text used_keys}
69 EOS
70       begin
71         used_keys.merge! km.keysyms.to_boolean_h
72       rescue ArgumentError
73         raise km.keysyms.inspect
74       end
75       s
76     end.compact.join "\n"
77   end
78 end
79
80 end