]> git.cworth.org Git - sup/blob - lib/sup/modes/text-mode.rb
make text-mode preserve original unmunged text (for saving)
[sup] / lib / sup / modes / text-mode.rb
1 module Redwood
2
3 class TextMode < ScrollMode
4   attr_reader :text
5   register_keymap do |k|
6     k.add :save_to_disk, "Save to disk", 's'
7   end
8
9   def initialize text=""
10     @text = text
11     update_lines
12     buffer.mark_dirty if buffer
13     super()
14   end
15   
16   def save_to_disk
17     fn = BufferManager.ask_for_filename :filename, "Save to file: "
18     save_to_file(fn) { |f| f.puts text } if fn
19   end
20
21   def text= t
22     @text = t
23     update_lines
24     if buffer
25       ensure_mode_validity
26       buffer.mark_dirty 
27     end
28   end
29
30   def << line
31     @lines = [0] if @text.empty?
32     @text << line
33     @lines << @text.length
34     if buffer
35       ensure_mode_validity
36       buffer.mark_dirty 
37     end
38   end
39
40   def lines
41     @lines.length - 1
42   end
43
44   def [] i
45     return nil unless i < @lines.length
46     @text[@lines[i] ... (i + 1 < @lines.length ? @lines[i + 1] - 1 : @text.length)].normalize_whitespace
47 #    (@lines[i] ... (i + 1 < @lines.length ? @lines[i + 1] - 1 : @text.length)).inspect
48   end
49
50 private
51
52   def update_lines
53     pos = @text.find_all_positions("\n")
54     pos.push @text.length unless pos.last == @text.length - 1
55     @lines = [0] + pos.map { |x| x + 1 }
56   end
57 end
58
59 end