3 class LineCursorMode < ScrollMode
5 ## overwrite scrollmode binding on arrow keys for cursor movement
6 ## but j and k still scroll!
7 k.add :cursor_down, "Move cursor down one line", :down, 'j'
8 k.add :cursor_up, "Move cursor up one line", :up, 'k'
9 k.add :select, "Select this item", :enter
14 def initialize cursor_top=0, opts={}
15 @cursor_top = cursor_top
27 def draw_line ln, opts={}
29 super ln, :highlight => true, :debug => opts[:debug]
35 def ensure_mode_validity
37 raise @curpos.inspect unless @curpos.is_a?(Integer)
38 c = @curpos.clamp topline, botline - 1
39 c = @cursor_top if c < @cursor_top
40 buffer.mark_dirty unless c == @curpos
45 return if @curpos == p
46 @curpos = p.clamp @cursor_top, lines
50 def line_down # overwrite scrollmode
52 set_cursor_pos topline if @curpos < topline
55 def line_up # overwrite scrollmode
57 set_cursor_pos botline - 1 if @curpos > botline - 1
61 return false unless @curpos < lines - 1
62 if @curpos >= botline - 1
64 set_cursor_pos [topline + 1, botline].min
78 return false unless @curpos > @cursor_top
81 set_cursor_pos [botline - 2, topline].max
82 # raise "cursor position now #@curpos, topline #{topline} botline #{botline}"
95 def page_up # overwrite
96 if topline <= @cursor_top
97 set_cursor_pos @cursor_top
99 relpos = @curpos - topline
101 set_cursor_pos topline + relpos
106 if topline >= lines - buffer.content_height
107 set_cursor_pos(lines - 1)
109 relpos = @curpos - topline
111 set_cursor_pos [topline + relpos, lines - 1].min
117 set_cursor_pos @cursor_top
121 super if topline < (lines - buffer.content_height)
122 set_cursor_pos(lines - 1)
128 @status = "line #{@curpos + 1} of #{lines}"