x = global_keymap.action_for c
case x
when :quit
x = global_keymap.action_for c
case x
when :quit
+ break if bm.kill_all_buffers_safely
when :help
curmode = bm.focus_buf.mode
bm.spawn_unless_exists("<help for #{curmode.name}>") { HelpMode.new curmode, global_keymap }
when :help
curmode = bm.focus_buf.mode
bm.spawn_unless_exists("<help for #{curmode.name}>") { HelpMode.new curmode, global_keymap }
when :roll_buffers_backwards
bm.roll_buffers_backwards
when :kill_buffer
when :roll_buffers_backwards
bm.roll_buffers_backwards
when :kill_buffer
- bm.kill_buffer bm.focus_buf if bm.focus_buf.mode.killable?
+ bm.kill_buffer_safely bm.focus_buf
when :list_buffers
bm.spawn_unless_exists("Buffer List") { BufferListMode.new }
when :list_contacts
when :list_buffers
bm.spawn_unless_exists("Buffer List") { BufferListMode.new }
when :list_contacts
rescue Exception => e
$exception ||= e
ensure
rescue Exception => e
$exception ||= e
ensure
+ def kill_all_buffers_safely
+ until @buffers.empty?
+ ## inbox mode always claims it's unkillable. we'll ignore it.
+ return false unless @buffers.first.mode.is_a?(InboxMode) || @buffers.first.mode.killable?
+ kill_buffer @buffers.first
+ end
+ true
+ end
+
+ def kill_buffer_safely buf
+ return false unless buf.mode.killable?
+ kill_buffer buf
+ true
+ end
+
def kill_all_buffers
kill_buffer @buffers.first until @buffers.empty?
end
def kill_all_buffers
kill_buffer @buffers.first until @buffers.empty?
end