diff options
author | aycabta <aycabta@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-04-20 08:51:20 +0000 |
---|---|---|
committer | aycabta <aycabta@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-04-20 08:51:20 +0000 |
commit | 7f273ac6d0f05208b5b228da95205e20c0e8286c (patch) | |
tree | bfec81d78d487c6d8015f26fd6a5740cfef63d31 /lib/reline/ansi.rb | |
parent | 91faab7f1477c65f71aee8324cdeca7b6f19434a (diff) |
IRB is improved with Reline and RDoc
Reline is a readline stdlib compatible library. It also supports
multiline input. IRB is improved with Reline and supports multiline.
Besides, supports showing documents when completed.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67645 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/reline/ansi.rb')
-rw-r--r-- | lib/reline/ansi.rb | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/lib/reline/ansi.rb b/lib/reline/ansi.rb new file mode 100644 index 0000000000..f34c4207e5 --- /dev/null +++ b/lib/reline/ansi.rb @@ -0,0 +1,87 @@ +module Reline + def getc + c = nil + until c + return nil if @line_editor.finished? + result = select([$stdin], [], [], 0.1) + next if result.nil? + c = $stdin.read(1) + end + c.ord + end + + def self.get_screen_size + $stdin.winsize + end + + def self.set_screen_size(rows, columns) + $stdin.winsize = [rows, columns] + self + end + + def self.cursor_pos + res = '' + $stdin.raw do |stdin| + $stdout << "\e[6n" + $stdout.flush + while (c = stdin.getc) != 'R' + res << c if c + end + end + m = res.match(/(?<row>\d+);(?<column>\d+)/) + CursorPos.new(m[:column].to_i - 1, m[:row].to_i - 1) + end + + def self.move_cursor_column(x) + print "\e[#{x + 1}G" + end + + 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 + + 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 + + def self.erase_after_cursor + print "\e[K" + end + + def self.scroll_down(x) + return if x.zero? + print "\e[#{x}S" + end + + def self.clear_screen + print "\e[2J" + print "\e[1;1H" + end + + def prep + int_handle = Signal.trap('INT', 'IGNORE') + otio = `stty -g`.chomp + setting = ' -echo -icrnl cbreak' + if (`stty -a`.scan(/-parenb\b/).first == '-parenb') + setting << ' pass8' + end + setting << ' -ixoff' + `stty #{setting}` + Signal.trap('INT', int_handle) + otio + end + + def deprep(otio) + int_handle = Signal.trap('INT', 'IGNORE') + `stty #{otio}` + Signal.trap('INT', int_handle) + end +end |