Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more
A curses based file viewer
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
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 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 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
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.