8 def self.register_keymap keymap=nil, &b
9 keymap = Keymap.new(&b) if keymap.nil?
10 @@keymaps[self] = keymap
17 def self.make_name s; s.gsub(/.*::/, "").camel_to_hyphy; end
18 def name; Mode.make_name self.class.name; end
20 def self.load_all_modes dir
21 Dir[File.join(dir, "*.rb")].each do |f|
22 $stderr.puts "## loading mode #{f}"
27 def killable?; true; end
28 def unsaved?; false end
32 def cancel_search!; end
33 def in_search?; false end
35 def resize rows, cols; end
41 ancestors.each do |klass| # try all keymaps in order of ancestry
42 next unless @@keymaps.member?(klass)
43 action = BufferManager.resolve_input_with_keymap c, @@keymaps[klass]
44 return action if action
50 action = resolve_input(c) or return false
57 ancestors.map do |klass|
58 km = @@keymaps[klass] or next
59 title = "Keybindings from #{Mode.make_name klass.name}"
62 #{'-' * title.display_length}
64 #{km.help_text used_keys}
67 used_keys.merge! km.keysyms.to_boolean_h
69 raise km.keysyms.inspect
79 return unless BufferManager.ask_yes_or_no "File exists. Overwrite?"
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}"
89 def pipe_to_process command
90 Open3.popen3(command) do |input, output, error|
91 err, data, * = IO.select [error], [input], nil
94 message = err.first.read
96 warn "error running #{command} (but no error message)"
97 BufferManager.flash "Error running #{command}!"
99 warn "error running #{command}: #{message}"
100 BufferManager.flash "Error: #{message}"
106 data.sync = false # buffer input
109 data.close # output will block unless input is closed
111 ## BUG?: shows errors or output but not both....
112 data, * = IO.select [output, error], nil, nil
116 BufferManager.flash "'#{command}' done!"