7 def self.register_keymap keymap=nil, &b
8 keymap = Keymap.new(&b) if keymap.nil?
9 @@keymaps[self] = keymap
16 def self.make_name s; s.gsub(/.*::/, "").camel_to_hyphy; end
17 def name; Mode.make_name self.class.name; end
19 def self.load_all_modes dir
20 Dir[File.join(dir, "*.rb")].each do |f|
21 $stderr.puts "## loading mode #{f}"
26 def killable?; true; end
27 def unsaved?; false end
31 def cancel_search!; end
32 def in_search?; false end
34 def resize rows, cols; end
40 ancestors.each do |klass| # try all keymaps in order of ancestry
41 next unless @@keymaps.member?(klass)
42 action = BufferManager.resolve_input_with_keymap c, @@keymaps[klass]
43 return action if action
49 action = resolve_input(c) or return false
56 ancestors.map do |klass|
57 km = @@keymaps[klass] or next
58 title = "Keybindings from #{Mode.make_name klass.name}"
63 #{km.help_text used_keys}
66 used_keys.merge! km.keysyms.to_boolean_h
68 raise km.keysyms.inspect
78 return unless BufferManager.ask_yes_or_no "File exists. Overwrite?"
81 File.open(fn, "w") { |f| yield f }
82 BufferManager.flash "Successfully wrote #{fn}."
83 rescue SystemCallError, IOError => e
84 BufferManager.flash "Error writing to file: #{e.message}"
88 def pipe_to_process command
89 Open3.popen3(command) do |input, output, error|
90 err, data, * = IO.select [error], [input], nil
93 message = err.first.read
95 Redwood::log "error running #{command} (but no error message)"
96 BufferManager.flash "Error running #{command}!"
98 Redwood::log "error running #{command}: #{message}"
99 BufferManager.flash "Error: #{message}"
105 data.sync = false # buffer input
108 data.close # output will block unless input is closed
110 ## BUG?: shows errors or output but not both....
111 data, * = IO.select [output, error], nil, nil
115 BufferManager.flash "'#{command}' done!"