Extended maintenance of Ruby versions 1.8.7 and 1.9.2 ended on July 31, 2014. Read more

In Files

  • curses/view2.rb

Class/Module Index [+]

Quicksearch

FileViewer

A curses based file viewer

Public Class Methods

new(filename) click to toggle source

Create a new fileviewer, and view the file.

 
               # File curses/view2.rb, line 10
def initialize(filename)
  @data_lines = []
  @screen = nil
  @top = nil
  init_curses
  load_file(filename)
  interact
end
            

Public Instance Methods

init_curses() click to toggle source

Perform the curses setup

 
               # File curses/view2.rb, line 20
def init_curses
  # signal(SIGINT, finish)

  Curses.init_screen
  Curses.nonl
  Curses.cbreak
  Curses.noecho

  @screen = Curses.stdscr

  @screen.scrollok(true)
  #$screen.keypad(true)
end
            
interact() click to toggle source

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.

 
               # File curses/view2.rb, line 92
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
  Curses.close_screen
end
            
load_file(filename) click to toggle source

Load the file into memory, and put the first part on the curses display.

 
               # File curses/view2.rb, line 36
def load_file(filename)
  fp = open(filename, "r") do |fp|
  # slurp the file
  fp.each_line { |l|
    @data_lines.push(l.chop)
  }
  end
  @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
rescue
  raise "cannot open file '#{filename}' for reading"
end
            
scroll_down() click to toggle source

Scroll the display down by one line

 
               # File curses/view2.rb, line 72
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
end
            
scroll_up() click to toggle source

Scroll the display up by one line

 
               # File curses/view2.rb, line 56
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
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus