From 04ff0a7f1716e3cc8d2a5be347543bed5fda7e3a Mon Sep 17 00:00:00 2001 From: hut Date: Sun, 21 Jun 2009 17:56:29 +0200 Subject: mv code/fm/* code/ --- code/draw.rb | 329 +++++++++++++++++++++++++++++++ code/fm.rb | 283 +++++++++++++++++++++++++++ code/fm/draw.rb | 329 ------------------------------- code/fm/fm.rb | 283 --------------------------- code/fm/keys.rb | 584 -------------------------------------------------------- code/keys.rb | 584 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 1196 insertions(+), 1196 deletions(-) create mode 100644 code/draw.rb create mode 100644 code/fm.rb delete mode 100644 code/fm/draw.rb delete mode 100644 code/fm/fm.rb delete mode 100644 code/fm/keys.rb create mode 100644 code/keys.rb diff --git a/code/draw.rb b/code/draw.rb new file mode 100644 index 00000000..45c654a8 --- /dev/null +++ b/code/draw.rb @@ -0,0 +1,329 @@ +require 'socket' + +module Fm + DONT_PREVIEW_THESE_FILES = /\.(avi|[mj]pe?g|iso|mp\d|og[gmv]|wm[av]|mkv|torrent|so|class|flv|png|bmp|vob|divx?)$/i + + def column_put_file(n, file) + i = 0 + if OPTIONS['filepreview'] and file.path !~ DONT_PREVIEW_THESE_FILES + m = lines - 2 + attr_set(Color.base) + left, wid = get_boundaries(n) + if false and file.ext =~ /(?:rar|zip|7z|tar|gz)$/ and file.size < 10485760 + text = `aunpack -l #{file.sh} 2>> /dev/null` + text.each_line do |l| + puti i+1, left, l[0, wid-1].ljust(wid) + i += 1 + break if i == m + end + else + File.open(file.path, 'r') do |f| + check = true + left, wid = get_boundaries(n) + f.lines.each do |l| + if check + check = false + break unless l.each_char.all? {|x| x[0] > 0 and x[0] < 128} + end + puti i+1, left, l.gsub("\t"," ")[0, wid-1].ljust(wid) + i += 1 + break if i == m + end + end + end + end + column_clear(n, i) + end + + def put_directory(c, d) + l = 1 + return column_clear(c, 0) unless d + + infos = (c == COLUMNS - 2) + left, wid = get_boundaries(c) + right = left + wid + + if not d.read? + if (c == COLUMNS - 1) and @entering_directory +# puti l, left, "reading...".ljust(wid+1) + puti l, left, " " * (wid+1) + column_clear(c, 1) + @entering_directory = false + end + Scheduler << d + return + elsif d.read? and d.empty? + puti l, left, 'empty'.ljust(wid+1) + column_clear(c, 1) + return + end + + + offset = get_offset(d, lines) + (lines - 1).times do |l| + lpo = l + offset + l += 1 + + break if (f = d.files[lpo]) == nil + + mycolor = if lpo == d.pos + if infos + Color.selected_current_row + else + Color.selected + end + elsif f.marked? + Color.marked + else + Color.normal + end + + dir = false + + clrname = if f.symlink? + dir = f.dir? + if f.broken_symlink? + :badlink + else + :goodlink + end + elsif f.dir? + dir = true + :directory + elsif f.movie? + :video + elsif f.audio? + :sound + elsif f.image? + :image + elsif f.executable? + :executable + else + :file + end + + fn = f.basename + fn = "* #{fn}" if f.marked? + + + if infos + myinfo = " #{f.infostring} " + sz = myinfo.size + str = fn[0, wid-1].ljust(wid+1) + if str.size > sz + str[-sz..-1] = myinfo + yes = true + else + yes = false + end + puti l, left, str + attr_at(l, right-sz, sz, Color.normal.send(clrname)) + else + puti l, left, fn[0, wid-1].ljust(wid+1) + end + + attr_at(l, left, fn.size.limit(wid-1), mycolor.send(clrname)) + end + + column_clear(c, l-1) + end + + def self.column_clear(n, from=0) + attr_set(Color.base) + left, wid = get_boundaries(n) + (from -1).upto(lines) do |l| + puti l+2, left, ' ' * (wid+1) + end + end + + def self.get_offset(dir, max) + pos = dir.pos + len = dir.files.size + max -= 2 + if len <= max or pos < max/2 + return 0 + elsif pos >= (len - max/2) + return len - max + else + return pos - max/2 + end + end + + def self.get_boundaries(column) + cols = CLI.cols # to cache + case column + when 0 + return 0, cols / 8 + + when 1 + q = cols / 8 + return q, q + + when 2 + q = cols / 4 + w = @path.last.width.limit(cols/2, cols/8) + return q, w + + when 3 + l = cols / 4 + 1 + l += @path.last.width.limit(cols/2, cols/8) + + return l, cols - l + end + end + + def self.draw + attr_set(Color.base) + + @cur_y = get_boundaries(COLUMNS-2)[0] + + if @buffer =~ /^block/ + screensaver + elsif @buffer == '?' + cleari + puti 0, " - - - Help - - -" + puti 2, " h/j/k/l: Movement J/K: fast Movement" + puti 3, " H: Descend directory with respect to symlinks" + puti 4, " L: Wait for after execution of a program" + puti 6, " t: Toggle Option S: Change Sorting" + puti 7, " E: Edit file s: Enter Shell" + puti 8, " rmdir: Remove whole dir dD: Delete file or empty dir" + puti 9, " dd: Move file to ~/.trash and memorize it's new path" + puti 10," yy: Memorize path p: Copy memorized file here" + puti 11," mv: move file to place mkdir: obvious" + puti 12," mX: Bookmark dir 'X: Enter bookmarked dir" + puti 13," '': Enter last visited dir (note: ' and ` are equal)" + puti 13," ! executes command" + puti 15," To interrupt current operations: " + puti 16," To quit: q / ZZ / / (twice in a row)" + puti 18," Press one of those keys for more information: g f" + elsif @buffer == '?f' + cleari + puti 0, " - - - Help - - -" + puti 2, " f or / searches for pattern and presses l" + puti 3, " when a matching file is found." + puti 4, " Pressing L in this mode is like pressing l outside" + puti 6, " F like f but stay in this mode until is pressed" + elsif @buffer == '?g' + cleari + puti 0, " - - - Help - - -" + puti 2, " gg: go to top" + puti 3, " G: go to bottom" + puti 4, " g0: go to /" + puti 5, " gu: go to /usr/" + puti 6, " gm: go to /media/" + puti 7, " ge: go to /etc/" + puti 8, " gh: go to ~/" + puti 9, " gt: go to ~/.trash/" + else + @pwd.recheck_stuff() + cf = currentfile + + if cf and s0 = cf.mimetype + puti 0, cols-s0.size, s0 + end + + s1 = "" + s1 << Socket.gethostname + s1 << ":" + s2 = "#{@path.last.path}#{"/" unless @path.size == 1}" + s3 = "#{cf ? cf.basename : ''}" + + if s0 + puti 0, (s1 + s2 + s3).ljust(cols-s0.size) + else + puti 0, (s1 + s2 + s3).ljust(cols) + end + + bg = -1 + attr_at(0, 0, s1.size, *Color.hostname) + attr_at(0, s1.size, s2.size, *Color.currentdir) + attr_at(0, s1.size + s2.size, s3.size, *Color.currentfile) +# color_at 0, 0, -1, 7, bg +# color_at 0, 0, s1.size, 7, bg +# color_at 0, s1.size, s2.size, 6, bg +# color_at 0, s1.size + s2.size, s3.size, 5, bg + +# bold false + + begin + if cf.dir? + put_directory(3, @dirs[cf.path]) + elsif cf.file? + column_put_file(3, cf) + else + column_clear(3) + end + rescue + column_clear(3) + end + + pos_constant = @path.size - COLUMNS + 1 + + (COLUMNS - 1).times do |c| + pos = pos_constant + c + + if pos >= 0 + put_directory(c, @path[pos]) + else + column_clear(c) + end + end + + attr_set(Color.base) + btm = lines - 1 + + case @buffer + when 'S' + puti btm, "Sort by (n)ame (s)ize (m)time (c)time (CAPITAL:reversed)" + when 't' + puti btm, "Toggle (h)idden_files (d)irs_first (c)olor (f)ilepreview" + else +# log(@pwd) +# log "Buffer: #{@buffer}" + attr_set(Color.base) + attr_set(Color.info) + puti btm, "#@buffer #{@pwd.file_size.bytes(false)}, #{@pwd.free_space.bytes(false)} free, #{@pwd.size}, #{@pwd.pos+1} ".rjust(cols) + more = '' + if cf.symlink? + more = "#{cf.readlink}" + end + + attr_set(Color.date) + left = " #{Time.now.strftime("%H:%M:%S %a %b %d")} " + puti btm, left + + attr_set(cf.writable? ? Color.allowed : Color.denied) + second = "#{cf.rights} " + puti btm, left.size, second + if more + attr_set(cf.exists? ? Color.allowed : Color.denied) + puti btm, left.size + second.size, "#{more} " + end + end + + attr_set(Color.base) + draw_bars unless @bars.empty? + + movi(@pwd.pos + 1 - get_offset(@pwd, lines), @cur_y) + end + CLI.refresh + end + + def self.draw_bars() + @bars.each_with_index do |bar, ix| + bar.update + + l = -ix - 1 + puti l, bar.text[0..cols-1].ljust(cols) + done = bar.done + c = (done * cols).to_i + unless done == 0 +# color_at l, 0, c, 0, 4 + end + unless done == cols +# color_at l, c, -1, 0, 6 + end + end + end +end diff --git a/code/fm.rb b/code/fm.rb new file mode 100644 index 00000000..b5ef5c1a --- /dev/null +++ b/code/fm.rb @@ -0,0 +1,283 @@ +require 'thread' + +OPTIONS = { + 'hidden' => false, + 'sort' => :name, + 'dir_first' => true, + 'sort_reverse' => false, + 'color' => true, + 'filepreview' => true, +} + +module Fm + extend self + COPY_PRIORITY = -2 + + COLUMNS = 4 + VI = "vi -c 'map h :quit' -c 'map q :quit'" << + " -c 'map H :unmap h:unmap H' %s" + + def self.initialize(pwd=nil) + @bars = [] + @bars_thread = nil + + @entering_directory = true + + @buffer = '' + @pwd = nil + @search_string = '' + @copy = [] + @ignore_until = nil + @trash = File.expand_path('~/.trash') + pwd ||= Dir.getwd + + # `' and `` are the original PWD unless overwritten by .rangerrc + @memory = { + '`' => pwd, + '\'' => pwd + } + + # Read the .rangerrc + @rangerrc = File.expand_path('~/.rangerrc') + if (File.exists?(@rangerrc)) + content = File.read(@rangerrc) + unless content.empty? + loaded = Marshal.load(content) rescue nil + if Hash === loaded + @memory.update(loaded) + end + end + end + @dump_config_on_exit = true + + # `0 is always the original PWD + @memory['0'] = pwd + + boot_up(pwd) + end + + attr_reader(:dirs, :pwd) + + def pwd() @pwd end + + def refresh() + begin + @pwd.refresh + draw + rescue + end + end + + def boot_up(pwd=nil) + pwd ||= @pwd.path || Dir.getwd + Scheduler.reset + + @dirs = Hash.new() do |hash, key| + hash[key] = newdir = Directory.new(key) +# newdir.schedule + newdir + end + + @path = [@dirs['/']] + enter_dir(pwd) + + Scheduler.run + end + + def lines + CLI::lines - @bars.size + end + + def dump + if defined? @dump_config_on_exit + begin + remember_dir + dumped = Marshal.dump(@memory) + File.open(@rangerrc, 'w') do |f| + f.write(dumped) + end + rescue Exception + end + end + end + + def on_interrupt + @buffer = '' + sleep 0.2 + end + + def terminal_killed? +# `ps ho tname --pid #{Process.pid}`.strip == '?' + Process.ppid == 1 + end + + def main_loop + bool = false + while true + exit if terminal_killed? + if @pwd.size == 0 or @pwd.pos < 0 + @pwd.pos = 0 + elsif @pwd.pos >= @pwd.size - 1 + @pwd.pos = @pwd.size - 1 + end + + begin + draw() + rescue Interrupt + on_interrupt + rescue Exception + log($!) + log(caller) + end + + begin + key = geti + press(key) + rescue Interrupt + on_interrupt + end + end + end + + def current_path() @pwd.path end + + def reset_title() set_title("ranger: #{@pwd.path}") end + + def enter_dir_safely(dir) + dir = File.expand_path(dir) + if File.exists?(dir) and File.directory?(dir) + olddir = @pwd.path + begin + enter_dir(dir) + return true + rescue + log("NIGGER" * 100) + log($!) + log(caller) + enter_dir(olddir) + return false + end + end + end + + def enter_dir(dir) + @pwd.restore if @pwd + @marked = [] + dir = File.expand_path(dir) + + oldpath = @path.dup + + # NOTE: @dirs[unknown] is not nil but Directory.new(unknown) + @path = [@dirs['/']] + unless dir == '/' + dir.slice(0) + accumulated = '/' + for part in dir.split('/') + unless part.empty? + accumulated = File.join(accumulated, part) + @path << @dirs[accumulated] + end + end + end + + @pwd = @path.last + @pwd.pos = @pwd.pos + + @pwd.files_raw.dup.each do |x| + @dirs[x] if File.directory?(x) + end + + reset_title() + + if @path.size < oldpath.size + @pwd.pos = @pwd.files_raw.index(oldpath.last.path) || 0 + end + + i = 0 + + @path.each_with_index do |p, i| + p.schedule + unless i == @path.size - 1 + p.pointed_file = @path[i+1].path + end + end + + @entering_directory = true + Dir.chdir(@pwd.path) + end + + def currentfile() @pwd.files[@pwd.pos] end + def selection() + if @marked.empty? + [currentfile] + else + @marked.dup + end + end + + def move_to_trash!(fn) + unless File.exists?(@trash) + Dir.mkdir(@trash) + end + new_path = File.join(@trash, fn.basename) + + Action.move(fn, new_path) + + return new_path + end + + def move_to_trash(file) + unless file + return + end + + if String === file + file = Directory::Entry.new(file) + end + + if file.exists? + if file.dir? + if !file.in?(@trash) and file.size > 0 + return move_to_trash!(file) + else + Dir.rmdir(file.path) rescue nil + end + elsif file.symlink? + file.delete! + else + if !file.in?(@trash) and file.size > 0 + return move_to_trash!(file) + else + file.delete! + end + end + end + return nil + end + + def bar_add(bar) + if @bars.empty? + # This thread updates the statusbars + @bars_thread = Thread.new do + while true + draw_bars + sleep 0.5 + end + end + end + @bars << bar + end + + def bar_del(bar) + @bars.delete(bar) + if @bars.empty? + @bars_thread.kill + @bars_thread = nil + end + end + + def getfiles() + @marked.empty? ? [currentfile] : @marked + end +end + diff --git a/code/fm/draw.rb b/code/fm/draw.rb deleted file mode 100644 index 45c654a8..00000000 --- a/code/fm/draw.rb +++ /dev/null @@ -1,329 +0,0 @@ -require 'socket' - -module Fm - DONT_PREVIEW_THESE_FILES = /\.(avi|[mj]pe?g|iso|mp\d|og[gmv]|wm[av]|mkv|torrent|so|class|flv|png|bmp|vob|divx?)$/i - - def column_put_file(n, file) - i = 0 - if OPTIONS['filepreview'] and file.path !~ DONT_PREVIEW_THESE_FILES - m = lines - 2 - attr_set(Color.base) - left, wid = get_boundaries(n) - if false and file.ext =~ /(?:rar|zip|7z|tar|gz)$/ and file.size < 10485760 - text = `aunpack -l #{file.sh} 2>> /dev/null` - text.each_line do |l| - puti i+1, left, l[0, wid-1].ljust(wid) - i += 1 - break if i == m - end - else - File.open(file.path, 'r') do |f| - check = true - left, wid = get_boundaries(n) - f.lines.each do |l| - if check - check = false - break unless l.each_char.all? {|x| x[0] > 0 and x[0] < 128} - end - puti i+1, left, l.gsub("\t"," ")[0, wid-1].ljust(wid) - i += 1 - break if i == m - end - end - end - end - column_clear(n, i) - end - - def put_directory(c, d) - l = 1 - return column_clear(c, 0) unless d - - infos = (c == COLUMNS - 2) - left, wid = get_boundaries(c) - right = left + wid - - if not d.read? - if (c == COLUMNS - 1) and @entering_directory -# puti l, left, "reading...".ljust(wid+1) - puti l, left, " " * (wid+1) - column_clear(c, 1) - @entering_directory = false - end - Scheduler << d - return - elsif d.read? and d.empty? - puti l, left, 'empty'.ljust(wid+1) - column_clear(c, 1) - return - end - - - offset = get_offset(d, lines) - (lines - 1).times do |l| - lpo = l + offset - l += 1 - - break if (f = d.files[lpo]) == nil - - mycolor = if lpo == d.pos - if infos - Color.selected_current_row - else - Color.selected - end - elsif f.marked? - Color.marked - else - Color.normal - end - - dir = false - - clrname = if f.symlink? - dir = f.dir? - if f.broken_symlink? - :badlink - else - :goodlink - end - elsif f.dir? - dir = true - :directory - elsif f.movie? - :video - elsif f.audio? - :sound - elsif f.image? - :image - elsif f.executable? - :executable - else - :file - end - - fn = f.basename - fn = "* #{fn}" if f.marked? - - - if infos - myinfo = " #{f.infostring} " - sz = myinfo.size - str = fn[0, wid-1].ljust(wid+1) - if str.size > sz - str[-sz..-1] = myinfo - yes = true - else - yes = false - end - puti l, left, str - attr_at(l, right-sz, sz, Color.normal.send(clrname)) - else - puti l, left, fn[0, wid-1].ljust(wid+1) - end - - attr_at(l, left, fn.size.limit(wid-1), mycolor.send(clrname)) - end - - column_clear(c, l-1) - end - - def self.column_clear(n, from=0) - attr_set(Color.base) - left, wid = get_boundaries(n) - (from -1).upto(lines) do |l| - puti l+2, left, ' ' * (wid+1) - end - end - - def self.get_offset(dir, max) - pos = dir.pos - len = dir.files.size - max -= 2 - if len <= max or pos < max/2 - return 0 - elsif pos >= (len - max/2) - return len - max - else - return pos - max/2 - end - end - - def self.get_boundaries(column) - cols = CLI.cols # to cache - case column - when 0 - return 0, cols / 8 - - when 1 - q = cols / 8 - return q, q - - when 2 - q = cols / 4 - w = @path.last.width.limit(cols/2, cols/8) - return q, w - - when 3 - l = cols / 4 + 1 - l += @path.last.width.limit(cols/2, cols/8) - - return l, cols - l - end - end - - def self.draw - attr_set(Color.base) - - @cur_y = get_boundaries(COLUMNS-2)[0] - - if @buffer =~ /^block/ - screensaver - elsif @buffer == '?' - cleari - puti 0, " - - - Help - - -" - puti 2, " h/j/k/l: Movement J/K: fast Movement" - puti 3, " H: Descend directory with respect to symlinks" - puti 4, " L: Wait for after execution of a program" - puti 6, " t: Toggle Option S: Change Sorting" - puti 7, " E: Edit file s: Enter Shell" - puti 8, " rmdir: Remove whole dir dD: Delete file or empty dir" - puti 9, " dd: Move file to ~/.trash and memorize it's new path" - puti 10," yy: Memorize path p: Copy memorized file here" - puti 11," mv: move file to place mkdir: obvious" - puti 12," mX: Bookmark dir 'X: Enter bookmarked dir" - puti 13," '': Enter last visited dir (note: ' and ` are equal)" - puti 13," ! executes command" - puti 15," To interrupt current operations: " - puti 16," To quit: q / ZZ / / (twice in a row)" - puti 18," Press one of those keys for more information: g f" - elsif @buffer == '?f' - cleari - puti 0, " - - - Help - - -" - puti 2, " f or / searches for pattern and presses l" - puti 3, " when a matching file is found." - puti 4, " Pressing L in this mode is like pressing l outside" - puti 6, " F like f but stay in this mode until is pressed" - elsif @buffer == '?g' - cleari - puti 0, " - - - Help - - -" - puti 2, " gg: go to top" - puti 3, " G: go to bottom" - puti 4, " g0: go to /" - puti 5, " gu: go to /usr/" - puti 6, " gm: go to /media/" - puti 7, " ge: go to /etc/" - puti 8, " gh: go to ~/" - puti 9, " gt: go to ~/.trash/" - else - @pwd.recheck_stuff() - cf = currentfile - - if cf and s0 = cf.mimetype - puti 0, cols-s0.size, s0 - end - - s1 = "" - s1 << Socket.gethostname - s1 << ":" - s2 = "#{@path.last.path}#{"/" unless @path.size == 1}" - s3 = "#{cf ? cf.basename : ''}" - - if s0 - puti 0, (s1 + s2 + s3).ljust(cols-s0.size) - else - puti 0, (s1 + s2 + s3).ljust(cols) - end - - bg = -1 - attr_at(0, 0, s1.size, *Color.hostname) - attr_at(0, s1.size, s2.size, *Color.currentdir) - attr_at(0, s1.size + s2.size, s3.size, *Color.currentfile) -# color_at 0, 0, -1, 7, bg -# color_at 0, 0, s1.size, 7, bg -# color_at 0, s1.size, s2.size, 6, bg -# color_at 0, s1.size + s2.size, s3.size, 5, bg - -# bold false - - begin - if cf.dir? - put_directory(3, @dirs[cf.path]) - elsif cf.file? - column_put_file(3, cf) - else - column_clear(3) - end - rescue - column_clear(3) - end - - pos_constant = @path.size - COLUMNS + 1 - - (COLUMNS - 1).times do |c| - pos = pos_constant + c - - if pos >= 0 - put_directory(c, @path[pos]) - else - column_clear(c) - end - end - - attr_set(Color.base) - btm = lines - 1 - - case @buffer - when 'S' - puti btm, "Sort by (n)ame (s)ize (m)time (c)time (CAPITAL:reversed)" - when 't' - puti btm, "Toggle (h)idden_files (d)irs_first (c)olor (f)ilepreview" - else -# log(@pwd) -# log "Buffer: #{@buffer}" - attr_set(Color.base) - attr_set(Color.info) - puti btm, "#@buffer #{@pwd.file_size.bytes(false)}, #{@pwd.free_space.bytes(false)} free, #{@pwd.size}, #{@pwd.pos+1} ".rjust(cols) - more = '' - if cf.symlink? - more = "#{cf.readlink}" - end - - attr_set(Color.date) - left = " #{Time.now.strftime("%H:%M:%S %a %b %d")} " - puti btm, left - - attr_set(cf.writable? ? Color.allowed : Color.denied) - second = "#{cf.rights} " - puti btm, left.size, second - if more - attr_set(cf.exists? ? Color.allowed : Color.denied) - puti btm, left.size + second.size, "#{more} " - end - end - - attr_set(Color.base) - draw_bars unless @bars.empty? - - movi(@pwd.pos + 1 - get_offset(@pwd, lines), @cur_y) - end - CLI.refresh - end - - def self.draw_bars() - @bars.each_with_index do |bar, ix| - bar.update - - l = -ix - 1 - puti l, bar.text[0..cols-1].ljust(cols) - done = bar.done - c = (done * cols).to_i - unless done == 0 -# color_at l, 0, c, 0, 4 - end - unless done == cols -# color_at l, c, -1, 0, 6 - end - end - end -end diff --git a/code/fm/fm.rb b/code/fm/fm.rb deleted file mode 100644 index b5ef5c1a..00000000 --- a/code/fm/fm.rb +++ /dev/null @@ -1,283 +0,0 @@ -require 'thread' - -OPTIONS = { - 'hidden' => false, - 'sort' => :name, - 'dir_first' => true, - 'sort_reverse' => false, - 'color' => true, - 'filepreview' => true, -} - -module Fm - extend self - COPY_PRIORITY = -2 - - COLUMNS = 4 - VI = "vi -c 'map h :quit' -c 'map q :quit'" << - " -c 'map H :unmap h:unmap H' %s" - - def self.initialize(pwd=nil) - @bars = [] - @bars_thread = nil - - @entering_directory = true - - @buffer = '' - @pwd = nil - @search_string = '' - @copy = [] - @ignore_until = nil - @trash = File.expand_path('~/.trash') - pwd ||= Dir.getwd - - # `' and `` are the original PWD unless overwritten by .rangerrc - @memory = { - '`' => pwd, - '\'' => pwd - } - - # Read the .rangerrc - @rangerrc = File.expand_path('~/.rangerrc') - if (File.exists?(@rangerrc)) - content = File.read(@rangerrc) - unless content.empty? - loaded = Marshal.load(content) rescue nil - if Hash === loaded - @memory.update(loaded) - end - end - end - @dump_config_on_exit = true - - # `0 is always the original PWD - @memory['0'] = pwd - - boot_up(pwd) - end - - attr_reader(:dirs, :pwd) - - def pwd() @pwd end - - def refresh() - begin - @pwd.refresh - draw - rescue - end - end - - def boot_up(pwd=nil) - pwd ||= @pwd.path || Dir.getwd - Scheduler.reset - - @dirs = Hash.new() do |hash, key| - hash[key] = newdir = Directory.new(key) -# newdir.schedule - newdir - end - - @path = [@dirs['/']] - enter_dir(pwd) - - Scheduler.run - end - - def lines - CLI::lines - @bars.size - end - - def dump - if defined? @dump_config_on_exit - begin - remember_dir - dumped = Marshal.dump(@memory) - File.open(@rangerrc, 'w') do |f| - f.write(dumped) - end - rescue Exception - end - end - end - - def on_interrupt - @buffer = '' - sleep 0.2 - end - - def terminal_killed? -# `ps ho tname --pid #{Process.pid}`.strip == '?' - Process.ppid == 1 - end - - def main_loop - bool = false - while true - exit if terminal_killed? - if @pwd.size == 0 or @pwd.pos < 0 - @pwd.pos = 0 - elsif @pwd.pos >= @pwd.size - 1 - @pwd.pos = @pwd.size - 1 - end - - begin - draw() - rescue Interrupt - on_interrupt - rescue Exception - log($!) - log(caller) - end - - begin - key = geti - press(key) - rescue Interrupt - on_interrupt - end - end - end - - def current_path() @pwd.path end - - def reset_title() set_title("ranger: #{@pwd.path}") end - - def enter_dir_safely(dir) - dir = File.expand_path(dir) - if File.exists?(dir) and File.directory?(dir) - olddir = @pwd.path - begin - enter_dir(dir) - return true - rescue - log("NIGGER" * 100) - log($!) - log(caller) - enter_dir(olddir) - return false - end - end - end - - def enter_dir(dir) - @pwd.restore if @pwd - @marked = [] - dir = File.expand_path(dir) - - oldpath = @path.dup - - # NOTE: @dirs[unknown] is not nil but Directory.new(unknown) - @path = [@dirs['/']] - unless dir == '/' - dir.slice(0) - accumulated = '/' - for part in dir.split('/') - unless part.empty? - accumulated = File.join(accumulated, part) - @path << @dirs[accumulated] - end - end - end - - @pwd = @path.last - @pwd.pos = @pwd.pos - - @pwd.files_raw.dup.each do |x| - @dirs[x] if File.directory?(x) - end - - reset_title() - - if @path.size < oldpath.size - @pwd.pos = @pwd.files_raw.index(oldpath.last.path) || 0 - end - - i = 0 - - @path.each_with_index do |p, i| - p.schedule - unless i == @path.size - 1 - p.pointed_file = @path[i+1].path - end - end - - @entering_directory = true - Dir.chdir(@pwd.path) - end - - def currentfile() @pwd.files[@pwd.pos] end - def selection() - if @marked.empty? - [currentfile] - else - @marked.dup - end - end - - def move_to_trash!(fn) - unless File.exists?(@trash) - Dir.mkdir(@trash) - end - new_path = File.join(@trash, fn.basename) - - Action.move(fn, new_path) - - return new_path - end - - def move_to_trash(file) - unless file - return - end - - if String === file - file = Directory::Entry.new(file) - end - - if file.exists? - if file.dir? - if !file.in?(@trash) and file.size > 0 - return move_to_trash!(file) - else - Dir.rmdir(file.path) rescue nil - end - elsif file.symlink? - file.delete! - else - if !file.in?(@trash) and file.size > 0 - return move_to_trash!(file) - else - file.delete! - end - end - end - return nil - end - - def bar_add(bar) - if @bars.empty? - # This thread updates the statusbars - @bars_thread = Thread.new do - while true - draw_bars - sleep 0.5 - end - end - end - @bars << bar - end - - def bar_del(bar) - @bars.delete(bar) - if @bars.empty? - @bars_thread.kill - @bars_thread = nil - end - end - - def getfiles() - @marked.empty? ? [currentfile] : @marked - end -end - diff --git a/code/fm/keys.rb b/code/fm/keys.rb deleted file mode 100644 index 1b1d4fd6..00000000 --- a/code/fm/keys.rb +++ /dev/null @@ -1,584 +0,0 @@ -module Fm - # ALL combinations of multiple keys (but without the last letter) - # or regexps which match combinations need to be in here! - COMBS = %w( - g d df y c Z delet cu - ter ta S ? ?g ?f :q - - /[m`']/ /[fF/!].*/ - /[ri]\d*\w*[^ri]/ - /(cw|cd|mv).*/ - /b(l(o(c(k(.*)?)?)?)?)?/ - /m(k(d(i(r(.*)?)?)?)?)?/ - /r(e(n(a(m(e(.*)?)?)?)?)?)?/ - ) - - # Create a regular expression which detects these combos - ary = [] - for token in COMBS - if token =~ /^\/(.*)\/$/ - ary << $1 - elsif token.size > 0 - ary << token.each_char.map {|t| - if t == '?' - t = '\?' - end - - "(?:#{t}" - }.join + - (')?' * (token.size - 1)) + ')' - end - end - REGX = Regexp.new('^(?:' + ary.uniq.join('|') + ')$') - - def self.ignore_keys_for(t) - @ignore_until = Time.now + t - end - - def self.search(str, offset=0, backwards=false) - begin - rx = Regexp.new(str, Regexp::IGNORECASE) - rescue - return false - end - - ary = @pwd.files_raw.dup - ary.wrap(@pwd.pos + offset) - - ary.reverse! if backwards - - for f in ary - g = File.basename(f) - if g =~ rx - @pwd.pointed_file = f - break - end - end - end - - def self.find_newest() - newest = nil - for f in @pwd.files - if newest.nil? or newest.ctime < f.ctime - newest = f - end - end - @pwd.pointed_file = newest.path - end - - def self.hints(str) - begin - rx = Regexp.new(str, Regexp::IGNORECASE) - rescue - return false - end - - ary = @pwd.files_raw.dup - ary.wrap(@pwd.pos) - - n = 0 - pointed = false - for f in ary - g = File.basename(f) - if g =~ rx - unless pointed - log "point at #{f}" - @pwd.pointed_file = f - pointed = true - end - n += 1 - end - end - - return n - end - - def self.remember_dir - @memory["`"] = @memory["'"] = @pwd.path - end - - def self.press(key) - return if @ignore_until and Time.now < @ignore_until - - @ignore_until = nil - - if key == '' - if @buffer.empty? - @buffer = key - elsif @buffer == 'F' - descend - elsif @buffer[-1] == ?> - @buffer.slice!(/(<.*)?>$/) - else - @buffer.slice!(-1) - end - elsif key == '' - @buffer = '' - else - @buffer << key - end - - case @buffer - when '' - closei - starti - - when 'j', '' - @pwd.pos += 1 - - when 's' - closei - system('clear') - ls = ['ls'] - ls << '--color=auto' if OPTIONS['color'] - ls << '--group-directories-first' if OPTIONS['color'] - system(*ls) - system('bash') - @pwd.schedule - starti - - - when /^S(.)$/ - OPTIONS['sort_reverse'] = $1.ord.between?(65, 90) - - case $1 - when 'n' - OPTIONS['sort'] = :name - when 'e' - OPTIONS['sort'] = :ext - when 't' - OPTIONS['sort'] = :type - when 's' - OPTIONS['sort'] = :size - when 'm' - OPTIONS['sort'] = :mtime - when 'c' - OPTIONS['sort'] = :ctime - end - @pwd.schedule - - when 'tar' - closei - system('tar', 'cvvf', 'pack.tar', *selection.map{|x| x.basename}) - @pwd.refresh! - starti - - when 'R' - @pwd.refresh! - - when 'a' - Process.kill('INT', Process.pid) -# Process.kill('INT', Process.pid) - - when 'x' - @bars.first.kill unless @bars.empty? - - when 'X' -# @bars.last.kill unless @bars.empty? - - closei - exec(ENV['SHELL']) - exit - - when 'J' - @pwd.pos += lines/2 - - when 'K' - @pwd.pos -= lines/2 - - when 'cp', 'yy' - @copy = selection - @cut = false - - when 'cut' - @copy = selection - @cut = true - - when 'n' - if @search_string.empty? - find_newest - else - search(@search_string, 1) - end - - when 'N' - search(@search_string, 0, true) - -# when 'fh' -# @buffer.clear -# press('h') - - when /^F(.+)$/ - str = $1 - if str =~ /^\s?(.*)(|)$/ - if $2 == '' - Directory.filter = $1 - @pwd.refresh! - end - @buffer.clear -# else -# test = hints(str) -# if test == 1 -# if ascend -# @buffer.clear -# else -# @buffer = 'F' -# end -# ignore_keys_for 0.5 -# elsif test == 0 -# @buffer = 'F' -# ignore_keys_for 1 -# end - end - -# when /^F(.+)$/ -# str = $1 -# if str =~ /^\s?(.*)(|)$/ -# if $2 == '' -# ascend -# @buffer = 'F' -# else -# @buffer.clear -# @search_string = $1 -# end -# else -# test = hints(str) -# if test == 1 -# if ascend -# @buffer.clear -# else -# @buffer = 'F' -# end -# ignore_keys_for 0.5 -# elsif test == 0 -# @buffer = 'F' -# ignore_keys_for 1 -# end -# end - - when 'A' - @buffer = "cw #{currentfile.name}" - - when /^f(.+)$/ - str = $1 - if str =~ /^\s?(.*)(L|;||)$/ - @buffer = '' - @search_string = $1 - press('l') if $2 == ';' or $2 == 'L' - else - test = hints(str) - if test == 1 - @buffer = '' - press('l') - ignore_keys_for 0.5 - elsif test == 0 - @buffer = '' - ignore_keys_for 1 - end - end - - when /^\/(.+)$/ - str = $1 - if str =~ /^\s?(.*)(L|;||)$/ - @buffer = '' - @search_string = $1 - press('l') if $2 == ';' or $2 == 'L' - else - search(str) - end - - when /^mkdir(.*)$/ - str = $1 - if str =~ /^\s?(.*)(|)$/ - @buffer = '' - if $2 == '' - closei - system('mkdir', $1) - starti - @pwd.schedule - end - end - - when /^block.*stop$/ - @buffer = '' - - when /^!(.+)$/ - str = $1 - if str =~ /^(\!?)(.*)(|)$/ - @buffer = '' - if $3 == '' - closei - system("bash", "-c", $2) - Action.wait_for_enter unless $1.empty? - starti - @pwd.schedule - end - end - - when /^cd(.+)$/ - str = $1 - if str =~ /^\s?(.*)(|)$/ - @buffer = '' - if $2 == '' - remember_dir - enter_dir_safely($1) - end - end - - when /^(mv|cw|rename)(.+)$/ - str = $2 - if $1 == 'mv' - if str =~ /['`"]([\w\d])/ - if path = @memory[$1] - str = '' - @buffer.clear - if File.exists?(path) and File.directory?(path) - Action.move(selection, path) - end - end - end - end - log str - if str =~ /^\s?(.*)(|)$/ - @buffer = '' - if $2 == '' - files = selection - if files.size == 1 - fn = $1 - log "!!! #{fn}" - unless fn.include? '.' - if ext = files.first.basename.from_last('.') - fn << ".#{ext}" - end - log "??? #{ext}" - end - Action.move(files, fn) - @pwd.refresh! - @pwd.find_file(fn) - else - Action.move(files, $1) - @pwd.refresh! - end - end - end - - when 'tc' - OPTIONS['color'] ^= true - - when 'tf' - OPTIONS['filepreview'] ^= true - - when 'th' - OPTIONS['hidden'] ^= true - @pwd.refresh! - - when 'td' - OPTIONS['dir_first'] ^= true - @pwd.schedule - - when 'delete' - files = selection - @marked = [] - for f in files - if f and f.exists? and f.dir? - system('rm', '-r', f.to_s) - @pwd.schedule - end - end - - when 'p' - if @cut - Action.move(@copy, @pwd.path) - @cut = false - else - Action.copy(@copy, @pwd.path) - end - @pwd.refresh! - if @copy.size == 1 - @pwd.find_file(@copy[0].basename) - end - - when 'P' - for f in @copy - File.symlink(f.path, File.expand_path(f.basename)) - end - - - when /^[`'](.)$/ - if dir = @memory[$1] and not @pwd.path == dir - remember_dir - enter_dir_safely(dir) - end - - when '' - if dir = @memory['`'] and not @pwd.path == dir - remember_dir - enter_dir_safely(dir) - end - - when '' - if dir = @memory['9'] and dir != '/' - unless @pwd.path == dir - enter_dir_safely(dir) - end - elsif dir = @memory['`'] and not @pwd.path == dir - remember_dir - enter_dir_safely(dir) - end - - - when /^m(.)$/ - @memory[$1] = @pwd.path - - when ' ' - if currentfile.marked - @marked.delete(currentfile) - currentfile.marked = false - else - @marked << currentfile - currentfile.marked = true - end - - @pwd.pos += 1 - - when 'v' - @marked = [] - for file in @pwd.files - if file.marked - file.marked = false - else - file.marked = true - @marked << file - end - end - - when 'V' - for file in @marked - file.marked = false - end - @marked = [] - - - when 'gg' - @pwd.pos = 0 - - when 'dd' - new_path = move_to_trash(currentfile) - if new_path - new_path = Directory::Entry.new(new_path) - new_path.get_data - @copy = [new_path] - @cut = false - end - @pwd.schedule - - when 'dD', 'dfd' - cf = currentfile - if cf and cf.exists? - cf.delete! - @pwd.schedule - end - - when 'term' - fork do exec 'x-terminal-emulator' end - - when 'g0' - remember_dir - enter_dir('/') - - when 'gh' - remember_dir - enter_dir('~') - - when 'gu' - remember_dir - enter_dir('/usr') - - when 'ge' - remember_dir - enter_dir('/etc') - - when 'gm' - remember_dir - enter_dir('/media') - - when 'gt' - remember_dir - enter_dir('~/.trash') - - when 'gs' - remember_dir - enter_dir('/srv') - - when 'G' - @pwd.pos = @pwd.size - 1 - - when 'k', '' - @pwd.pos -= 1 - - when '', 'h', 'H', '' - descend - - when 'E' - cf = currentfile.path - unless cf.nil? or enter_dir_safely(cf) - closei - system VI % cf - starti - end - - when '', 'l', 'L', '' - if currentfile.dir? - enter_dir_safely(currentfile.path) - else - mode = @buffer == 'L' ? 1 : 0 - Action.run(RunContext.new(getfiles, mode)) - end - - when /^[ri](\d*)([adetw]*)[ri]$/ - run_context = RunContext.new(getfiles, $1, $2) - Action.run(run_context) - - when 'ZZ', '', ':q', 'Q' - exit - - when '' - Fm.boot_up - - when "-", "=" - val = "2#{key=='-' ? '-' : '+'}" - system("amixer", "-q", "set", "PCM", val, "unmute") - - else -# log key.ord - - end - - @buffer = '' unless @buffer == '' or @buffer =~ REGX - end - - def self.ascend(wait = false, all=false) - Directory.filter = nil - if all and !@marked.empty? - closei - system(*['mplayer', '-fs', *@marked.map{|x| x.path}]) - starti - return true - else - cf = currentfile - enter = enter_dir_safely(cf.path) - unless enter - return Action.run(RunContext.new(getfiles)) - end - return false - end - end - - def self.descend - Directory.filter = nil - unless @path.size == 1 - enter_dir(@buffer=='H' ? '..' : @path[-2].path) - end - end -end - diff --git a/code/keys.rb b/code/keys.rb new file mode 100644 index 00000000..1b1d4fd6 --- /dev/null +++ b/code/keys.rb @@ -0,0 +1,584 @@ +module Fm + # ALL combinations of multiple keys (but without the last letter) + # or regexps which match combinations need to be in here! + COMBS = %w( + g d df y c Z delet cu + ter ta S ? ?g ?f :q + + /[m`']/ /[fF/!].*/ + /[ri]\d*\w*[^ri]/ + /(cw|cd|mv).*/ + /b(l(o(c(k(.*)?)?)?)?)?/ + /m(k(d(i(r(.*)?)?)?)?)?/ + /r(e(n(a(m(e(.*)?)?)?)?)?)?/ + ) + + # Create a regular expression which detects these combos + ary = [] + for token in COMBS + if token =~ /^\/(.*)\/$/ + ary << $1 + elsif token.size > 0 + ary << token.each_char.map {|t| + if t == '?' + t = '\?' + end + + "(?:#{t}" + }.join + + (')?' * (token.size - 1)) + ')' + end + end + REGX = Regexp.new('^(?:' + ary.uniq.join('|') + ')$') + + def self.ignore_keys_for(t) + @ignore_until = Time.now + t + end + + def self.search(str, offset=0, backwards=false) + begin + rx = Regexp.new(str, Regexp::IGNORECASE) + rescue + return false + end + + ary = @pwd.files_raw.dup + ary.wrap(@pwd.pos + offset) + + ary.reverse! if backwards + + for f in ary + g = File.basename(f) + if g =~ rx + @pwd.pointed_file = f + break + end + end + end + + def self.find_newest() + newest = nil + for f in @pwd.files + if newest.nil? or newest.ctime < f.ctime + newest = f + end + end + @pwd.pointed_file = newest.path + end + + def self.hints(str) + begin + rx = Regexp.new(str, Regexp::IGNORECASE) + rescue + return false + end + + ary = @pwd.files_raw.dup + ary.wrap(@pwd.pos) + + n = 0 + pointed = false + for f in ary + g = File.basename(f) + if g =~ rx + unless pointed + log "point at #{f}" + @pwd.pointed_file = f + pointed = true + end + n += 1 + end + end + + return n + end + + def self.remember_dir + @memory["`"] = @memory["'"] = @pwd.path + end + + def self.press(key) + return if @ignore_until and Time.now < @ignore_until + + @ignore_until = nil + + if key == '' + if @buffer.empty? + @buffer = key + elsif @buffer == 'F' + descend + elsif @buffer[-1] == ?> + @buffer.slice!(/(<.*)?>$/) + else + @buffer.slice!(-1) + end + elsif key == '' + @buffer = '' + else + @buffer << key + end + + case @buffer + when '' + closei + starti + + when 'j', '' + @pwd.pos += 1 + + when 's' + closei + system('clear') + ls = ['ls'] + ls << '--color=auto' if OPTIONS['color'] + ls << '--group-directories-first' if OPTIONS['color'] + system(*ls) + system('bash') + @pwd.schedule + starti + + + when /^S(.)$/ + OPTIONS['sort_reverse'] = $1.ord.between?(65, 90) + + case $1 + when 'n' + OPTIONS['sort'] = :name + when 'e' + OPTIONS['sort'] = :ext + when 't' + OPTIONS['sort'] = :type + when 's' + OPTIONS['sort'] = :size + when 'm' + OPTIONS['sort'] = :mtime + when 'c' + OPTIONS['sort'] = :ctime + end + @pwd.schedule + + when 'tar' + closei + system('tar', 'cvvf', 'pack.tar', *selection.map{|x| x.basename}) + @pwd.refresh! + starti + + when 'R' + @pwd.refresh! + + when 'a' + Process.kill('INT', Process.pid) +# Process.kill('INT', Process.pid) + + when 'x' + @bars.first.kill unless @bars.empty? + + when 'X' +# @bars.last.kill unless @bars.empty? + + closei + exec(ENV['SHELL']) + exit + + when 'J' + @pwd.pos += lines/2 + + when 'K' + @pwd.pos -= lines/2 + + when 'cp', 'yy' + @copy = selection + @cut = false + + when 'cut' + @copy = selection + @cut = true + + when 'n' + if @search_string.empty? + find_newest + else + search(@search_string, 1) + end + + when 'N' + search(@search_string, 0, true) + +# when 'fh' +# @buffer.clear +# press('h') + + when /^F(.+)$/ + str = $1 + if str =~ /^\s?(.*)(|)$/ + if $2 == '' + Directory.filter = $1 + @pwd.refresh! + end + @buffer.clear +# else +# test = hints(str) +# if test == 1 +# if ascend +# @buffer.clear +# else +# @buffer = 'F' +# end +# ignore_keys_for 0.5 +# elsif test == 0 +# @buffer = 'F' +# ignore_keys_for 1 +# end + end + +# when /^F(.+)$/ +# str = $1 +# if str =~ /^\s?(.*)(|)$/ +# if $2 == '' +# ascend +# @buffer = 'F' +# else +# @buffer.clear +# @search_string = $1 +# end +# else +# test = hints(str) +# if test == 1 +# if ascend +# @buffer.clear +# else +# @buffer = 'F' +# end +# ignore_keys_for 0.5 +# elsif test == 0 +# @buffer = 'F' +# ignore_keys_for 1 +# end +# end + + when 'A' + @buffer = "cw #{currentfile.name}" + + when /^f(.+)$/ + str = $1 + if str =~ /^\s?(.*)(L|;||)$/ + @buffer = '' + @search_string = $1 + press('l') if $2 == ';' or $2 == 'L' + else + test = hints(str) + if test == 1 + @buffer = '' + press('l') + ignore_keys_for 0.5 + elsif test == 0 + @buffer = '' + ignore_keys_for 1 + end + end + + when /^\/(.+)$/ + str = $1 + if str =~ /^\s?(.*)(L|;||)$/ + @buffer = '' + @search_string = $1 + press('l') if $2 == ';' or $2 == 'L' + else + search(str) + end + + when /^mkdir(.*)$/ + str = $1 + if str =~ /^\s?(.*)(|)$/ + @buffer = '' + if $2 == '' + closei + system('mkdir', $1) + starti + @pwd.schedule + end + end + + when /^block.*stop$/ + @buffer = '' + + when /^!(.+)$/ + str = $1 + if str =~ /^(\!?)(.*)(|)$/ + @buffer = '' + if $3 == '' + closei + system("bash", "-c", $2) + Action.wait_for_enter unless $1.empty? + starti + @pwd.schedule + end + end + + when /^cd(.+)$/ + str = $1 + if str =~ /^\s?(.*)(|)$/ + @buffer = '' + if $2 == '' + remember_dir + enter_dir_safely($1) + end + end + + when /^(mv|cw|rename)(.+)$/ + str = $2 + if $1 == 'mv' + if str =~ /['`"]([\w\d])/ + if path = @memory[$1] + str = '' + @buffer.clear + if File.exists?(path) and File.directory?(path) + Action.move(selection, path) + end + end + end + end + log str + if str =~ /^\s?(.*)(|)$/ + @buffer = '' + if $2 == '' + files = selection + if files.size == 1 + fn = $1 + log "!!! #{fn}" + unless fn.include? '.' + if ext = files.first.basename.from_last('.') + fn << ".#{ext}" + end + log "??? #{ext}" + end + Action.move(files, fn) + @pwd.refresh! + @pwd.find_file(fn) + else + Action.move(files, $1) + @pwd.refresh! + end + end + end + + when 'tc' + OPTIONS['color'] ^= true + + when 'tf' + OPTIONS['filepreview'] ^= true + + when 'th' + OPTIONS['hidden'] ^= true + @pwd.refresh! + + when 'td' + OPTIONS['dir_first'] ^= true + @pwd.schedule + + when 'delete' + files = selection + @marked = [] + for f in files + if f and f.exists? and f.dir? + system('rm', '-r', f.to_s) + @pwd.schedule + end + end + + when 'p' + if @cut + Action.move(@copy, @pwd.path) + @cut = false + else + Action.copy(@copy, @pwd.path) + end + @pwd.refresh! + if @copy.size == 1 + @pwd.find_file(@copy[0].basename) + end + + when 'P' + for f in @copy + File.symlink(f.path, File.expand_path(f.basename)) + end + + + when /^[`'](.)$/ + if dir = @memory[$1] and not @pwd.path == dir + remember_dir + enter_dir_safely(dir) + end + + when '' + if dir = @memory['`'] and not @pwd.path == dir + remember_dir + enter_dir_safely(dir) + end + + when '' + if dir = @memory['9'] and dir != '/' + unless @pwd.path == dir + enter_dir_safely(dir) + end + elsif dir = @memory['`'] and not @pwd.path == dir + remember_dir + enter_dir_safely(dir) + end + + + when /^m(.)$/ + @memory[$1] = @pwd.path + + when ' ' + if currentfile.marked + @marked.delete(currentfile) + currentfile.marked = false + else + @marked << currentfile + currentfile.marked = true + end + + @pwd.pos += 1 + + when 'v' + @marked = [] + for file in @pwd.files + if file.marked + file.marked = false + else + file.marked = true + @marked << file + end + end + + when 'V' + for file in @marked + file.marked = false + end + @marked = [] + + + when 'gg' + @pwd.pos = 0 + + when 'dd' + new_path = move_to_trash(currentfile) + if new_path + new_path = Directory::Entry.new(new_path) + new_path.get_data + @copy = [new_path] + @cut = false + end + @pwd.schedule + + when 'dD', 'dfd' + cf = currentfile + if cf and cf.exists? + cf.delete! + @pwd.schedule + end + + when 'term' + fork do exec 'x-terminal-emulator' end + + when 'g0' + remember_dir + enter_dir('/') + + when 'gh' + remember_dir + enter_dir('~') + + when 'gu' + remember_dir + enter_dir('/usr') + + when 'ge' + remember_dir + enter_dir('/etc') + + when 'gm' + remember_dir + enter_dir('/media') + + when 'gt' + remember_dir + enter_dir('~/.trash') + + when 'gs' + remember_dir + enter_dir('/srv') + + when 'G' + @pwd.pos = @pwd.size - 1 + + when 'k', '' + @pwd.pos -= 1 + + when '', 'h', 'H', '' + descend + + when 'E' + cf = currentfile.path + unless cf.nil? or enter_dir_safely(cf) + closei + system VI % cf + starti + end + + when '', 'l', 'L', '' + if currentfile.dir? + enter_dir_safely(currentfile.path) + else + mode = @buffer == 'L' ? 1 : 0 + Action.run(RunContext.new(getfiles, mode)) + end + + when /^[ri](\d*)([adetw]*)[ri]$/ + run_context = RunContext.new(getfiles, $1, $2) + Action.run(run_context) + + when 'ZZ', '', ':q', 'Q' + exit + + when '' + Fm.boot_up + + when "-", "=" + val = "2#{key=='-' ? '-' : '+'}" + system("amixer", "-q", "set", "PCM", val, "unmute") + + else +# log key.ord + + end + + @buffer = '' unless @buffer == '' or @buffer =~ REGX + end + + def self.ascend(wait = false, all=false) + Directory.filter = nil + if all and !@marked.empty? + closei + system(*['mplayer', '-fs', *@marked.map{|x| x.path}]) + starti + return true + else + cf = currentfile + enter = enter_dir_safely(cf.path) + unless enter + return Action.run(RunContext.new(getfiles)) + end + return false + end + end + + def self.descend + Directory.filter = nil + unless @path.size == 1 + enter_dir(@buffer=='H' ? '..' : @path[-2].path) + end + end +end + -- cgit 1.4.1-2-gfad0