5 ## meant to be spawned via spawn_modal!
6 class FileBrowserMode < LineCursorMode
10 k.add :back, "Go back to previous directory", "B"
11 k.add :view, "View file", "v"
12 k.add :select_file_or_follow_directory, "Select the highlighted file, or follow the directory", :enter
13 k.add :reload, "Reload file list", "R"
19 def initialize dir="."
20 @dirs = [Pathname.new(dir).realpath]
24 super :skip_top_rows => RESERVED_ROWS
27 def cwd; @dirs.last end
28 def lines; @text.length; end
29 def [] i; @text[i]; end
34 return if @dirs.size == 1
46 name, f = @files[curpos - RESERVED_ROWS]
47 return unless f && f.file?
50 BufferManager.spawn f.to_s, TextMode.new(f.read)
51 rescue SystemCallError => e
52 BufferManager.flash e.message
56 def select_file_or_follow_directory
57 name, f = @files[curpos - RESERVED_ROWS]
60 if f.directory? && f.to_s != "."
65 BufferManager.flash "Permission denied - #{f.realpath}"
69 @value = f.realpath.to_s
71 rescue SystemCallError => e
72 BufferManager.flash e.message
80 cwd.entries.sort_by do |f|
81 [f.directory? ? 0 : 1, f.basename.to_s]
83 rescue SystemCallError => e
84 BufferManager.flash "Error: #{e.message}"
85 [Pathname.new("."), Pathname.new("..")]
88 name = f.basename.to_s +
92 when real_f.directory?
100 size_width = @files.max_of { |name, f| f.human_size.length }
101 time_width = @files.max_of { |name, f| f.human_time.length }
103 @text = ["#{cwd}:"] + @files.map do |name, f|
104 sprintf "%#{time_width}s %#{size_width}s %s", f.human_time, f.human_size, name