class KV::KV

Public Class Methods

new(argv) click to toggle source
# File lib/kv.rb, line 737
def initialize argv
  @opts = {
    following_mode: false,
    first_line: 0,
    line_mode: false,
  }

  files = parse_option(argv)
  name = files.shift

  @pipe_in = nil

  if @opts[:pipe] || (name && File.pipe?(name))
    @opts.delete(:pipe)
    @opts[:fifo_file] = name || '/tmp/kv_pipe'

    if name && File.pipe?(name)
      # ok
    else
      begin
        name ||= File.expand_path('~/.kv_pipe')
        unlink_name = name
        File.mkfifo(name)
        at_exit{ puts "$ rm #{unlink_name}"; File.unlink(unlink_name) }
      rescue Errno::EEXIST
        raise "#{name} already exists."
      end
    end

    puts "waiting for #{name}"
    input = @pipe_in = open(name)
    name = nil
  elsif !name
    case
    when @opts[:e]
      cmd = @opts.delete(:e)
      input = IO.popen(cmd, 'a+')
      name = nil
      @pipe_in = input
      @opts[:ext_input] = input
    when STDIN.isatty
      input = help_io
      name = 'HELP'
    else
      input = STDIN.dup
      STDIN.reopen('/dev/tty')
      name = nil
      @pipe_in = input
    end
  else
    begin
      input = open(name)
    rescue Errno::ENOENT
      case name
      when /(.+):(\d+)/
        name = $1
        @opts[:first_line] = $2.to_i - 1
        retry
      when URI.regexp
        input = URI.open(name)
      else
        STDERR.puts "#{name}: No such file or directory"
        exit 1
      end
    end
  end

  trap(:INT){
    log "SIGINT"
  }

  @screens = [Screen.new(input, name: name, **@opts)]
end

Public Instance Methods

control() click to toggle source
# File lib/kv.rb, line 837
def control
  @screens.last.init_screen
  until @screens.empty?
    begin
      @screens.last.control
    rescue PopScreen
      @screens.pop
      @screens.last.redraw! unless @screens.empty?
    rescue PushScreen => e
      @screens.push e.screen
      @screens.last.redraw!
    end
  end
ensure
  Curses.close_screen
  log "terminate"
end
parse_option(argv) click to toggle source
# File lib/kv.rb, line 811
def parse_option argv
  opts = OptionParser.new
  opts.on('-f', 'following mode like "tail -f"'){
    @opts[:following_mode] = true
  }
  opts.on('-n', '--line-number LINE', 'goto LINE'){|n|
    @opts[:first_line] = n.to_i - 1
  }
  opts.on('-N', 'Show lines'){
    @opts[:line_mode] = true
  }
  opts.on('-T', '--time-stamp', 'Enable time stamp'){
    @opts[:time_stamp] = true
  }
  opts.on('-e CMD', 'Run CMD as a child process'){|cmd|
    @opts[:e] = cmd
  }
  opts.on('-p', '--pipe', 'Open named pipe'){
    @opts[:pipe] = true
  }
  opts.on('-s', 'Separation mode (tsv)'){
    @opts[:separation_mode] = true
  }
  opts.parse!(argv)
end