[前][次][番号順一覧][スレッド一覧]

ruby-changes:14744

From: shugo <ko1@a...>
Date: Sat, 6 Feb 2010 23:26:18 +0900 (JST)
Subject: [ruby-changes:14744] Ruby:r26603 (trunk): ext/curses/view2.rb: replaced with Hugh Sasse's version.

shugo	2010-02-06 23:26:07 +0900 (Sat, 06 Feb 2010)

  New Revision: 26603

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26603

  Log:
    ext/curses/view2.rb: replaced with Hugh Sasse's version.

  Modified files:
    trunk/ext/curses/view2.rb

Index: ext/curses/view2.rb
===================================================================
--- ext/curses/view2.rb	(revision 26602)
+++ ext/curses/view2.rb	(revision 26603)
@@ -2,114 +2,148 @@
 
 require "curses"
 
-if ARGV.size != 1 then
-  printf("usage: view file\n");
-  exit
-end
-begin
-  fp = open(ARGV[0], "r")
-rescue
-  raise "cannot open file: #{ARGV[1]}"
-end
 
-# signal(SIGINT, finish)
+# A curses based file viewer
+class FileViewer
 
-Curses.init_screen
-Curses.nonl
-Curses.cbreak
-Curses.noecho
+  # Create a new fileviewer, and view the file.
+  def initialize(filename)
+    @data_lines = []
+    @screen = nil
+    @top = nil
+    init_curses
+    load_file(filename)
+    interact
+  end
 
-$screen = Curses.stdscr
+  # Perform the curses setup
+  def init_curses
+    # signal(SIGINT, finish)
 
-$screen.scrollok(true)
-#$screen.keypad(true)
+    Curses.init_screen
+    Curses.nonl
+    Curses.cbreak
+    Curses.noecho
 
-# slurp the file
-$data_lines = []
-fp.each_line { |l|
-  $data_lines.push(l.chop)
-}
-fp.close
+    @screen = Curses.stdscr
 
-$top = 0
-$data_lines[0..$screen.maxy-1].each_with_index{|line, idx|
-  $screen.setpos(idx, 0)
-  $screen.addstr(line)
-}
-$screen.setpos(0,0)
-$screen.refresh
+    @screen.scrollok(true)
+    #$screen.keypad(true)
+  end
 
-def scroll_up
-  if( $top > 0 )
-    $screen.scrl(-1)
-    $top -= 1
-    str = $data_lines[$top]
-    if( str )
-      $screen.setpos(0, 0)
-      $screen.addstr(str)
+  # Load the file into memory, and put
+  # the first part on the curses display.
+  def load_file(filename)
+    fp = open(filename, "r") do |fp|
+    # slurp the file
+    fp.each_line { |l|
+      @data_lines.push(l.chop)
+    }
     end
-    return true
-  else
-    return false
+    @top = 0
+    @data_lines[0..@s...].each_with_index{|line, idx|
+      @screen.setpos(idx, 0)
+      @screen.addstr(line)
+    }
+    @screen.setpos(0,0)
+    @screen.refresh
+  rescue
+    raise "cannot open file '#{filename}' for reading"
   end
-end
 
-def scroll_down
-  if( $top + $screen.maxy < $data_lines.length )
-    $screen.scrl(1)
-    $top += 1
-    str = $data_lines[$top + $screen.maxy - 1]
-    if( str )
-      $screen.setpos($screen.maxy - 1, 0)
-      $screen.addstr(str)
+
+  # Scroll the display up by one line
+  def scroll_up
+    if( @top > 0 )
+      @screen.scrl(-1)
+      @top -= 1
+      str = @data_lines[@top]
+      if( str )
+        @screen.setpos(0, 0)
+        @screen.addstr(str)
+      end
+      return true
+    else
+      return false
     end
-    return true
-  else
-    return false
   end
-end
 
-while true
-  result = true
-  c = Curses.getch
-  case c
-  when Curses::KEY_DOWN, Curses::KEY_CTRL_N
-    result = scroll_down
-  when Curses::KEY_UP, Curses::KEY_CTRL_P
-    result = scroll_up
-  when Curses::KEY_NPAGE, ?\s  # white space
-    for i in 0..($screen.maxy - 2)
-      if( ! scroll_down )
-	if( i == 0 )
-	  result = false
-	end
-	break
+  # Scroll the display down by one line
+  def scroll_down
+    if( @top + @screen.maxy < @data_lines.length )
+      @screen.scrl(1)
+      @top += 1
+      str = @data_lines[@top + @screen.maxy - 1]
+      if( str )
+        @screen.setpos(@screen.maxy - 1, 0)
+        @screen.addstr(str)
       end
+      return true
+    else
+      return false
     end
-  when Curses::KEY_PPAGE
-    for i in 0..($screen.maxy - 2)
-      if( ! scroll_up )
-	if( i == 0 )
-	  result = false
-	end
-	break
+  end
+
+  # Allow the user to interact with the display.
+  # This uses EMACS-like keybindings, and also
+  # vi-like keybindings as well, except that left
+  # and right move to the beginning and end of the
+  # file, respectively.
+  def interact
+    while true
+      result = true
+      c = Curses.getch
+      case c
+      when Curses::KEY_DOWN, Curses::KEY_CTRL_N, ?j
+        result = scroll_down
+      when Curses::KEY_UP, Curses::KEY_CTRL_P, ?k
+        result = scroll_up
+      when Curses::KEY_NPAGE, ?\s  # white space
+        for i in 0..(@screen.maxy - 2)
+          if( ! scroll_down )
+            if( i == 0 )
+              result = false
+            end
+            break
+          end
+        end
+      when Curses::KEY_PPAGE
+        for i in 0..(@screen.maxy - 2)
+          if( ! scroll_up )
+            if( i == 0 )
+              result = false
+            end
+            break
+          end
+        end
+      when Curses::KEY_LEFT, Curses::KEY_CTRL_T, ?h
+        while( scroll_up )
+        end
+      when Curses::KEY_RIGHT, Curses::KEY_CTRL_B, ?l
+        while( scroll_down )
+        end
+      when ?q
+        break
+      else
+        @screen.setpos(0,0)
+        @screen.addstr("[unknown key `#{Curses.keyname(c)}'=#{c}] ")
       end
+      if( !result )
+        Curses.beep
+      end
+      @screen.setpos(0,0)
     end
-  when Curses::KEY_LEFT, Curses::KEY_CTRL_T
-    while( scroll_up )
-    end
-  when Curses::KEY_RIGHT, Curses::KEY_CTRL_B
-    while( scroll_down )
-    end
-  when ?q
-    break
-  else
-    $screen.setpos(0,0)
-    $screen.addstr("[unknown key `#{Curses.keyname(c)}'=#{c}] ")
+    Curses.close_screen
   end
-  if( !result )
-    Curses.beep
+end
+
+
+# If we are being run as a main program...
+if __FILE__ == $0
+  if ARGV.size != 1 then
+    printf("usage: #{$0} file\n");
+    exit
   end
-  $screen.setpos(0,0)
+
+  viewer = FileViewer.new(ARGV[0])
 end
-Curses.close_screen

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]