]> git.cworth.org Git - sup/blob - lib/sup/mode.rb
yet more imap betterification
[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 cancel_search!; end
31   def in_search?; false end
32   def status; ""; end
33   def resize rows, cols; end
34   def cleanup
35     @buffer = nil
36   end
37
38   ## turns an input keystroke into an action symbol
39   def resolve_input c
40     ## try all keymaps in order of age
41     action = nil
42     klass = self.class
43
44     ancestors.each do |klass|
45       action = @@keymaps.member?(klass) && @@keymaps[klass].action_for(c)
46       return action if action
47     end
48
49     nil
50   end
51
52   def handle_input c
53     action = resolve_input(c) or return false
54     send action
55     true
56   end
57
58   def help_text
59     used_keys = {}
60     ancestors.map do |klass|
61       km = @@keymaps[klass] or next
62       title = "Keybindings from #{Mode.make_name klass.name}"
63       s = <<EOS
64 #{title}
65 #{'-' * title.length}
66
67 #{km.help_text used_keys}
68 EOS
69       begin
70         used_keys.merge! km.keysyms.to_boolean_h
71       rescue ArgumentError
72         raise km.keysyms.inspect
73       end
74       s
75     end.compact.join "\n"
76   end
77
78   ## helper function
79   def save_to_file fn
80     if File.exists? fn
81       return unless BufferManager.ask_yes_or_no "File exists. Overwrite?"
82     end
83     begin
84       File.open(fn, "w") { |f| yield f }
85       BufferManager.flash "Successfully wrote #{fn}."
86     rescue SystemCallError, IOError => e
87       BufferManager.flash "Error writing to file: #{e.message}"
88     end
89   end
90 end
91
92 end