diff options
author | hut <hut@lavabit.com> | 2009-05-09 00:00:00 +0200 |
---|---|---|
committer | hut <hut@lavabit.com> | 2009-05-09 00:00:00 +0200 |
commit | a0de7f95bc7525b99b2c2e16f566e0ee367e9c3c (patch) | |
tree | 62d1cdf9523f4e8fad28ca7df0e1d696c991d2db /code/keys.rb | |
parent | 34bfb32ecf2cea5e5de95980beedb681139d9c01 (diff) | |
download | ranger-a0de7f95bc7525b99b2c2e16f566e0ee367e9c3c.tar.gz |
lots of changes. version 0.2.1 v0.2.1
Diffstat (limited to 'code/keys.rb')
-rw-r--r-- | code/keys.rb | 238 |
1 files changed, 197 insertions, 41 deletions
diff --git a/code/keys.rb b/code/keys.rb index d6ae01ea..edcbab53 100644 --- a/code/keys.rb +++ b/code/keys.rb @@ -2,11 +2,13 @@ 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 y c Z delet cu - t S ? ?g ?f + g d df y c Z delet cu + ter ta S ? ?g ?f :q - /[m`']/ /[fF/!].*/ + /[m`']/ /[fF/!q].*/ + /[ri]\d*\w*[^ri]/ /(cw|cd|mv).*/ + /b(l(o(c(k(.*)?)?)?)?)?/ /m(k(d(i(r(.*)?)?)?)?)?/ /r(e(n(a(m(e(.*)?)?)?)?)?)?/ ) @@ -54,6 +56,16 @@ module Fm 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) @@ -70,6 +82,7 @@ module Fm g = File.basename(f) if g =~ rx unless pointed + log "point at #{f}" @pwd.pointed_file = f pointed = true end @@ -99,6 +112,8 @@ module Fm else @buffer.slice! -1 end + elsif key == '<c-u>' + @buffer = '' else @buffer << key end @@ -123,26 +138,59 @@ module Fm starti - when /S(.)/ + 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 'e' - OPTIONS['sort'] = :extension when 'm' OPTIONS['sort'] = :mtime - when 'c', 't' + when 'c' OPTIONS['sort'] = :ctime end @pwd.schedule - when 'r', 'R' + when 'tar' + closei + system('tar', 'cvvf', 'pack.tar', *selection.map{|x| x.basename}) + @pwd.refresh! + starti + + when 'R' @pwd.refresh! + when '@', '.' + if defined? @record + @buffer = '' + memo = '' + @record.each_char do |c| + if memo.empty? + if c == '<' + memo << c + else + press c + end + else + memo << c + if c == '>' + press memo + memo.clear + end + end + end + end + + when /^q.+q$/ + @record = @buffer[1...-1] + @buffer = '' + when 'x' @bars.first.kill unless @bars.empty? @@ -156,23 +204,19 @@ module Fm @pwd.pos -= lines/2 when 'cp', 'yy' - if @marked.empty? - @copy = [currentfile] - else - @copy = @marked.dup - end + @copy = selection @cut = false when 'cut' - if @marked.empty? - @copy = [currentfile] - else - @copy = @marked.dup - end + @copy = selection @cut = true when 'n' - search(@search_string, 1) + if @search_string.empty? + find_newest + else + search(@search_string, 1) + end when 'N' search(@search_string, 0, true) @@ -206,6 +250,9 @@ module Fm end end + when 'A' + @buffer = "cw #{currentfile.name}" + when /^f(.+)$/ str = $1 if str =~ /^\s?(.*)(L|;|<cr>|<esc>)$/ @@ -245,6 +292,9 @@ module Fm @pwd.schedule end end + + when /^block.*stop$/ + @buffer = '' when /^!(.+)$/ str = $1 @@ -269,14 +319,41 @@ module Fm end end - when /^(?:mv|cw|rename)(.+)$/ - str = $1 + 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?(.*)(<cr>|<esc>)$/ @buffer = '' if $2 == '<cr>' - Action.move(currentfile, $1) + 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 - @pwd.schedule end when 'tc' @@ -294,7 +371,7 @@ module Fm @pwd.schedule when 'delete' - files = @marked.empty? ? [currentfile] : @marked + files = selection @marked = [] for f in files if f and f.exists? and f.dir? @@ -310,6 +387,10 @@ module Fm else Action.copy(@copy, @pwd.path) end + @pwd.refresh! + if @copy.size == 1 + @pwd.find_file(@copy[0].basename) + end when /^[`'](.)$/ if dir = @memory[$1] and not @pwd.path == dir @@ -317,12 +398,22 @@ module Fm enter_dir_safely(dir) end - when '<tab>' + when '<s-tab>' if dir = @memory['`'] and not @pwd.path == dir remember_dir enter_dir_safely(dir) end + when '<tab>' + 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 @@ -369,13 +460,16 @@ module Fm end @pwd.schedule - when 'dD' + 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('/') @@ -418,31 +512,93 @@ module Fm end when '<cr>', 'l', ';', 'L', '<right>' - ascend(@buffer=='L') + ascend(@buffer=='L', @buffer=='l') + + # a = run all + # d or e = detach + # t = run in a terminal + # w = wait for <enter> after execution + # capital letter inverts + when /^[ri](\d*)([adetw]*)[ri]$/ + if $2.empty? + f = @marked.empty?? currentfile : @marked.first + flags = get_default_flags(f) + else + flags = $2 + end + opt = OpenStruct.new + opt.newway = true + + opt.mode = $1.to_i unless $1.empty? + + # Set options based on flags + + if flags =~ /a/ + opt.all = true + end + if flags =~ /[de]/ + opt.detach = true + end + if flags =~ /t/ + opt.new_term = true + opt.detach = true + end + if flags =~ /w/ + opt.wait = true + end - when 'q', 'ZZ', "\004" + if flags =~ /A/ + opt.all = false + end + if flags =~ /[DE]/ + opt.detach = false + end + if flags =~ /T/ + opt.new_term = false + end + if flags =~ /W/ + opt.wait = false + end + + Action.run(opt.__table__) + +# when 'ra' +# unless File.directory?(currentfile.path) +# Action.run(:all=>true) +# end + + when 'ZZ', '<c-d>', ':q<cr>' exit + + when '<c-r>' + 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) - cf = currentfile - enter = enter_dir_safely(cf.path) - unless cf.nil? or enter - handler, wait = getfilehandler(currentfile) - if handler - closei - log handler - system(handler) - gets if wait - starti - return true + def self.ascend(wait = false, all=false) + 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(:detach=>false) end + return false end - return false end def self.descend |