ext/pty/shl.rb


DEFINITIONS

This source file includes following functions.


   1  #
   2  #  old-fashioned 'shl' like program
   3  #  by A. Ito
   4  #
   5  #  commands:
   6  #     c        creates new shell
   7  #     C-z      suspends shell
   8  #     p        lists all shell
   9  #     0,1,...  choose shell
  10  #     q        quit
  11  
  12  require 'pty'
  13  
  14  $shells = []
  15  $n_shells = 0
  16  
  17  $r_pty = nil
  18  $w_pty = nil
  19  
  20  def writer
  21    system "stty -echo raw"
  22    begin
  23      while true
  24        c = STDIN.getc
  25        if c == 26 then # C-z
  26          $reader.raise(nil)
  27          return 'Suspend'
  28        end
  29        $w_pty.print c.chr
  30        $w_pty.flush
  31      end
  32    rescue
  33      $reader.raise(nil)
  34      return 'Exit'
  35    ensure
  36      system "stty echo -raw"
  37    end
  38  end
  39  
  40  $reader = Thread.new {
  41    while true
  42      begin
  43        next if $r_pty.nil?
  44        c = $r_pty.getc
  45        if c.nil? then
  46          Thread.stop
  47        end
  48        print c.chr
  49        STDOUT.flush
  50      rescue
  51        Thread.stop
  52      end
  53    end
  54  }
  55  
  56  # $reader.raise(nil)
  57  
  58  
  59  while true
  60    print ">> "
  61    STDOUT.flush
  62    case gets
  63    when /^c/i
  64      $shells[$n_shells] = PTY.spawn("/bin/csh")
  65      $r_pty,$w_pty = $shells[$n_shells]
  66      $n_shells += 1
  67      $reader.run
  68      if writer == 'Exit'
  69        $n_shells -= 1
  70        $shells[$n_shells] = nil
  71      end
  72    when /^p/i
  73      for i in 0..$n_shells
  74        unless $shells[i].nil?
  75          print i,"\n"
  76        end
  77      end
  78    when /^([0-9]+)/
  79      n = $1.to_i
  80      if $shells[n].nil?
  81        print "\##{i} doesn't exist\n"
  82      else
  83        $r_pty,$w_pty = $shells[n]
  84        $reader.run
  85        if writer == 'Exit' then
  86          $shells[n] = nil
  87        end
  88      end
  89    when /^q/i
  90      exit
  91    end
  92  end