diff options
author | aycabta <aycabta@gmail.com> | 2019-04-27 14:53:09 +0900 |
---|---|---|
committer | aycabta <aycabta@gmail.com> | 2019-04-30 11:44:20 +0900 |
commit | 17350c7e5534c8678097d70698fe08614a6c3997 (patch) | |
tree | 0f41959093014a97d50aeb06a052f5450b4cb6b1 /lib/reline/ansi.rb | |
parent | eb45ba61160dbae412407f232fe9b3252eb99362 (diff) | |
download | ruby-17350c7e5534c8678097d70698fe08614a6c3997.tar.gz |
Add Reline as a fallback library for Readline
* lib/reine.rb, lib/reline/*: Reline is a readline stdlib compatible
library.
* lib/readline.rb: Readline uses a fallback to Reline when ext/readline
doesn't exist.
* tool/sync_default_gems.rb: add ruby/reline as a default gem.
* appveyor.yml: add "set RELINE_TEST_ENCODING=Windows-31J" for test suit
of Reline, and add "--exclude readline" to "nmake test-all" on Visual
Studio builds because of strange behavior.
* spec/ruby/library/readline/spec_helper.rb: skip Reline as with
RbReadline.
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 |