lib/sup/modes/buffer_list_mode.rb (1212B) - raw
1 module Redwood
2
3 class BufferListMode < LineCursorMode
4 register_keymap do |k|
5 k.add :jump_to_buffer, "Jump to selected buffer", :enter
6 k.add :reload, "Reload buffer list", "@"
7 k.add :kill_selected_buffer, "Kill selected buffer", "X"
8 end
9
10 def initialize
11 regen_text
12 super
13 end
14
15 def lines; @text.length end
16 def [] i; @text[i] end
17
18 def focus
19 reload # buffers may have been killed or created since last view
20 set_cursor_pos 0
21 end
22
23 protected
24
25 def reload
26 regen_text
27 buffer.mark_dirty
28 end
29
30 def regen_text
31 @bufs = BufferManager.buffers.reject { |name, buf| buf.mode == self || buf.hidden? }.sort_by { |name, buf| buf.atime }.reverse
32 width = @bufs.max_of { |name, buf| buf.mode.name.length }
33 @text = @bufs.map do |name, buf|
34 base_color = buf.system? ? :system_buf_color : :regular_buf_color
35 [[base_color, sprintf("%#{width}s ", buf.mode.name)],
36 [:modified_buffer_color, (buf.mode.unsaved? ? '*' : ' ')],
37 [base_color, " " + name]]
38 end
39 end
40
41 def jump_to_buffer
42 BufferManager.raise_to_front @bufs[curpos][1]
43 end
44
45 def kill_selected_buffer
46 reload if BufferManager.kill_buffer_safely @bufs[curpos][1]
47 end
48 end
49
50 end