1
1
mirror of https://github.com/walles/moar.git synced 2024-07-14 15:20:29 +03:00
moar/sample-files/long.txt
2019-06-08 22:12:52 +02:00

76 lines
1.8 KiB
Plaintext

1 #!/usr/bin/ruby
2
3 require "curses"
4
5 class Moar
6 include Curses
7
8 def initialize(file)
9 @first_line = 0
10 @file = file
11 @lines = IO.readlines(file)
12 @last_key = 0
13 end
14
15 def draw_screen()
16 # @first_line must not be closer than lines-2 from the end
17 max_first_line = @lines.size - (lines - 1)
18 @first_line = [@first_line, max_first_line].min()
19
20 # @first_line cannot be negative
21 @first_line = [0, @first_line].max()
22
23 clear()
24 setpos(0, 0)
25
26 attrset(A_NORMAL)
27 last_line = @first_line + lines - 2
28 for line_number in @first_line..last_line do
29 if line_number < @lines.size
30 addstr(@lines[line_number])
31 else
32 addstr("~\n")
33 end
34 end
35
36 attrset(A_REVERSE)
37 status = "Lines #{@first_line + 1}-"
38 status += "#{[@lines.size, last_line].min()}"
39 status += "/#{@lines.size}"
40 addstr(status)
41
42 refresh()
43 end
44
45 def run
46 init_screen
47 noecho
48 stdscr.keypad(true)
49
50 begin
51 crmode
52 while true
53 draw_screen()
54
55 key = getch()
56 case key
57 when ?q.ord
58 break
59 when Key::RESIZE
60 draw_screen()
61 when Key::DOWN
62 @first_line += 1
63 when Key::UP
64 @first_line -= 1
65 end
66
67 @last_key = key
68 end
69 ensure
70 close_screen
71 end
72 end
73 end
74
75 Moar.new(ARGV[0]).run()