Class: Reline::ANSI
- Inherits:
-
Object
- Object
- Reline::ANSI
- Defined in:
- lib/reline/ansi.rb
Constant Summary collapse
- RAW_KEYSTROKE_CONFIG =
{ [27, 91, 65] => :ed_prev_history, # ↑ [27, 91, 66] => :ed_next_history, # ↓ [27, 91, 67] => :ed_next_char, # → [27, 91, 68] => :ed_prev_char, # ← [27, 91, 51, 126] => :key_delete, # Del [27, 91, 49, 126] => :ed_move_to_beg, # Home [27, 91, 52, 126] => :ed_move_to_end, # End [27, 91, 72] => :ed_move_to_beg, # Home [27, 91, 70] => :ed_move_to_end, # End [27, 32] => :em_set_mark, # M-<space> [24, 24] => :em_exchange_mark, # C-x C-x TODO also add Windows [27, 91, 49, 59, 53, 67] => :em_next_word, # Ctrl+→ [27, 91, 49, 59, 53, 68] => :ed_prev_word, # Ctrl+← }
- @@input =
STDIN
- @@output =
STDOUT
- @@buf =
[]
- @@old_winch_handler =
nil
Class Method Summary collapse
- .clear_screen ⇒ Object
- .cursor_pos ⇒ Object
- .deprep(otio) ⇒ Object
- .erase_after_cursor ⇒ Object
- .get_screen_size ⇒ Object
- .getc ⇒ Object
- .input=(val) ⇒ Object
- .move_cursor_column(x) ⇒ Object
- .move_cursor_down(x) ⇒ Object
- .move_cursor_up(x) ⇒ Object
- .output=(val) ⇒ Object
- .prep ⇒ Object
- .retrieve_keybuffer ⇒ Object
- .scroll_down(x) ⇒ Object
- .set_screen_size(rows, columns) ⇒ Object
- .set_winch_handler(&handler) ⇒ Object
- .ungetc(c) ⇒ Object
Class Method Details
.clear_screen ⇒ Object
123 124 125 126 |
# File 'lib/reline/ansi.rb', line 123 def self.clear_screen print "\e[2J" print "\e[1;1H" end |
.cursor_pos ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/reline/ansi.rb', line 69 def self.cursor_pos begin res = '' m = nil @@input.raw do |stdin| @@output << "\e[6n" @@output.flush while (c = stdin.getc) != 'R' res << c if c end m = res.match(/\e\[(?<row>\d+);(?<column>\d+)/) (m.pre_match + m.post_match).chars.reverse_each do |ch| stdin.ungetc ch end end column = m[:column].to_i - 1 row = m[:row].to_i - 1 rescue Errno::ENOTTY buf = @@output.pread(@@output.pos, 0) row = buf.count("\n") column = buf.rindex("\n") ? (buf.size - buf.rindex("\n")) - 1 : 0 end Reline::CursorPos.new(column, row) end |
.deprep(otio) ⇒ Object
140 141 142 143 144 |
# File 'lib/reline/ansi.rb', line 140 def self.deprep(otio) int_handle = Signal.trap('INT', 'IGNORE') Signal.trap('INT', int_handle) Signal.trap('WINCH', @@old_winch_handler) if @@old_winch_handler end |
.erase_after_cursor ⇒ Object
114 115 116 |
# File 'lib/reline/ansi.rb', line 114 def self.erase_after_cursor print "\e[K" end |
.get_screen_size ⇒ Object
52 53 54 55 56 57 58 59 60 |
# File 'lib/reline/ansi.rb', line 52 def self.get_screen_size s = @@input.winsize return s if s[0] > 0 && s[1] > 0 s = [ENV["LINES"].to_i, ENV["COLUMNS"].to_i] return s if s[0] > 0 && s[1] > 0 [24, 80] rescue Errno::ENOTTY [24, 80] end |
.getc ⇒ Object
31 32 33 34 35 36 37 |
# File 'lib/reline/ansi.rb', line 31 def self.getc unless @@buf.empty? return @@buf.shift end c = @@input.raw(intr: true, &:getbyte) (c == 0x16 && @@input.raw(min: 0, tim: 0, &:getbyte)) || c end |
.input=(val) ⇒ Object
21 22 23 |
# File 'lib/reline/ansi.rb', line 21 def self.input=(val) @@input = val end |
.move_cursor_column(x) ⇒ Object
94 95 96 |
# File 'lib/reline/ansi.rb', line 94 def self.move_cursor_column(x) print "\e[#{x + 1}G" end |
.move_cursor_down(x) ⇒ Object
106 107 108 109 110 111 112 |
# File 'lib/reline/ansi.rb', line 106 def self.move_cursor_down(x) if x > 0 print "\e[#{x}B" if x > 0 elsif x < 0 move_cursor_up(-x) end end |
.move_cursor_up(x) ⇒ Object
98 99 100 101 102 103 104 |
# File 'lib/reline/ansi.rb', line 98 def self.move_cursor_up(x) if x > 0 print "\e[#{x}A" if x > 0 elsif x < 0 move_cursor_down(-x) end end |
.output=(val) ⇒ Object
26 27 28 |
# File 'lib/reline/ansi.rb', line 26 def self.output=(val) @@output = val end |
.prep ⇒ Object
133 134 135 136 137 138 |
# File 'lib/reline/ansi.rb', line 133 def self.prep retrieve_keybuffer int_handle = Signal.trap('INT', 'IGNORE') Signal.trap('INT', int_handle) nil end |
.retrieve_keybuffer ⇒ Object
43 44 45 46 47 48 49 50 |
# File 'lib/reline/ansi.rb', line 43 def self.retrieve_keybuffer result = select([@@input], [], [], 0.001) return if result.nil? str = @@input.read_nonblock(1024) str.bytes.each do |c| @@buf.push(c) end end |
.scroll_down(x) ⇒ Object
118 119 120 121 |
# File 'lib/reline/ansi.rb', line 118 def self.scroll_down(x) return if x.zero? print "\e[#{x}S" end |
.set_screen_size(rows, columns) ⇒ Object
62 63 64 65 66 67 |
# File 'lib/reline/ansi.rb', line 62 def self.set_screen_size(rows, columns) @@input.winsize = [rows, columns] self rescue Errno::ENOTTY self end |
.set_winch_handler(&handler) ⇒ Object
129 130 131 |
# File 'lib/reline/ansi.rb', line 129 def self.set_winch_handler(&handler) @@old_winch_handler = Signal.trap('WINCH', &handler) end |
.ungetc(c) ⇒ Object
39 40 41 |
# File 'lib/reline/ansi.rb', line 39 def self.ungetc(c) @@buf.unshift(c) end |