]> git.cworth.org Git - sup/blob - lib/sup/mode.rb
i guess range doesn't have a #size method
[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     action = resolve_input(c) or return false
52     send action
53     true
54   end
55
56   def help_text
57     used_keys = {}
58     ancestors.map do |klass|
59       km = @@keymaps[klass] or next
60       title = "Keybindings from #{Mode.make_name klass.name}"
61       s = <<EOS
62 #{title}
63 #{'-' * title.length}
64
65 #{km.help_text used_keys}
66 EOS
67       begin
68         used_keys.merge! km.keysyms.to_boolean_h
69       rescue ArgumentError
70         raise km.keysyms.inspect
71       end
72       s
73     end.compact.join "\n"
74   end
75
76   ## helper function
77   def save_to_file fn
78     if File.exists? fn
79       return unless BufferManager.ask_yes_or_no "File exists. Overwrite?"
80     end
81     begin
82       File.open(fn, "w") { |f| yield f }
83       BufferManager.flash "Successfully wrote #{fn}."
84     rescue SystemCallError, IOError => e
85       BufferManager.flash "Error writing to file: #{e.message}"
86     end
87   end
88 end
89
90 end