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
45 name, f = @files[curpos - RESERVED_ROWS]
46 return unless f && f.file?
49 BufferManager.spawn f.to_s, TextMode.new(f.readlines.join)
50 rescue SystemCallError => e
51 BufferManager.flash e.message
55 def select_file_or_follow_directory
56 name, f = @files[curpos - RESERVED_ROWS]
59 if f.directory? && f.to_s != "."
64 BufferManager.flash "Permission denied - #{f.realpath}"
68 @value = f.realpath.to_s
70 rescue SystemCallError => e
71 BufferManager.flash e.message
79 cwd.entries.sort_by do |f|
80 [f.directory? ? 0 : 1, f.basename.to_s]
82 rescue SystemCallError => e
83 BufferManager.flash "Error: #{e.message}"
84 [Pathname.new("."), Pathname.new("..")]
87 name = f.basename.to_s +
91 when real_f.directory?
99 size_width = @files.max_of { |name, f| f.human_size.length }
100 time_width = @files.max_of { |name, f| f.human_time.length }
102 @text = ["#{cwd}:"] + @files.map do |name, f|
103 sprintf "%#{time_width}s %#{size_width}s %s", f.human_time, f.human_size, name