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.