class RunContext # mode is a number from 0 to infinity # # flags are a string or array containing: # * a = run all # * d or e = detach # * t = run in a terminal # * w = wait for after execution # * c = run from ./ranger.rb (not usable from inside ranger) # * capital letter inverts ## accessors {{{ attr_accessor( *%w[ all detach wait new_term console files handlers paths mode exec multi ]) attr_reader( :flags ) def flags=(x) assert x, Array, String if x.is_a? Array @flagstring = x.join('') @flags = x elsif x.is_a? String @flagstring = x @flags = x.split(//) end parse_flags return x end ## }}} def initialize(files, mode=0, flags='') @mode = mode.to_i if files.is_a? Array @files = files.dup else @files = [files.dup] end self.flags = flags @files.reject! {|file| file.handler == nil or !file.exists? } @handlers = @files.map {|file| file.handler} @paths = @files.map {|file| file.path} @handler = @handlers.first @multi = (@files.size > 1 and @handlers.uniq.size == 1) if @handler @exec = Application.send(@handler, self) else @exec = nil end end def has_flag? x if x.is_a? Regexp @flagstring =~ x elsif x.is_a? String @flags.include? x else false end end def parse_flags @all = @detach = @new_term = @wait = false ## Positive flags if has_flag? 'a' @all = true end if has_flag? /[de]/ @detach = true end if has_flag? 't' @new_term = true @detach = true end if has_flag? 'w' @wait = true end if has_flag? 'c' @console = true end ## Negative flags if has_flag? 'A' @all = false end if has_flag? /[DE]/ @detach = false end if has_flag? 'T' @new_term = false end if has_flag? 'W' @wait = false end if has_flag? 'C' @console = false end end def no_mode?() @mode == 0 end def no_flags?() @flagstring.empty? end def default_flags=(x) if @flagstring.empty? self.flags = x end return x end def base_flags=(x) newflags = (x.is_a? Array) ? x : x.split(//) for flag in newflags unless @flags.include? flag.upcase or @flags.include? flag.downcase @flags << flag end end self.flags = @flags return x end ## set the mode and return self. def with_mode(n) @mode = n self end ## wrapper {{{ ## escape all files for direct use in the shell. ## if the _multi_ attribute is true, this is a shortcut for ## rc.paths.map {|x| ~x}.join(' ') ## otherwise: ## ~(rc.paths.first) def ~ if @multi @paths.map {|x| ~x}.join(' ') else ~@paths.first end end ## escape one (the first) file for direct use in the shell. ## this is a shortcut for: ## ~(rc.paths.first) def one ~@paths.first end ## shortcut for _files.size_ def size() @files.size end ## shortcut for _files.first.path_ def first() @files.first end ## shortcut for _files.first.name_ def name() @files.first.name end ## }}} end