From 7ba9d69f013aef06b671550e0e01eb1bc5a11419 Mon Sep 17 00:00:00 2001 From: "GitHub Actions[bot]" Date: Tue, 22 Aug 2023 00:14:26 +0000 Subject: [PATCH] Auto updated packages --- .../bundle/ruby/3.0.0/cache/reline-0.3.7.gem | Bin 57856 -> 0 bytes .../bundle/ruby/3.0.0/gems/reline-0.3.7/BSDL | 22 - .../ruby/3.0.0/gems/reline-0.3.7/COPYING | 56 - .../ruby/3.0.0/gems/reline-0.3.7/README.md | 87 - .../3.0.0/gems/reline-0.3.7/lib/reline.rb | 621 ---- .../gems/reline-0.3.7/lib/reline/ansi.rb | 364 -- .../gems/reline-0.3.7/lib/reline/config.rb | 401 -- .../reline-0.3.7/lib/reline/general_io.rb | 113 - .../gems/reline-0.3.7/lib/reline/history.rb | 76 - .../gems/reline-0.3.7/lib/reline/key_actor.rb | 7 - .../reline-0.3.7/lib/reline/key_actor/base.rb | 19 - .../lib/reline/key_actor/emacs.rb | 517 --- .../lib/reline/key_actor/vi_command.rb | 518 --- .../lib/reline/key_actor/vi_insert.rb | 517 --- .../reline-0.3.7/lib/reline/key_stroke.rb | 148 - .../gems/reline-0.3.7/lib/reline/kill_ring.rb | 125 - .../reline-0.3.7/lib/reline/line_editor.rb | 3298 ----------------- .../gems/reline-0.3.7/lib/reline/terminfo.rb | 160 - .../gems/reline-0.3.7/lib/reline/unicode.rb | 642 ---- .../lib/reline/unicode/east_asian_width.rb | 1196 ------ .../gems/reline-0.3.7/lib/reline/version.rb | 3 - .../gems/reline-0.3.7/lib/reline/windows.rb | 501 --- .../gems/reline-0.3.7/license_of_rb-readline | 25 - .../3.0.0/specifications/reline-0.3.7.gemspec | 31 - 24 files changed, 9447 deletions(-) delete mode 100644 vendor/bundle/ruby/3.0.0/cache/reline-0.3.7.gem delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/BSDL delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/COPYING delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/README.md delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/ansi.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/config.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/general_io.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/history.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/base.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/emacs.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/vi_command.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/vi_insert.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_stroke.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/kill_ring.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/line_editor.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/terminfo.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/unicode.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/unicode/east_asian_width.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/version.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/windows.rb delete mode 100644 vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/license_of_rb-readline delete mode 100644 vendor/bundle/ruby/3.0.0/specifications/reline-0.3.7.gemspec diff --git a/vendor/bundle/ruby/3.0.0/cache/reline-0.3.7.gem b/vendor/bundle/ruby/3.0.0/cache/reline-0.3.7.gem deleted file mode 100644 index 5faaae40b6794c1f71ec96a21916dacc0d7b19e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57856 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. -You can redistribute it and/or modify it under either the terms of the -2-clause BSDL (see the file BSDL), or the conditions below: - - 1. You may make and give away verbatim copies of the source form of the - software without restriction, provided that you duplicate all of the - original copyright notices and associated disclaimers. - - 2. You may modify your copy of the software in any way, provided that - you do at least ONE of the following: - - a) place your modifications in the Public Domain or otherwise - make them Freely Available, such as by posting said - modifications to Usenet or an equivalent medium, or by allowing - the author to include your modifications in the software. - - b) use the modified software only within your corporation or - organization. - - c) give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d) make other distribution arrangements with the author. - - 3. You may distribute the software in object code or binary form, - provided that you do at least ONE of the following: - - a) distribute the binaries and library files of the software, - together with instructions (in the manual page or equivalent) - on where to get the original distribution. - - b) accompany the distribution with the machine-readable source of - the software. - - c) give non-standard binaries non-standard names, with - instructions on where to get the original software distribution. - - d) make other distribution arrangements with the author. - - 4. You may modify and include the part of the software into any other - software (possibly commercial). But some files in the distribution - are not written by the author, so that they are not under these terms. - - For the list of those files and their copying conditions, see the - file LEGAL. - - 5. The scripts and library files supplied as input to or produced as - output from the software do not automatically fall under the - copyright of the software, but belong to whomever generated them, - and may be sold commercially, and may be aggregated with this - software. - - 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/README.md b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/README.md deleted file mode 100644 index 84e3286..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/README.md +++ /dev/null @@ -1,87 +0,0 @@ -[![Gem Version](https://badge.fury.io/rb/reline.svg)](https://badge.fury.io/rb/reline) -[![CI](https://github.com/ruby/reline/actions/workflows/reline.yml/badge.svg)](https://github.com/ruby/reline/actions/workflows/reline.yml) - -This is a screen capture of *IRB improved by Reline*. - -![IRB improved by Reline](https://raw.githubusercontent.com/wiki/ruby/reline/images/irb_improved_by_reline.gif) - -# Reline - -Reline is compatible with the API of Ruby's stdlib 'readline', GNU Readline and Editline by pure Ruby implementation. - -## Usage - -### Single line editing mode - -It's compatible with the readline standard library. - -See [the document of readline stdlib](https://ruby-doc.org/stdlib/libdoc/readline/rdoc/Readline.html) or [bin/example](https://github.com/ruby/reline/blob/master/bin/example). - -### Multi-line editing mode - -```ruby -require "reline" - -prompt = 'prompt> ' -use_history = true - -begin - while true - text = Reline.readmultiline(prompt, use_history) do |multiline_input| - # Accept the input until `end` is entered - multiline_input.split.last == "end" - end - - puts 'You entered:' - puts text - end -# If you want to exit, type Ctrl-C -rescue Interrupt - puts '^C' - exit 0 -end -``` - -```bash -$ ruby example.rb -prompt> aaa -prompt> bbb -prompt> end -You entered: -aaa -bbb -end -``` - -See also: [test/reline/yamatanooroti/multiline_repl](https://github.com/ruby/reline/blob/master/test/reline/yamatanooroti/multiline_repl) - -## Contributing - -Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/reline. - -### Run tests - -> **Note** -> Please make sure you have `libvterm` installed for `yamatanooroti` tests (integration tests). - -If you use Homebrew, you can install it by running `brew install libvterm`. - -```bash -WITH_VTERM=1 bundle install -WITH_VTERM=1 bundle exec rake test test_yamatanooroti -``` - -## Releasing - -```bash -rake release -gh release create vX.Y.Z --generate-notes -``` - -## License - -The gem is available as open source under the terms of the [Ruby License](https://www.ruby-lang.org/en/about/license.txt). - -## Acknowledgments for [rb-readline](https://github.com/ConnorAtherton/rb-readline) - -In developing Reline, we have used some of the rb-readline implementation, so this library includes [copyright notice, list of conditions and the disclaimer](license_of_rb-readline) under the 3-Clause BSD License. Reline would never have been developed without rb-readline. Thank you for the tremendous accomplishments. diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline.rb deleted file mode 100644 index 0a2dba4..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline.rb +++ /dev/null @@ -1,621 +0,0 @@ -require 'io/console' -require 'timeout' -require 'forwardable' -require 'reline/version' -require 'reline/config' -require 'reline/key_actor' -require 'reline/key_stroke' -require 'reline/line_editor' -require 'reline/history' -require 'reline/terminfo' -require 'rbconfig' - -module Reline - # NOTE: For making compatible with the rb-readline gem - FILENAME_COMPLETION_PROC = nil - USERNAME_COMPLETION_PROC = nil - - class ConfigEncodingConversionError < StandardError; end - - Key = Struct.new(:char, :combined_char, :with_meta) do - def match?(other) - case other - when Reline::Key - (other.char.nil? or char.nil? or char == other.char) and - (other.combined_char.nil? or combined_char.nil? or combined_char == other.combined_char) and - (other.with_meta.nil? or with_meta.nil? or with_meta == other.with_meta) - when Integer, Symbol - (combined_char and combined_char == other) or - (combined_char.nil? and char and char == other) - else - false - end - end - alias_method :==, :match? - end - CursorPos = Struct.new(:x, :y) - DialogRenderInfo = Struct.new( - :pos, - :contents, - :bg_color, - :pointer_bg_color, - :fg_color, - :pointer_fg_color, - :width, - :height, - :scrollbar, - keyword_init: true - ) - - class Core - ATTR_READER_NAMES = %i( - completion_append_character - basic_word_break_characters - completer_word_break_characters - basic_quote_characters - completer_quote_characters - filename_quote_characters - special_prefixes - completion_proc - output_modifier_proc - prompt_proc - auto_indent_proc - pre_input_hook - dig_perfect_match_proc - ).each(&method(:attr_reader)) - - attr_accessor :config - attr_accessor :key_stroke - attr_accessor :line_editor - attr_accessor :last_incremental_search - attr_reader :output - - extend Forwardable - def_delegators :config, - :autocompletion, - :autocompletion= - - def initialize - self.output = STDOUT - @dialog_proc_list = {} - yield self - @completion_quote_character = nil - @bracketed_paste_finished = false - end - - def io_gate - Reline::IOGate - end - - def encoding - io_gate.encoding - end - - def completion_append_character=(val) - if val.nil? - @completion_append_character = nil - elsif val.size == 1 - @completion_append_character = val.encode(encoding) - elsif val.size > 1 - @completion_append_character = val[0].encode(encoding) - else - @completion_append_character = nil - end - end - - def basic_word_break_characters=(v) - @basic_word_break_characters = v.encode(encoding) - end - - def completer_word_break_characters=(v) - @completer_word_break_characters = v.encode(encoding) - end - - def basic_quote_characters=(v) - @basic_quote_characters = v.encode(encoding) - end - - def completer_quote_characters=(v) - @completer_quote_characters = v.encode(encoding) - end - - def filename_quote_characters=(v) - @filename_quote_characters = v.encode(encoding) - end - - def special_prefixes=(v) - @special_prefixes = v.encode(encoding) - end - - def completion_case_fold=(v) - @config.completion_ignore_case = v - end - - def completion_case_fold - @config.completion_ignore_case - end - - def completion_quote_character - @completion_quote_character - end - - def completion_proc=(p) - raise ArgumentError unless p.respond_to?(:call) or p.nil? - @completion_proc = p - end - - def output_modifier_proc=(p) - raise ArgumentError unless p.respond_to?(:call) or p.nil? - @output_modifier_proc = p - end - - def prompt_proc=(p) - raise ArgumentError unless p.respond_to?(:call) or p.nil? - @prompt_proc = p - end - - def auto_indent_proc=(p) - raise ArgumentError unless p.respond_to?(:call) or p.nil? - @auto_indent_proc = p - end - - def pre_input_hook=(p) - @pre_input_hook = p - end - - def dig_perfect_match_proc=(p) - raise ArgumentError unless p.respond_to?(:call) or p.nil? - @dig_perfect_match_proc = p - end - - DialogProc = Struct.new(:dialog_proc, :context) - def add_dialog_proc(name_sym, p, context = nil) - raise ArgumentError unless name_sym.instance_of?(Symbol) - if p.nil? - @dialog_proc_list.delete(name_sym) - else - raise ArgumentError unless p.respond_to?(:call) - @dialog_proc_list[name_sym] = DialogProc.new(p, context) - end - end - - def dialog_proc(name_sym) - @dialog_proc_list[name_sym] - end - - def input=(val) - raise TypeError unless val.respond_to?(:getc) or val.nil? - if val.respond_to?(:getc) && io_gate.respond_to?(:input=) - io_gate.input = val - end - end - - def output=(val) - raise TypeError unless val.respond_to?(:write) or val.nil? - @output = val - if io_gate.respond_to?(:output=) - io_gate.output = val - end - end - - def vi_editing_mode - config.editing_mode = :vi_insert - nil - end - - def emacs_editing_mode - config.editing_mode = :emacs - nil - end - - def vi_editing_mode? - config.editing_mode_is?(:vi_insert, :vi_command) - end - - def emacs_editing_mode? - config.editing_mode_is?(:emacs) - end - - def get_screen_size - io_gate.get_screen_size - end - - Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE = ->() { - # autocomplete - return nil unless config.autocompletion - if just_cursor_moving and completion_journey_data.nil? - # Auto complete starts only when edited - return nil - end - pre, target, post = retrieve_completion_block(true) - if target.nil? or target.empty? or (completion_journey_data&.pointer == -1 and target.size <= 3) - return nil - end - if completion_journey_data and completion_journey_data.list - result = completion_journey_data.list.dup - result.shift - pointer = completion_journey_data.pointer - 1 - else - result = call_completion_proc_with_checking_args(pre, target, post) - pointer = nil - end - if result and result.size == 1 and result[0] == target and pointer != 0 - result = nil - end - target_width = Reline::Unicode.calculate_width(target) - x = cursor_pos.x - target_width - if x < 0 - x = screen_width + x - y = -1 - else - y = 0 - end - cursor_pos_to_render = Reline::CursorPos.new(x, y) - if context and context.is_a?(Array) - context.clear - context.push(cursor_pos_to_render, result, pointer, dialog) - end - dialog.pointer = pointer - DialogRenderInfo.new( - pos: cursor_pos_to_render, - contents: result, - scrollbar: true, - height: [15, preferred_dialog_height].min, - bg_color: 46, - pointer_bg_color: 45, - fg_color: 37, - pointer_fg_color: 37 - ) - } - Reline::DEFAULT_DIALOG_CONTEXT = Array.new - - def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination) - Reline.update_iogate - io_gate.with_raw_input do - unless confirm_multiline_termination - raise ArgumentError.new('#readmultiline needs block to confirm multiline termination') - end - inner_readline(prompt, add_hist, true, &confirm_multiline_termination) - - whole_buffer = line_editor.whole_buffer.dup - whole_buffer.taint if RUBY_VERSION < '2.7' - if add_hist and whole_buffer and whole_buffer.chomp("\n").size > 0 - Reline::HISTORY << whole_buffer - end - - line_editor.reset_line if line_editor.whole_buffer.nil? - whole_buffer - end - end - - def readline(prompt = '', add_hist = false) - Reline.update_iogate - inner_readline(prompt, add_hist, false) - - line = line_editor.line.dup - line.taint if RUBY_VERSION < '2.7' - if add_hist and line and line.chomp("\n").size > 0 - Reline::HISTORY << line.chomp("\n") - end - - line_editor.reset_line if line_editor.line.nil? - line - end - - private def inner_readline(prompt, add_hist, multiline, &confirm_multiline_termination) - if ENV['RELINE_STDERR_TTY'] - if io_gate.win? - $stderr = File.open(ENV['RELINE_STDERR_TTY'], 'a') - else - $stderr.reopen(ENV['RELINE_STDERR_TTY'], 'w') - end - $stderr.sync = true - $stderr.puts "Reline is used by #{Process.pid}" - end - otio = io_gate.prep - - may_req_ambiguous_char_width - line_editor.reset(prompt, encoding: encoding) - if multiline - line_editor.multiline_on - if block_given? - line_editor.confirm_multiline_termination_proc = confirm_multiline_termination - end - else - line_editor.multiline_off - end - line_editor.output = output - line_editor.completion_proc = completion_proc - line_editor.completion_append_character = completion_append_character - line_editor.output_modifier_proc = output_modifier_proc - line_editor.prompt_proc = prompt_proc - line_editor.auto_indent_proc = auto_indent_proc - line_editor.dig_perfect_match_proc = dig_perfect_match_proc - line_editor.pre_input_hook = pre_input_hook - @dialog_proc_list.each_pair do |name_sym, d| - line_editor.add_dialog_proc(name_sym, d.dialog_proc, d.context) - end - - unless config.test_mode - config.read - config.reset_default_key_bindings - io_gate.set_default_key_bindings(config) - end - - line_editor.rerender - - begin - line_editor.set_signal_handlers - prev_pasting_state = false - loop do - prev_pasting_state = io_gate.in_pasting? - read_io(config.keyseq_timeout) { |inputs| - line_editor.set_pasting_state(io_gate.in_pasting?) - inputs.each { |c| - line_editor.input_key(c) - line_editor.rerender - } - if @bracketed_paste_finished - line_editor.rerender_all - @bracketed_paste_finished = false - end - } - if prev_pasting_state == true and not io_gate.in_pasting? and not line_editor.finished? - line_editor.set_pasting_state(false) - prev_pasting_state = false - line_editor.rerender_all - end - break if line_editor.finished? - end - io_gate.move_cursor_column(0) - rescue Errno::EIO - # Maybe the I/O has been closed. - rescue StandardError => e - line_editor.finalize - io_gate.deprep(otio) - raise e - rescue Exception - # Including Interrupt - line_editor.finalize - io_gate.deprep(otio) - raise - end - - line_editor.finalize - io_gate.deprep(otio) - end - - # GNU Readline waits for "keyseq-timeout" milliseconds to see if the ESC - # is followed by a character, and times out and treats it as a standalone - # ESC if the second character does not arrive. If the second character - # comes before timed out, it is treated as a modifier key with the - # meta-property of meta-key, so that it can be distinguished from - # multibyte characters with the 8th bit turned on. - # - # GNU Readline will wait for the 2nd character with "keyseq-timeout" - # milli-seconds but wait forever after 3rd characters. - private def read_io(keyseq_timeout, &block) - buffer = [] - loop do - c = io_gate.getc - if c == -1 - result = :unmatched - @bracketed_paste_finished = true - else - buffer << c - result = key_stroke.match_status(buffer) - end - case result - when :matched - expanded = key_stroke.expand(buffer).map{ |expanded_c| - Reline::Key.new(expanded_c, expanded_c, false) - } - block.(expanded) - break - when :matching - if buffer.size == 1 - case read_2nd_character_of_key_sequence(keyseq_timeout, buffer, c, block) - when :break then break - when :next then next - end - end - when :unmatched - if buffer.size == 1 and c == "\e".ord - read_escaped_key(keyseq_timeout, c, block) - else - expanded = buffer.map{ |expanded_c| - Reline::Key.new(expanded_c, expanded_c, false) - } - block.(expanded) - end - break - end - end - end - - private def read_2nd_character_of_key_sequence(keyseq_timeout, buffer, c, block) - begin - succ_c = nil - Timeout.timeout(keyseq_timeout / 1000.0) { - succ_c = io_gate.getc - } - rescue Timeout::Error # cancel matching only when first byte - block.([Reline::Key.new(c, c, false)]) - return :break - else - case key_stroke.match_status(buffer.dup.push(succ_c)) - when :unmatched - if c == "\e".ord - block.([Reline::Key.new(succ_c, succ_c | 0b10000000, true)]) - else - block.([Reline::Key.new(c, c, false), Reline::Key.new(succ_c, succ_c, false)]) - end - return :break - when :matching - io_gate.ungetc(succ_c) - return :next - when :matched - buffer << succ_c - expanded = key_stroke.expand(buffer).map{ |expanded_c| - Reline::Key.new(expanded_c, expanded_c, false) - } - block.(expanded) - return :break - end - end - end - - private def read_escaped_key(keyseq_timeout, c, block) - begin - escaped_c = nil - Timeout.timeout(keyseq_timeout / 1000.0) { - escaped_c = io_gate.getc - } - rescue Timeout::Error # independent ESC - block.([Reline::Key.new(c, c, false)]) - else - if escaped_c.nil? - block.([Reline::Key.new(c, c, false)]) - elsif escaped_c >= 128 # maybe, first byte of multi byte - block.([Reline::Key.new(c, c, false), Reline::Key.new(escaped_c, escaped_c, false)]) - elsif escaped_c == "\e".ord # escape twice - block.([Reline::Key.new(c, c, false), Reline::Key.new(c, c, false)]) - else - block.([Reline::Key.new(escaped_c, escaped_c | 0b10000000, true)]) - end - end - end - - def ambiguous_width - may_req_ambiguous_char_width unless defined? @ambiguous_width - @ambiguous_width - end - - private def may_req_ambiguous_char_width - @ambiguous_width = 2 if io_gate == Reline::GeneralIO or !STDOUT.tty? - return if defined? @ambiguous_width - io_gate.move_cursor_column(0) - begin - output.write "\u{25bd}" - rescue Encoding::UndefinedConversionError - # LANG=C - @ambiguous_width = 1 - else - @ambiguous_width = io_gate.cursor_pos.x - end - io_gate.move_cursor_column(0) - io_gate.erase_after_cursor - end - end - - extend Forwardable - extend SingleForwardable - - #-------------------------------------------------------- - # Documented API - #-------------------------------------------------------- - - (Core::ATTR_READER_NAMES).each { |name| - def_single_delegators :core, :"#{name}", :"#{name}=" - } - def_single_delegators :core, :input=, :output= - def_single_delegators :core, :vi_editing_mode, :emacs_editing_mode - def_single_delegators :core, :readline - def_single_delegators :core, :completion_case_fold, :completion_case_fold= - def_single_delegators :core, :completion_quote_character - def_instance_delegators self, :readline - private :readline - - - #-------------------------------------------------------- - # Undocumented API - #-------------------------------------------------------- - - # Testable in original - def_single_delegators :core, :get_screen_size - def_single_delegators :line_editor, :eof? - def_instance_delegators self, :eof? - def_single_delegators :line_editor, :delete_text - def_single_delegator :line_editor, :line, :line_buffer - def_single_delegator :line_editor, :byte_pointer, :point - def_single_delegator :line_editor, :byte_pointer=, :point= - - def self.insert_text(*args, &block) - line_editor.insert_text(*args, &block) - self - end - - # Untestable in original - def_single_delegator :line_editor, :rerender, :redisplay - def_single_delegators :core, :vi_editing_mode?, :emacs_editing_mode? - def_single_delegators :core, :ambiguous_width - def_single_delegators :core, :last_incremental_search - def_single_delegators :core, :last_incremental_search= - def_single_delegators :core, :add_dialog_proc - def_single_delegators :core, :dialog_proc - def_single_delegators :core, :autocompletion, :autocompletion= - - def_single_delegators :core, :readmultiline - def_instance_delegators self, :readmultiline - private :readmultiline - - def self.encoding_system_needs - self.core.encoding - end - - def self.core - @core ||= Core.new { |core| - core.config = Reline::Config.new - core.key_stroke = Reline::KeyStroke.new(core.config) - core.line_editor = Reline::LineEditor.new(core.config, core.encoding) - - core.basic_word_break_characters = " \t\n`><=;|&{(" - core.completer_word_break_characters = " \t\n`><=;|&{(" - core.basic_quote_characters = '"\'' - core.completer_quote_characters = '"\'' - core.filename_quote_characters = "" - core.special_prefixes = "" - core.add_dialog_proc(:autocomplete, Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE, Reline::DEFAULT_DIALOG_CONTEXT) - } - end - - def self.ungetc(c) - core.io_gate.ungetc(c) - end - - def self.line_editor - core.line_editor - end - - def self.update_iogate - return if core.config.test_mode - - # Need to change IOGate when `$stdout.tty?` change from false to true by `$stdout.reopen` - # Example: rails/spring boot the application in non-tty, then run console in tty. - if ENV['TERM'] != 'dumb' && core.io_gate == Reline::GeneralIO && $stdout.tty? - require 'reline/ansi' - remove_const(:IOGate) - const_set(:IOGate, Reline::ANSI) - end - end -end - -require 'reline/general_io' -io = Reline::GeneralIO -unless ENV['TERM'] == 'dumb' - case RbConfig::CONFIG['host_os'] - when /mswin|msys|mingw|cygwin|bccwin|wince|emc/ - require 'reline/windows' - tty = (io = Reline::Windows).msys_tty? - else - tty = $stdout.tty? - end -end -Reline::IOGate = if tty - require 'reline/ansi' - Reline::ANSI -else - io -end - -Reline::HISTORY = Reline::History.new(Reline.core.config) diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/ansi.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/ansi.rb deleted file mode 100644 index d1a0e5b..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/ansi.rb +++ /dev/null @@ -1,364 +0,0 @@ -require 'io/console' -require 'io/wait' -require 'timeout' -require_relative 'terminfo' - -class Reline::ANSI - CAPNAME_KEY_BINDINGS = { - 'khome' => :ed_move_to_beg, - 'kend' => :ed_move_to_end, - 'kdch1' => :key_delete, - 'kpp' => :ed_search_prev_history, - 'knp' => :ed_search_next_history, - 'kcuu1' => :ed_prev_history, - 'kcud1' => :ed_next_history, - 'kcuf1' => :ed_next_char, - 'kcub1' => :ed_prev_char, - } - - ANSI_CURSOR_KEY_BINDINGS = { - # Up - 'A' => [:ed_prev_history, {}], - # Down - 'B' => [:ed_next_history, {}], - # Right - 'C' => [:ed_next_char, { ctrl: :em_next_word, meta: :em_next_word }], - # Left - 'D' => [:ed_prev_char, { ctrl: :ed_prev_word, meta: :ed_prev_word }], - # End - 'F' => [:ed_move_to_end, {}], - # Home - 'H' => [:ed_move_to_beg, {}], - } - - if Reline::Terminfo.enabled? - Reline::Terminfo.setupterm(0, 2) - end - - def self.encoding - Encoding.default_external - end - - def self.win? - false - end - - def self.set_default_key_bindings(config, allow_terminfo: true) - set_default_key_bindings_ansi_cursor(config) - if allow_terminfo && Reline::Terminfo.enabled? - set_default_key_bindings_terminfo(config) - else - set_default_key_bindings_comprehensive_list(config) - end - { - [27, 91, 90] => :completion_journey_up, # S-Tab - }.each_pair do |key, func| - config.add_default_key_binding_by_keymap(:emacs, key, func) - config.add_default_key_binding_by_keymap(:vi_insert, key, func) - end - { - # default bindings - [27, 32] => :em_set_mark, # M- - [24, 24] => :em_exchange_mark, # C-x C-x - }.each_pair do |key, func| - config.add_default_key_binding_by_keymap(:emacs, key, func) - end - end - - def self.set_default_key_bindings_ansi_cursor(config) - ANSI_CURSOR_KEY_BINDINGS.each do |char, (default_func, modifiers)| - bindings = [["\e[#{char}", default_func]] # CSI + char - if modifiers[:ctrl] - # CSI + ctrl_key_modifier + char - bindings << ["\e[1;5#{char}", modifiers[:ctrl]] - end - if modifiers[:meta] - # CSI + meta_key_modifier + char - bindings << ["\e[1;3#{char}", modifiers[:meta]] - # Meta(ESC) + CSI + char - bindings << ["\e\e[#{char}", modifiers[:meta]] - end - bindings.each do |sequence, func| - key = sequence.bytes - config.add_default_key_binding_by_keymap(:emacs, key, func) - config.add_default_key_binding_by_keymap(:vi_insert, key, func) - config.add_default_key_binding_by_keymap(:vi_command, key, func) - end - end - end - - def self.set_default_key_bindings_terminfo(config) - key_bindings = CAPNAME_KEY_BINDINGS.map do |capname, key_binding| - begin - key_code = Reline::Terminfo.tigetstr(capname) - [ key_code.bytes, key_binding ] - rescue Reline::Terminfo::TerminfoError - # capname is undefined - end - end.compact.to_h - - key_bindings.each_pair do |key, func| - config.add_default_key_binding_by_keymap(:emacs, key, func) - config.add_default_key_binding_by_keymap(:vi_insert, key, func) - config.add_default_key_binding_by_keymap(:vi_command, key, func) - end - end - - def self.set_default_key_bindings_comprehensive_list(config) - { - # Console (80x25) - [27, 91, 49, 126] => :ed_move_to_beg, # Home - [27, 91, 52, 126] => :ed_move_to_end, # End - [27, 91, 51, 126] => :key_delete, # Del - - # KDE - # Del is 0x08 - [27, 71, 65] => :ed_prev_history, # ↑ - [27, 71, 66] => :ed_next_history, # ↓ - [27, 71, 67] => :ed_next_char, # → - [27, 71, 68] => :ed_prev_char, # ← - - # urxvt / exoterm - [27, 91, 55, 126] => :ed_move_to_beg, # Home - [27, 91, 56, 126] => :ed_move_to_end, # End - - # GNOME - [27, 79, 72] => :ed_move_to_beg, # Home - [27, 79, 70] => :ed_move_to_end, # End - # Del is 0x08 - # Arrow keys are the same of KDE - - [27, 79, 65] => :ed_prev_history, # ↑ - [27, 79, 66] => :ed_next_history, # ↓ - [27, 79, 67] => :ed_next_char, # → - [27, 79, 68] => :ed_prev_char, # ← - }.each_pair do |key, func| - config.add_default_key_binding_by_keymap(:emacs, key, func) - config.add_default_key_binding_by_keymap(:vi_insert, key, func) - config.add_default_key_binding_by_keymap(:vi_command, key, func) - end - end - - @@input = STDIN - def self.input=(val) - @@input = val - end - - @@output = STDOUT - def self.output=(val) - @@output = val - end - - def self.with_raw_input - @@input.raw { yield } - end - - @@buf = [] - def self.inner_getc - unless @@buf.empty? - return @@buf.shift - end - until c = @@input.raw(intr: true) { @@input.wait_readable(0.1) && @@input.getbyte } - Reline.core.line_editor.resize - end - (c == 0x16 && @@input.raw(min: 0, time: 0, &:getbyte)) || c - rescue Errno::EIO - # Maybe the I/O has been closed. - nil - rescue Errno::ENOTTY - nil - end - - @@in_bracketed_paste_mode = false - START_BRACKETED_PASTE = String.new("\e[200~,", encoding: Encoding::ASCII_8BIT) - END_BRACKETED_PASTE = String.new("\e[200~.", encoding: Encoding::ASCII_8BIT) - def self.getc_with_bracketed_paste - buffer = String.new(encoding: Encoding::ASCII_8BIT) - buffer << inner_getc - while START_BRACKETED_PASTE.start_with?(buffer) or END_BRACKETED_PASTE.start_with?(buffer) do - if START_BRACKETED_PASTE == buffer - @@in_bracketed_paste_mode = true - return inner_getc - elsif END_BRACKETED_PASTE == buffer - @@in_bracketed_paste_mode = false - ungetc(-1) - return inner_getc - end - begin - succ_c = nil - Timeout.timeout(Reline.core.config.keyseq_timeout * 100) { - succ_c = inner_getc - } - rescue Timeout::Error - break - else - buffer << succ_c - end - end - buffer.bytes.reverse_each do |ch| - ungetc ch - end - inner_getc - end - - def self.getc - if Reline.core.config.enable_bracketed_paste - getc_with_bracketed_paste - else - inner_getc - end - end - - def self.in_pasting? - @@in_bracketed_paste_mode or (not empty_buffer?) - end - - def self.empty_buffer? - unless @@buf.empty? - return false - end - !@@input.wait_readable(0) - end - - def self.ungetc(c) - @@buf.unshift(c) - end - - def self.retrieve_keybuffer - begin - return unless @@input.wait_readable(0.001) - str = @@input.read_nonblock(1024) - str.bytes.each do |c| - @@buf.push(c) - end - rescue EOFError - end - end - - 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 - - def self.set_screen_size(rows, columns) - @@input.winsize = [rows, columns] - self - rescue Errno::ENOTTY - self - end - - def self.cursor_pos - begin - res = +'' - m = nil - @@input.raw do |stdin| - @@output << "\e[6n" - @@output.flush - loop do - c = stdin.getc - next if c.nil? - res << c - m = res.match(/\e\[(?\d+);(?\d+)R/) - break if m - end - (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 - begin - buf = @@output.pread(@@output.pos, 0) - row = buf.count("\n") - column = buf.rindex("\n") ? (buf.size - buf.rindex("\n")) - 1 : 0 - rescue Errno::ESPIPE - # Just returns column 1 for ambiguous width because this I/O is not - # tty and can't seek. - row = 0 - column = 1 - end - end - Reline::CursorPos.new(column, row) - end - - def self.move_cursor_column(x) - @@output.write "\e[#{x + 1}G" - end - - def self.move_cursor_up(x) - if x > 0 - @@output.write "\e[#{x}A" - elsif x < 0 - move_cursor_down(-x) - end - end - - def self.move_cursor_down(x) - if x > 0 - @@output.write "\e[#{x}B" - elsif x < 0 - move_cursor_up(-x) - end - end - - def self.hide_cursor - if Reline::Terminfo.enabled? - begin - @@output.write Reline::Terminfo.tigetstr('civis') - rescue Reline::Terminfo::TerminfoError - # civis is undefined - end - else - # ignored - end - end - - def self.show_cursor - if Reline::Terminfo.enabled? - begin - @@output.write Reline::Terminfo.tigetstr('cnorm') - rescue Reline::Terminfo::TerminfoError - # cnorm is undefined - end - else - # ignored - end - end - - def self.erase_after_cursor - @@output.write "\e[K" - end - - # This only works when the cursor is at the bottom of the scroll range - # For more details, see https://github.com/ruby/reline/pull/577#issuecomment-1646679623 - def self.scroll_down(x) - return if x.zero? - # We use `\n` instead of CSI + S because CSI + S would cause https://github.com/ruby/reline/issues/576 - @@output.write "\n" * x - end - - def self.clear_screen - @@output.write "\e[2J" - @@output.write "\e[1;1H" - end - - @@old_winch_handler = nil - def self.set_winch_handler(&handler) - @@old_winch_handler = Signal.trap('WINCH', &handler) - end - - def self.prep - retrieve_keybuffer - nil - end - - def self.deprep(otio) - Signal.trap('WINCH', @@old_winch_handler) if @@old_winch_handler - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/config.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/config.rb deleted file mode 100644 index 8772639..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/config.rb +++ /dev/null @@ -1,401 +0,0 @@ -class Reline::Config - attr_reader :test_mode - - KEYSEQ_PATTERN = /\\(?:C|Control)-[A-Za-z_]|\\(?:M|Meta)-[0-9A-Za-z_]|\\(?:C|Control)-(?:M|Meta)-[A-Za-z_]|\\(?:M|Meta)-(?:C|Control)-[A-Za-z_]|\\e|\\[\\\"\'abdfnrtv]|\\\d{1,3}|\\x\h{1,2}|./ - - class InvalidInputrc < RuntimeError - attr_accessor :file, :lineno - end - - VARIABLE_NAMES = %w{ - bind-tty-special-chars - blink-matching-paren - byte-oriented - completion-ignore-case - convert-meta - disable-completion - enable-keypad - expand-tilde - history-preserve-point - history-size - horizontal-scroll-mode - input-meta - keyseq-timeout - mark-directories - mark-modified-lines - mark-symlinked-directories - match-hidden-files - meta-flag - output-meta - page-completions - prefer-visible-bell - print-completions-horizontally - show-all-if-ambiguous - show-all-if-unmodified - visible-stats - show-mode-in-prompt - vi-cmd-mode-string - vi-ins-mode-string - emacs-mode-string - enable-bracketed-paste - isearch-terminators - } - VARIABLE_NAME_SYMBOLS = VARIABLE_NAMES.map { |v| :"#{v.tr(?-, ?_)}" } - VARIABLE_NAME_SYMBOLS.each do |v| - attr_accessor v - end - - attr_accessor :autocompletion - - def initialize - @additional_key_bindings = {} # from inputrc - @additional_key_bindings[:emacs] = {} - @additional_key_bindings[:vi_insert] = {} - @additional_key_bindings[:vi_command] = {} - @oneshot_key_bindings = {} - @skip_section = nil - @if_stack = nil - @editing_mode_label = :emacs - @keymap_label = :emacs - @keymap_prefix = [] - @key_actors = {} - @key_actors[:emacs] = Reline::KeyActor::Emacs.new - @key_actors[:vi_insert] = Reline::KeyActor::ViInsert.new - @key_actors[:vi_command] = Reline::KeyActor::ViCommand.new - @vi_cmd_mode_string = '(cmd)' - @vi_ins_mode_string = '(ins)' - @emacs_mode_string = '@' - # https://tiswww.case.edu/php/chet/readline/readline.html#IDX25 - @history_size = -1 # unlimited - @keyseq_timeout = 500 - @test_mode = false - @autocompletion = false - @convert_meta = true if seven_bit_encoding?(Reline::IOGate.encoding) - end - - def reset - if editing_mode_is?(:vi_command) - @editing_mode_label = :vi_insert - end - @additional_key_bindings.keys.each do |key| - @additional_key_bindings[key].clear - end - @oneshot_key_bindings.clear - reset_default_key_bindings - end - - def editing_mode - @key_actors[@editing_mode_label] - end - - def editing_mode=(val) - @editing_mode_label = val - end - - def editing_mode_is?(*val) - val.any?(@editing_mode_label) - end - - def keymap - @key_actors[@keymap_label] - end - - def inputrc_path - case ENV['INPUTRC'] - when nil, '' - else - return File.expand_path(ENV['INPUTRC']) - end - - # In the XDG Specification, if ~/.config/readline/inputrc exists, then - # ~/.inputrc should not be read, but for compatibility with GNU Readline, - # if ~/.inputrc exists, then it is given priority. - home_rc_path = File.expand_path('~/.inputrc') - return home_rc_path if File.exist?(home_rc_path) - - case path = ENV['XDG_CONFIG_HOME'] - when nil, '' - else - path = File.join(path, 'readline/inputrc') - return path if File.exist?(path) and path == File.expand_path(path) - end - - path = File.expand_path('~/.config/readline/inputrc') - return path if File.exist?(path) - - return home_rc_path - end - - private def default_inputrc_path - @default_inputrc_path ||= inputrc_path - end - - def read(file = nil) - file ||= default_inputrc_path - begin - if file.respond_to?(:readlines) - lines = file.readlines - else - lines = File.readlines(file) - end - rescue Errno::ENOENT - return nil - end - - read_lines(lines, file) - self - rescue InvalidInputrc => e - warn e.message - nil - end - - def key_bindings - # The key bindings for each editing mode will be overwritten by the user-defined ones. - kb = @key_actors[@editing_mode_label].default_key_bindings.dup - kb.merge!(@additional_key_bindings[@editing_mode_label]) - kb.merge!(@oneshot_key_bindings) - kb - end - - def add_oneshot_key_binding(keystroke, target) - @oneshot_key_bindings[keystroke] = target - end - - def reset_oneshot_key_bindings - @oneshot_key_bindings.clear - end - - def add_default_key_binding_by_keymap(keymap, keystroke, target) - @key_actors[keymap].default_key_bindings[keystroke] = target - end - - def add_default_key_binding(keystroke, target) - @key_actors[@keymap_label].default_key_bindings[keystroke] = target - end - - def reset_default_key_bindings - @key_actors.values.each do |ka| - ka.reset_default_key_bindings - end - end - - def read_lines(lines, file = nil) - if not lines.empty? and lines.first.encoding != Reline.encoding_system_needs - begin - lines = lines.map do |l| - l.encode(Reline.encoding_system_needs) - rescue Encoding::UndefinedConversionError - mes = "The inputrc encoded in #{lines.first.encoding.name} can't be converted to the locale #{Reline.encoding_system_needs.name}." - raise Reline::ConfigEncodingConversionError.new(mes) - end - end - end - conditions = [@skip_section, @if_stack] - @skip_section = nil - @if_stack = [] - - lines.each_with_index do |line, no| - next if line.match(/\A\s*#/) - - no += 1 - - line = line.chomp.lstrip - if line.start_with?('$') - handle_directive(line[1..-1], file, no) - next - end - - next if @skip_section - - case line - when /^set +([^ ]+) +([^ ]+)/i - var, value = $1.downcase, $2 - bind_variable(var, value) - next - when /\s*("#{KEYSEQ_PATTERN}+")\s*:\s*(.*)\s*$/o - key, func_name = $1, $2 - keystroke, func = bind_key(key, func_name) - next unless keystroke - @additional_key_bindings[@keymap_label][@keymap_prefix + keystroke] = func - end - end - unless @if_stack.empty? - raise InvalidInputrc, "#{file}:#{@if_stack.last[1]}: unclosed if" - end - ensure - @skip_section, @if_stack = conditions - end - - def handle_directive(directive, file, no) - directive, args = directive.split(' ') - case directive - when 'if' - condition = false - case args - when 'mode' - when 'term' - when 'version' - else # application name - condition = true if args == 'Ruby' - condition = true if args == 'Reline' - end - @if_stack << [file, no, @skip_section] - @skip_section = !condition - when 'else' - if @if_stack.empty? - raise InvalidInputrc, "#{file}:#{no}: unmatched else" - end - @skip_section = !@skip_section - when 'endif' - if @if_stack.empty? - raise InvalidInputrc, "#{file}:#{no}: unmatched endif" - end - @skip_section = @if_stack.pop - when 'include' - read(args) - end - end - - def bind_variable(name, value) - case name - when 'history-size' - begin - @history_size = Integer(value) - rescue ArgumentError - @history_size = 500 - end - when 'bell-style' - @bell_style = - case value - when 'none', 'off' - :none - when 'audible', 'on' - :audible - when 'visible' - :visible - else - :audible - end - when 'comment-begin' - @comment_begin = value.dup - when 'completion-query-items' - @completion_query_items = value.to_i - when 'isearch-terminators' - @isearch_terminators = retrieve_string(value) - when 'editing-mode' - case value - when 'emacs' - @editing_mode_label = :emacs - @keymap_label = :emacs - @keymap_prefix = [] - when 'vi' - @editing_mode_label = :vi_insert - @keymap_label = :vi_insert - @keymap_prefix = [] - end - when 'keymap' - case value - when 'emacs', 'emacs-standard' - @keymap_label = :emacs - @keymap_prefix = [] - when 'emacs-ctlx' - @keymap_label = :emacs - @keymap_prefix = [?\C-x.ord] - when 'emacs-meta' - @keymap_label = :emacs - @keymap_prefix = [?\e.ord] - when 'vi', 'vi-move', 'vi-command' - @keymap_label = :vi_command - @keymap_prefix = [] - when 'vi-insert' - @keymap_label = :vi_insert - @keymap_prefix = [] - end - when 'keyseq-timeout' - @keyseq_timeout = value.to_i - when 'show-mode-in-prompt' - case value - when 'off' - @show_mode_in_prompt = false - when 'on' - @show_mode_in_prompt = true - else - @show_mode_in_prompt = false - end - when 'vi-cmd-mode-string' - @vi_cmd_mode_string = retrieve_string(value) - when 'vi-ins-mode-string' - @vi_ins_mode_string = retrieve_string(value) - when 'emacs-mode-string' - @emacs_mode_string = retrieve_string(value) - when *VARIABLE_NAMES then - variable_name = :"@#{name.tr(?-, ?_)}" - instance_variable_set(variable_name, value.nil? || value == '1' || value == 'on') - end - end - - def retrieve_string(str) - str = $1 if str =~ /\A"(.*)"\z/ - parse_keyseq(str).map { |c| c.chr(Reline.encoding_system_needs) }.join - end - - def bind_key(key, func_name) - if key =~ /\A"(.*)"\z/ - keyseq = parse_keyseq($1) - else - keyseq = nil - end - if func_name =~ /"(.*)"/ - func = parse_keyseq($1) - else - func = func_name.tr(?-, ?_).to_sym # It must be macro. - end - [keyseq, func] - end - - def key_notation_to_code(notation) - case notation - when /\\(?:C|Control)-([A-Za-z_])/ - (1 + $1.downcase.ord - ?a.ord) - when /\\(?:M|Meta)-([0-9A-Za-z_])/ - modified_key = $1 - case $1 - when /[0-9]/ - ?\M-0.bytes.first + (modified_key.ord - ?0.ord) - when /[A-Z]/ - ?\M-A.bytes.first + (modified_key.ord - ?A.ord) - when /[a-z]/ - ?\M-a.bytes.first + (modified_key.ord - ?a.ord) - end - when /\\(?:C|Control)-(?:M|Meta)-[A-Za-z_]/, /\\(?:M|Meta)-(?:C|Control)-[A-Za-z_]/ - # 129 M-^A - when /\\(\d{1,3})/ then $1.to_i(8) # octal - when /\\x(\h{1,2})/ then $1.to_i(16) # hexadecimal - when "\\e" then ?\e.ord - when "\\\\" then ?\\.ord - when "\\\"" then ?".ord - when "\\'" then ?'.ord - when "\\a" then ?\a.ord - when "\\b" then ?\b.ord - when "\\d" then ?\d.ord - when "\\f" then ?\f.ord - when "\\n" then ?\n.ord - when "\\r" then ?\r.ord - when "\\t" then ?\t.ord - when "\\v" then ?\v.ord - else notation.ord - end - end - - def parse_keyseq(str) - ret = [] - str.scan(KEYSEQ_PATTERN) do - ret << key_notation_to_code($&) - end - ret - end - - private def seven_bit_encoding?(encoding) - encoding == Encoding::US_ASCII - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/general_io.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/general_io.rb deleted file mode 100644 index 9929846..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/general_io.rb +++ /dev/null @@ -1,113 +0,0 @@ -require 'timeout' -require 'io/wait' - -class Reline::GeneralIO - def self.reset(encoding: nil) - @@pasting = false - @@encoding = encoding - end - - def self.encoding - if defined?(@@encoding) - @@encoding - elsif RUBY_PLATFORM =~ /mswin|mingw/ - Encoding::UTF_8 - else - Encoding::default_external - end - end - - def self.win? - false - end - - def self.set_default_key_bindings(_) - end - - @@buf = [] - @@input = STDIN - - def self.input=(val) - @@input = val - end - - def self.with_raw_input - yield - end - - def self.getc - unless @@buf.empty? - return @@buf.shift - end - c = nil - loop do - result = @@input.wait_readable(0.1) - next if result.nil? - c = @@input.read(1) - break - end - c&.ord - end - - def self.ungetc(c) - @@buf.unshift(c) - end - - def self.get_screen_size - [1, 1] - end - - def self.cursor_pos - Reline::CursorPos.new(1, 1) - end - - def self.hide_cursor - end - - def self.show_cursor - end - - def self.move_cursor_column(val) - end - - def self.move_cursor_up(val) - end - - def self.move_cursor_down(val) - end - - def self.erase_after_cursor - end - - def self.scroll_down(val) - end - - def self.clear_screen - end - - def self.set_screen_size(rows, columns) - end - - def self.set_winch_handler(&handler) - end - - @@pasting = false - - def self.in_pasting? - @@pasting - end - - def self.start_pasting - @@pasting = true - end - - def self.finish_pasting - @@pasting = false - end - - def self.prep - end - - def self.deprep(otio) - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/history.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/history.rb deleted file mode 100644 index 7a1ed6b..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/history.rb +++ /dev/null @@ -1,76 +0,0 @@ -class Reline::History < Array - def initialize(config) - @config = config - end - - def to_s - 'HISTORY' - end - - def delete_at(index) - index = check_index(index) - super(index) - end - - def [](index) - index = check_index(index) unless index.is_a?(Range) - super(index) - end - - def []=(index, val) - index = check_index(index) - super(index, String.new(val, encoding: Reline.encoding_system_needs)) - end - - def concat(*val) - val.each do |v| - push(*v) - end - end - - def push(*val) - # If history_size is zero, all histories are dropped. - return self if @config.history_size.zero? - # If history_size is negative, history size is unlimited. - if @config.history_size.positive? - diff = size + val.size - @config.history_size - if diff > 0 - if diff <= size - shift(diff) - else - diff -= size - clear - val.shift(diff) - end - end - end - super(*(val.map{ |v| - String.new(v, encoding: Reline.encoding_system_needs) - })) - end - - def <<(val) - # If history_size is zero, all histories are dropped. - return self if @config.history_size.zero? - # If history_size is negative, history size is unlimited. - if @config.history_size.positive? - shift if size + 1 > @config.history_size - end - super(String.new(val, encoding: Reline.encoding_system_needs)) - end - - private def check_index(index) - index += size if index < 0 - if index < -2147483648 or 2147483647 < index - raise RangeError.new("integer #{index} too big to convert to `int'") - end - # If history_size is negative, history size is unlimited. - if @config.history_size.positive? - if index < -@config.history_size or @config.history_size < index - raise RangeError.new("index=<#{index}>") - end - end - raise IndexError.new("index=<#{index}>") if index < 0 or size <= index - index - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor.rb deleted file mode 100644 index ebe09d2..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Reline::KeyActor -end - -require 'reline/key_actor/base' -require 'reline/key_actor/emacs' -require 'reline/key_actor/vi_command' -require 'reline/key_actor/vi_insert' diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/base.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/base.rb deleted file mode 100644 index a1cd7fb..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/base.rb +++ /dev/null @@ -1,19 +0,0 @@ -class Reline::KeyActor::Base - MAPPING = Array.new(256) - - def get_method(key) - self.class::MAPPING[key] - end - - def initialize - @default_key_bindings = {} - end - - def default_key_bindings - @default_key_bindings - end - - def reset_default_key_bindings - @default_key_bindings.clear - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/emacs.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/emacs.rb deleted file mode 100644 index a561fee..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/emacs.rb +++ /dev/null @@ -1,517 +0,0 @@ -class Reline::KeyActor::Emacs < Reline::KeyActor::Base - MAPPING = [ - # 0 ^@ - :em_set_mark, - # 1 ^A - :ed_move_to_beg, - # 2 ^B - :ed_prev_char, - # 3 ^C - :ed_ignore, - # 4 ^D - :em_delete, - # 5 ^E - :ed_move_to_end, - # 6 ^F - :ed_next_char, - # 7 ^G - :ed_unassigned, - # 8 ^H - :em_delete_prev_char, - # 9 ^I - :ed_unassigned, - # 10 ^J - :ed_newline, - # 11 ^K - :ed_kill_line, - # 12 ^L - :ed_clear_screen, - # 13 ^M - :ed_newline, - # 14 ^N - :ed_next_history, - # 15 ^O - :ed_ignore, - # 16 ^P - :ed_prev_history, - # 17 ^Q - :ed_quoted_insert, - # 18 ^R - :vi_search_prev, - # 19 ^S - :vi_search_next, - # 20 ^T - :ed_transpose_chars, - # 21 ^U - :unix_line_discard, - # 22 ^V - :ed_quoted_insert, - # 23 ^W - :em_kill_region, - # 24 ^X - :ed_sequence_lead_in, - # 25 ^Y - :em_yank, - # 26 ^Z - :ed_ignore, - # 27 ^[ - :em_meta_next, - # 28 ^\ - :ed_ignore, - # 29 ^] - :ed_ignore, - # 30 ^^ - :ed_unassigned, - # 31 ^_ - :ed_unassigned, - # 32 SPACE - :ed_insert, - # 33 ! - :ed_insert, - # 34 " - :ed_insert, - # 35 # - :ed_insert, - # 36 $ - :ed_insert, - # 37 % - :ed_insert, - # 38 & - :ed_insert, - # 39 ' - :ed_insert, - # 40 ( - :ed_insert, - # 41 ) - :ed_insert, - # 42 * - :ed_insert, - # 43 + - :ed_insert, - # 44 , - :ed_insert, - # 45 - - :ed_insert, - # 46 . - :ed_insert, - # 47 / - :ed_insert, - # 48 0 - :ed_digit, - # 49 1 - :ed_digit, - # 50 2 - :ed_digit, - # 51 3 - :ed_digit, - # 52 4 - :ed_digit, - # 53 5 - :ed_digit, - # 54 6 - :ed_digit, - # 55 7 - :ed_digit, - # 56 8 - :ed_digit, - # 57 9 - :ed_digit, - # 58 : - :ed_insert, - # 59 ; - :ed_insert, - # 60 < - :ed_insert, - # 61 = - :ed_insert, - # 62 > - :ed_insert, - # 63 ? - :ed_insert, - # 64 @ - :ed_insert, - # 65 A - :ed_insert, - # 66 B - :ed_insert, - # 67 C - :ed_insert, - # 68 D - :ed_insert, - # 69 E - :ed_insert, - # 70 F - :ed_insert, - # 71 G - :ed_insert, - # 72 H - :ed_insert, - # 73 I - :ed_insert, - # 74 J - :ed_insert, - # 75 K - :ed_insert, - # 76 L - :ed_insert, - # 77 M - :ed_insert, - # 78 N - :ed_insert, - # 79 O - :ed_insert, - # 80 P - :ed_insert, - # 81 Q - :ed_insert, - # 82 R - :ed_insert, - # 83 S - :ed_insert, - # 84 T - :ed_insert, - # 85 U - :ed_insert, - # 86 V - :ed_insert, - # 87 W - :ed_insert, - # 88 X - :ed_insert, - # 89 Y - :ed_insert, - # 90 Z - :ed_insert, - # 91 [ - :ed_insert, - # 92 \ - :ed_insert, - # 93 ] - :ed_insert, - # 94 ^ - :ed_insert, - # 95 _ - :ed_insert, - # 96 ` - :ed_insert, - # 97 a - :ed_insert, - # 98 b - :ed_insert, - # 99 c - :ed_insert, - # 100 d - :ed_insert, - # 101 e - :ed_insert, - # 102 f - :ed_insert, - # 103 g - :ed_insert, - # 104 h - :ed_insert, - # 105 i - :ed_insert, - # 106 j - :ed_insert, - # 107 k - :ed_insert, - # 108 l - :ed_insert, - # 109 m - :ed_insert, - # 110 n - :ed_insert, - # 111 o - :ed_insert, - # 112 p - :ed_insert, - # 113 q - :ed_insert, - # 114 r - :ed_insert, - # 115 s - :ed_insert, - # 116 t - :ed_insert, - # 117 u - :ed_insert, - # 118 v - :ed_insert, - # 119 w - :ed_insert, - # 120 x - :ed_insert, - # 121 y - :ed_insert, - # 122 z - :ed_insert, - # 123 { - :ed_insert, - # 124 | - :ed_insert, - # 125 } - :ed_insert, - # 126 ~ - :ed_insert, - # 127 ^? - :em_delete_prev_char, - # 128 M-^@ - :ed_unassigned, - # 129 M-^A - :ed_unassigned, - # 130 M-^B - :ed_unassigned, - # 131 M-^C - :ed_unassigned, - # 132 M-^D - :ed_unassigned, - # 133 M-^E - :ed_unassigned, - # 134 M-^F - :ed_unassigned, - # 135 M-^G - :ed_unassigned, - # 136 M-^H - :ed_delete_prev_word, - # 137 M-^I - :ed_unassigned, - # 138 M-^J - :key_newline, - # 139 M-^K - :ed_unassigned, - # 140 M-^L - :ed_clear_screen, - # 141 M-^M - :key_newline, - # 142 M-^N - :ed_unassigned, - # 143 M-^O - :ed_unassigned, - # 144 M-^P - :ed_unassigned, - # 145 M-^Q - :ed_unassigned, - # 146 M-^R - :ed_unassigned, - # 147 M-^S - :ed_unassigned, - # 148 M-^T - :ed_unassigned, - # 149 M-^U - :ed_unassigned, - # 150 M-^V - :ed_unassigned, - # 151 M-^W - :ed_unassigned, - # 152 M-^X - :ed_unassigned, - # 153 M-^Y - :em_yank_pop, - # 154 M-^Z - :ed_unassigned, - # 155 M-^[ - :ed_unassigned, - # 156 M-^\ - :ed_unassigned, - # 157 M-^] - :ed_unassigned, - # 158 M-^^ - :ed_unassigned, - # 159 M-^_ - :em_copy_prev_word, - # 160 M-SPACE - :ed_unassigned, - # 161 M-! - :ed_unassigned, - # 162 M-" - :ed_unassigned, - # 163 M-# - :ed_unassigned, - # 164 M-$ - :ed_unassigned, - # 165 M-% - :ed_unassigned, - # 166 M-& - :ed_unassigned, - # 167 M-' - :ed_unassigned, - # 168 M-( - :ed_unassigned, - # 169 M-) - :ed_unassigned, - # 170 M-* - :ed_unassigned, - # 171 M-+ - :ed_unassigned, - # 172 M-, - :ed_unassigned, - # 173 M-- - :ed_unassigned, - # 174 M-. - :ed_unassigned, - # 175 M-/ - :ed_unassigned, - # 176 M-0 - :ed_argument_digit, - # 177 M-1 - :ed_argument_digit, - # 178 M-2 - :ed_argument_digit, - # 179 M-3 - :ed_argument_digit, - # 180 M-4 - :ed_argument_digit, - # 181 M-5 - :ed_argument_digit, - # 182 M-6 - :ed_argument_digit, - # 183 M-7 - :ed_argument_digit, - # 184 M-8 - :ed_argument_digit, - # 185 M-9 - :ed_argument_digit, - # 186 M-: - :ed_unassigned, - # 187 M-; - :ed_unassigned, - # 188 M-< - :ed_unassigned, - # 189 M-= - :ed_unassigned, - # 190 M-> - :ed_unassigned, - # 191 M-? - :ed_unassigned, - # 192 M-@ - :ed_unassigned, - # 193 M-A - :ed_unassigned, - # 194 M-B - :ed_prev_word, - # 195 M-C - :em_capitol_case, - # 196 M-D - :em_delete_next_word, - # 197 M-E - :ed_unassigned, - # 198 M-F - :em_next_word, - # 199 M-G - :ed_unassigned, - # 200 M-H - :ed_unassigned, - # 201 M-I - :ed_unassigned, - # 202 M-J - :ed_unassigned, - # 203 M-K - :ed_unassigned, - # 204 M-L - :em_lower_case, - # 205 M-M - :ed_unassigned, - # 206 M-N - :vi_search_next, - # 207 M-O - :ed_sequence_lead_in, - # 208 M-P - :vi_search_prev, - # 209 M-Q - :ed_unassigned, - # 210 M-R - :ed_unassigned, - # 211 M-S - :ed_unassigned, - # 212 M-T - :ed_unassigned, - # 213 M-U - :em_upper_case, - # 214 M-V - :ed_unassigned, - # 215 M-W - :em_copy_region, - # 216 M-X - :ed_command, - # 217 M-Y - :ed_unassigned, - # 218 M-Z - :ed_unassigned, - # 219 M-[ - :ed_sequence_lead_in, - # 220 M-\ - :ed_unassigned, - # 221 M-] - :ed_unassigned, - # 222 M-^ - :ed_unassigned, - # 223 M-_ - :ed_unassigned, - # 224 M-` - :ed_unassigned, - # 225 M-a - :ed_unassigned, - # 226 M-b - :ed_prev_word, - # 227 M-c - :em_capitol_case, - # 228 M-d - :em_delete_next_word, - # 229 M-e - :ed_unassigned, - # 230 M-f - :em_next_word, - # 231 M-g - :ed_unassigned, - # 232 M-h - :ed_unassigned, - # 233 M-i - :ed_unassigned, - # 234 M-j - :ed_unassigned, - # 235 M-k - :ed_unassigned, - # 236 M-l - :em_lower_case, - # 237 M-m - :ed_unassigned, - # 238 M-n - :vi_search_next, - # 239 M-o - :ed_unassigned, - # 240 M-p - :vi_search_prev, - # 241 M-q - :ed_unassigned, - # 242 M-r - :ed_unassigned, - # 243 M-s - :ed_unassigned, - # 244 M-t - :ed_transpose_words, - # 245 M-u - :em_upper_case, - # 246 M-v - :ed_unassigned, - # 247 M-w - :em_copy_region, - # 248 M-x - :ed_command, - # 249 M-y - :ed_unassigned, - # 250 M-z - :ed_unassigned, - # 251 M-{ - :ed_unassigned, - # 252 M-| - :ed_unassigned, - # 253 M-} - :ed_unassigned, - # 254 M-~ - :ed_unassigned, - # 255 M-^? - :ed_delete_prev_word - # EOF - ] -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/vi_command.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/vi_command.rb deleted file mode 100644 index 98146d2..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/vi_command.rb +++ /dev/null @@ -1,518 +0,0 @@ -class Reline::KeyActor::ViCommand < Reline::KeyActor::Base - MAPPING = [ - # 0 ^@ - :ed_unassigned, - # 1 ^A - :ed_move_to_beg, - # 2 ^B - :ed_unassigned, - # 3 ^C - :ed_ignore, - # 4 ^D - :vi_end_of_transmission, - # 5 ^E - :ed_move_to_end, - # 6 ^F - :ed_unassigned, - # 7 ^G - :ed_unassigned, - # 8 ^H - :ed_unassigned, - # 9 ^I - :ed_unassigned, - # 10 ^J - :ed_newline, - # 11 ^K - :ed_kill_line, - # 12 ^L - :ed_clear_screen, - # 13 ^M - :ed_newline, - # 14 ^N - :ed_next_history, - # 15 ^O - :ed_ignore, - # 16 ^P - :ed_prev_history, - # 17 ^Q - :ed_ignore, - # 18 ^R - :vi_search_prev, - # 19 ^S - :ed_ignore, - # 20 ^T - :ed_unassigned, - # 21 ^U - :vi_kill_line_prev, - # 22 ^V - :ed_quoted_insert, - # 23 ^W - :ed_delete_prev_word, - # 24 ^X - :ed_unassigned, - # 25 ^Y - :ed_unassigned, - # 26 ^Z - :ed_unassigned, - # 27 ^[ - :ed_unassigned, - # 28 ^\ - :ed_ignore, - # 29 ^] - :ed_unassigned, - # 30 ^^ - :ed_unassigned, - # 31 ^_ - :ed_unassigned, - # 32 SPACE - :ed_next_char, - # 33 ! - :ed_unassigned, - # 34 " - :ed_unassigned, - # 35 # - :vi_comment_out, - # 36 $ - :ed_move_to_end, - # 37 % - :vi_match, - # 38 & - :ed_unassigned, - # 39 ' - :ed_unassigned, - # 40 ( - :ed_unassigned, - # 41 ) - :ed_unassigned, - # 42 * - :ed_unassigned, - # 43 + - :ed_next_history, - # 44 , - :vi_repeat_prev_char, - # 45 - - :ed_prev_history, - # 46 . - :vi_redo, - # 47 / - :vi_search_prev, - # 48 0 - :vi_zero, - # 49 1 - :ed_argument_digit, - # 50 2 - :ed_argument_digit, - # 51 3 - :ed_argument_digit, - # 52 4 - :ed_argument_digit, - # 53 5 - :ed_argument_digit, - # 54 6 - :ed_argument_digit, - # 55 7 - :ed_argument_digit, - # 56 8 - :ed_argument_digit, - # 57 9 - :ed_argument_digit, - # 58 : - :ed_command, - # 59 ; - :vi_repeat_next_char, - # 60 < - :ed_unassigned, - # 61 = - :ed_unassigned, - # 62 > - :ed_unassigned, - # 63 ? - :vi_search_next, - # 64 @ - :vi_alias, - # 65 A - :vi_add_at_eol, - # 66 B - :vi_prev_big_word, - # 67 C - :vi_change_to_eol, - # 68 D - :ed_kill_line, - # 69 E - :vi_end_big_word, - # 70 F - :vi_prev_char, - # 71 G - :vi_to_history_line, - # 72 H - :ed_unassigned, - # 73 I - :vi_insert_at_bol, - # 74 J - :vi_join_lines, - # 75 K - :vi_search_prev, - # 76 L - :ed_unassigned, - # 77 M - :ed_unassigned, - # 78 N - :vi_repeat_search_prev, - # 79 O - :ed_sequence_lead_in, - # 80 P - :vi_paste_prev, - # 81 Q - :ed_unassigned, - # 82 R - :vi_replace_mode, - # 83 S - :vi_substitute_line, - # 84 T - :vi_to_prev_char, - # 85 U - :vi_undo_line, - # 86 V - :ed_unassigned, - # 87 W - :vi_next_big_word, - # 88 X - :ed_delete_prev_char, - # 89 Y - :vi_yank_end, - # 90 Z - :ed_unassigned, - # 91 [ - :ed_sequence_lead_in, - # 92 \ - :ed_unassigned, - # 93 ] - :ed_unassigned, - # 94 ^ - :vi_first_print, - # 95 _ - :vi_history_word, - # 96 ` - :ed_unassigned, - # 97 a - :vi_add, - # 98 b - :vi_prev_word, - # 99 c - :vi_change_meta, - # 100 d - :vi_delete_meta, - # 101 e - :vi_end_word, - # 102 f - :vi_next_char, - # 103 g - :ed_unassigned, - # 104 h - :ed_prev_char, - # 105 i - :vi_insert, - # 106 j - :ed_next_history, - # 107 k - :ed_prev_history, - # 108 l - :ed_next_char, - # 109 m - :ed_unassigned, - # 110 n - :vi_repeat_search_next, - # 111 o - :ed_unassigned, - # 112 p - :vi_paste_next, - # 113 q - :ed_unassigned, - # 114 r - :vi_replace_char, - # 115 s - :vi_substitute_char, - # 116 t - :vi_to_next_char, - # 117 u - :vi_undo, - # 118 v - :vi_histedit, - # 119 w - :vi_next_word, - # 120 x - :ed_delete_next_char, - # 121 y - :vi_yank, - # 122 z - :ed_unassigned, - # 123 { - :ed_unassigned, - # 124 | - :vi_to_column, - # 125 } - :ed_unassigned, - # 126 ~ - :vi_change_case, - # 127 ^? - :ed_unassigned, - # 128 M-^@ - :ed_unassigned, - # 129 M-^A - :ed_unassigned, - # 130 M-^B - :ed_unassigned, - # 131 M-^C - :ed_unassigned, - # 132 M-^D - :ed_unassigned, - # 133 M-^E - :ed_unassigned, - # 134 M-^F - :ed_unassigned, - # 135 M-^G - :ed_unassigned, - # 136 M-^H - :ed_unassigned, - # 137 M-^I - :ed_unassigned, - # 138 M-^J - :ed_unassigned, - # 139 M-^K - :ed_unassigned, - # 140 M-^L - :ed_unassigned, - # 141 M-^M - :ed_unassigned, - # 142 M-^N - :ed_unassigned, - # 143 M-^O - :ed_unassigned, - # 144 M-^P - :ed_unassigned, - # 145 M-^Q - :ed_unassigned, - # 146 M-^R - :ed_unassigned, - # 147 M-^S - :ed_unassigned, - # 148 M-^T - :ed_unassigned, - # 149 M-^U - :ed_unassigned, - # 150 M-^V - :ed_unassigned, - # 151 M-^W - :ed_unassigned, - # 152 M-^X - :ed_unassigned, - # 153 M-^Y - :ed_unassigned, - # 154 M-^Z - :ed_unassigned, - # 155 M-^[ - :ed_unassigned, - # 156 M-^\ - :ed_unassigned, - # 157 M-^] - :ed_unassigned, - # 158 M-^^ - :ed_unassigned, - # 159 M-^_ - :ed_unassigned, - # 160 M-SPACE - :ed_unassigned, - # 161 M-! - :ed_unassigned, - # 162 M-" - :ed_unassigned, - # 163 M-# - :ed_unassigned, - # 164 M-$ - :ed_unassigned, - # 165 M-% - :ed_unassigned, - # 166 M-& - :ed_unassigned, - # 167 M-' - :ed_unassigned, - # 168 M-( - :ed_unassigned, - # 169 M-) - :ed_unassigned, - # 170 M-* - :ed_unassigned, - # 171 M-+ - :ed_unassigned, - # 172 M-, - :ed_unassigned, - # 173 M-- - :ed_unassigned, - # 174 M-. - :ed_unassigned, - # 175 M-/ - :ed_unassigned, - # 176 M-0 - :ed_unassigned, - # 177 M-1 - :ed_unassigned, - # 178 M-2 - :ed_unassigned, - # 179 M-3 - :ed_unassigned, - # 180 M-4 - :ed_unassigned, - # 181 M-5 - :ed_unassigned, - # 182 M-6 - :ed_unassigned, - # 183 M-7 - :ed_unassigned, - # 184 M-8 - :ed_unassigned, - # 185 M-9 - :ed_unassigned, - # 186 M-: - :ed_unassigned, - # 187 M-; - :ed_unassigned, - # 188 M-< - :ed_unassigned, - # 189 M-= - :ed_unassigned, - # 190 M-> - :ed_unassigned, - # 191 M-? - :ed_unassigned, - # 192 M-@ - :ed_unassigned, - # 193 M-A - :ed_unassigned, - # 194 M-B - :ed_unassigned, - # 195 M-C - :ed_unassigned, - # 196 M-D - :ed_unassigned, - # 197 M-E - :ed_unassigned, - # 198 M-F - :ed_unassigned, - # 199 M-G - :ed_unassigned, - # 200 M-H - :ed_unassigned, - # 201 M-I - :ed_unassigned, - # 202 M-J - :ed_unassigned, - # 203 M-K - :ed_unassigned, - # 204 M-L - :ed_unassigned, - # 205 M-M - :ed_unassigned, - # 206 M-N - :ed_unassigned, - # 207 M-O - :ed_sequence_lead_in, - # 208 M-P - :ed_unassigned, - # 209 M-Q - :ed_unassigned, - # 210 M-R - :ed_unassigned, - # 211 M-S - :ed_unassigned, - # 212 M-T - :ed_unassigned, - # 213 M-U - :ed_unassigned, - # 214 M-V - :ed_unassigned, - # 215 M-W - :ed_unassigned, - # 216 M-X - :ed_unassigned, - # 217 M-Y - :ed_unassigned, - # 218 M-Z - :ed_unassigned, - # 219 M-[ - :ed_sequence_lead_in, - # 220 M-\ - :ed_unassigned, - # 221 M-] - :ed_unassigned, - # 222 M-^ - :ed_unassigned, - # 223 M-_ - :ed_unassigned, - # 224 M-` - :ed_unassigned, - # 225 M-a - :ed_unassigned, - # 226 M-b - :ed_unassigned, - # 227 M-c - :ed_unassigned, - # 228 M-d - :ed_unassigned, - # 229 M-e - :ed_unassigned, - # 230 M-f - :ed_unassigned, - # 231 M-g - :ed_unassigned, - # 232 M-h - :ed_unassigned, - # 233 M-i - :ed_unassigned, - # 234 M-j - :ed_unassigned, - # 235 M-k - :ed_unassigned, - # 236 M-l - :ed_unassigned, - # 237 M-m - :ed_unassigned, - # 238 M-n - :ed_unassigned, - # 239 M-o - :ed_unassigned, - # 240 M-p - :ed_unassigned, - # 241 M-q - :ed_unassigned, - # 242 M-r - :ed_unassigned, - # 243 M-s - :ed_unassigned, - # 244 M-t - :ed_unassigned, - # 245 M-u - :ed_unassigned, - # 246 M-v - :ed_unassigned, - # 247 M-w - :ed_unassigned, - # 248 M-x - :ed_unassigned, - # 249 M-y - :ed_unassigned, - # 250 M-z - :ed_unassigned, - # 251 M-{ - :ed_unassigned, - # 252 M-| - :ed_unassigned, - # 253 M-} - :ed_unassigned, - # 254 M-~ - :ed_unassigned, - # 255 M-^? - :ed_unassigned - # EOF - ] -end - diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/vi_insert.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/vi_insert.rb deleted file mode 100644 index b8e89f8..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_actor/vi_insert.rb +++ /dev/null @@ -1,517 +0,0 @@ -class Reline::KeyActor::ViInsert < Reline::KeyActor::Base - MAPPING = [ - # 0 ^@ - :ed_unassigned, - # 1 ^A - :ed_insert, - # 2 ^B - :ed_insert, - # 3 ^C - :ed_insert, - # 4 ^D - :vi_list_or_eof, - # 5 ^E - :ed_insert, - # 6 ^F - :ed_insert, - # 7 ^G - :ed_insert, - # 8 ^H - :vi_delete_prev_char, - # 9 ^I - :ed_insert, - # 10 ^J - :ed_newline, - # 11 ^K - :ed_insert, - # 12 ^L - :ed_insert, - # 13 ^M - :ed_newline, - # 14 ^N - :ed_insert, - # 15 ^O - :ed_insert, - # 16 ^P - :ed_insert, - # 17 ^Q - :ed_ignore, - # 18 ^R - :vi_search_prev, - # 19 ^S - :vi_search_next, - # 20 ^T - :ed_insert, - # 21 ^U - :vi_kill_line_prev, - # 22 ^V - :ed_quoted_insert, - # 23 ^W - :ed_delete_prev_word, - # 24 ^X - :ed_insert, - # 25 ^Y - :ed_insert, - # 26 ^Z - :ed_insert, - # 27 ^[ - :vi_command_mode, - # 28 ^\ - :ed_ignore, - # 29 ^] - :ed_insert, - # 30 ^^ - :ed_insert, - # 31 ^_ - :ed_insert, - # 32 SPACE - :ed_insert, - # 33 ! - :ed_insert, - # 34 " - :ed_insert, - # 35 # - :ed_insert, - # 36 $ - :ed_insert, - # 37 % - :ed_insert, - # 38 & - :ed_insert, - # 39 ' - :ed_insert, - # 40 ( - :ed_insert, - # 41 ) - :ed_insert, - # 42 * - :ed_insert, - # 43 + - :ed_insert, - # 44 , - :ed_insert, - # 45 - - :ed_insert, - # 46 . - :ed_insert, - # 47 / - :ed_insert, - # 48 0 - :ed_insert, - # 49 1 - :ed_insert, - # 50 2 - :ed_insert, - # 51 3 - :ed_insert, - # 52 4 - :ed_insert, - # 53 5 - :ed_insert, - # 54 6 - :ed_insert, - # 55 7 - :ed_insert, - # 56 8 - :ed_insert, - # 57 9 - :ed_insert, - # 58 : - :ed_insert, - # 59 ; - :ed_insert, - # 60 < - :ed_insert, - # 61 = - :ed_insert, - # 62 > - :ed_insert, - # 63 ? - :ed_insert, - # 64 @ - :ed_insert, - # 65 A - :ed_insert, - # 66 B - :ed_insert, - # 67 C - :ed_insert, - # 68 D - :ed_insert, - # 69 E - :ed_insert, - # 70 F - :ed_insert, - # 71 G - :ed_insert, - # 72 H - :ed_insert, - # 73 I - :ed_insert, - # 74 J - :ed_insert, - # 75 K - :ed_insert, - # 76 L - :ed_insert, - # 77 M - :ed_insert, - # 78 N - :ed_insert, - # 79 O - :ed_insert, - # 80 P - :ed_insert, - # 81 Q - :ed_insert, - # 82 R - :ed_insert, - # 83 S - :ed_insert, - # 84 T - :ed_insert, - # 85 U - :ed_insert, - # 86 V - :ed_insert, - # 87 W - :ed_insert, - # 88 X - :ed_insert, - # 89 Y - :ed_insert, - # 90 Z - :ed_insert, - # 91 [ - :ed_insert, - # 92 \ - :ed_insert, - # 93 ] - :ed_insert, - # 94 ^ - :ed_insert, - # 95 _ - :ed_insert, - # 96 ` - :ed_insert, - # 97 a - :ed_insert, - # 98 b - :ed_insert, - # 99 c - :ed_insert, - # 100 d - :ed_insert, - # 101 e - :ed_insert, - # 102 f - :ed_insert, - # 103 g - :ed_insert, - # 104 h - :ed_insert, - # 105 i - :ed_insert, - # 106 j - :ed_insert, - # 107 k - :ed_insert, - # 108 l - :ed_insert, - # 109 m - :ed_insert, - # 110 n - :ed_insert, - # 111 o - :ed_insert, - # 112 p - :ed_insert, - # 113 q - :ed_insert, - # 114 r - :ed_insert, - # 115 s - :ed_insert, - # 116 t - :ed_insert, - # 117 u - :ed_insert, - # 118 v - :ed_insert, - # 119 w - :ed_insert, - # 120 x - :ed_insert, - # 121 y - :ed_insert, - # 122 z - :ed_insert, - # 123 { - :ed_insert, - # 124 | - :ed_insert, - # 125 } - :ed_insert, - # 126 ~ - :ed_insert, - # 127 ^? - :vi_delete_prev_char, - # 128 M-^@ - :ed_unassigned, - # 129 M-^A - :ed_unassigned, - # 130 M-^B - :ed_unassigned, - # 131 M-^C - :ed_unassigned, - # 132 M-^D - :ed_unassigned, - # 133 M-^E - :ed_unassigned, - # 134 M-^F - :ed_unassigned, - # 135 M-^G - :ed_unassigned, - # 136 M-^H - :ed_unassigned, - # 137 M-^I - :ed_unassigned, - # 138 M-^J - :key_newline, - # 139 M-^K - :ed_unassigned, - # 140 M-^L - :ed_unassigned, - # 141 M-^M - :key_newline, - # 142 M-^N - :ed_unassigned, - # 143 M-^O - :ed_unassigned, - # 144 M-^P - :ed_unassigned, - # 145 M-^Q - :ed_unassigned, - # 146 M-^R - :ed_unassigned, - # 147 M-^S - :ed_unassigned, - # 148 M-^T - :ed_unassigned, - # 149 M-^U - :ed_unassigned, - # 150 M-^V - :ed_unassigned, - # 151 M-^W - :ed_unassigned, - # 152 M-^X - :ed_unassigned, - # 153 M-^Y - :ed_unassigned, - # 154 M-^Z - :ed_unassigned, - # 155 M-^[ - :ed_unassigned, - # 156 M-^\ - :ed_unassigned, - # 157 M-^] - :ed_unassigned, - # 158 M-^^ - :ed_unassigned, - # 159 M-^_ - :ed_unassigned, - # 160 M-SPACE - :ed_unassigned, - # 161 M-! - :ed_unassigned, - # 162 M-" - :ed_unassigned, - # 163 M-# - :ed_unassigned, - # 164 M-$ - :ed_unassigned, - # 165 M-% - :ed_unassigned, - # 166 M-& - :ed_unassigned, - # 167 M-' - :ed_unassigned, - # 168 M-( - :ed_unassigned, - # 169 M-) - :ed_unassigned, - # 170 M-* - :ed_unassigned, - # 171 M-+ - :ed_unassigned, - # 172 M-, - :ed_unassigned, - # 173 M-- - :ed_unassigned, - # 174 M-. - :ed_unassigned, - # 175 M-/ - :ed_unassigned, - # 176 M-0 - :ed_unassigned, - # 177 M-1 - :ed_unassigned, - # 178 M-2 - :ed_unassigned, - # 179 M-3 - :ed_unassigned, - # 180 M-4 - :ed_unassigned, - # 181 M-5 - :ed_unassigned, - # 182 M-6 - :ed_unassigned, - # 183 M-7 - :ed_unassigned, - # 184 M-8 - :ed_unassigned, - # 185 M-9 - :ed_unassigned, - # 186 M-: - :ed_unassigned, - # 187 M-; - :ed_unassigned, - # 188 M-< - :ed_unassigned, - # 189 M-= - :ed_unassigned, - # 190 M-> - :ed_unassigned, - # 191 M-? - :ed_unassigned, - # 192 M-@ - :ed_unassigned, - # 193 M-A - :ed_unassigned, - # 194 M-B - :ed_unassigned, - # 195 M-C - :ed_unassigned, - # 196 M-D - :ed_unassigned, - # 197 M-E - :ed_unassigned, - # 198 M-F - :ed_unassigned, - # 199 M-G - :ed_unassigned, - # 200 M-H - :ed_unassigned, - # 201 M-I - :ed_unassigned, - # 202 M-J - :ed_unassigned, - # 203 M-K - :ed_unassigned, - # 204 M-L - :ed_unassigned, - # 205 M-M - :ed_unassigned, - # 206 M-N - :ed_unassigned, - # 207 M-O - :ed_unassigned, - # 208 M-P - :ed_unassigned, - # 209 M-Q - :ed_unassigned, - # 210 M-R - :ed_unassigned, - # 211 M-S - :ed_unassigned, - # 212 M-T - :ed_unassigned, - # 213 M-U - :ed_unassigned, - # 214 M-V - :ed_unassigned, - # 215 M-W - :ed_unassigned, - # 216 M-X - :ed_unassigned, - # 217 M-Y - :ed_unassigned, - # 218 M-Z - :ed_unassigned, - # 219 M-[ - :ed_unassigned, - # 220 M-\ - :ed_unassigned, - # 221 M-] - :ed_unassigned, - # 222 M-^ - :ed_unassigned, - # 223 M-_ - :ed_unassigned, - # 224 M-` - :ed_unassigned, - # 225 M-a - :ed_unassigned, - # 226 M-b - :ed_unassigned, - # 227 M-c - :ed_unassigned, - # 228 M-d - :ed_unassigned, - # 229 M-e - :ed_unassigned, - # 230 M-f - :ed_unassigned, - # 231 M-g - :ed_unassigned, - # 232 M-h - :ed_unassigned, - # 233 M-i - :ed_unassigned, - # 234 M-j - :ed_unassigned, - # 235 M-k - :ed_unassigned, - # 236 M-l - :ed_unassigned, - # 237 M-m - :ed_unassigned, - # 238 M-n - :ed_unassigned, - # 239 M-o - :ed_unassigned, - # 240 M-p - :ed_unassigned, - # 241 M-q - :ed_unassigned, - # 242 M-r - :ed_unassigned, - # 243 M-s - :ed_unassigned, - # 244 M-t - :ed_unassigned, - # 245 M-u - :ed_unassigned, - # 246 M-v - :ed_unassigned, - # 247 M-w - :ed_unassigned, - # 248 M-x - :ed_unassigned, - # 249 M-y - :ed_unassigned, - # 250 M-z - :ed_unassigned, - # 251 M-{ - :ed_unassigned, - # 252 M-| - :ed_unassigned, - # 253 M-} - :ed_unassigned, - # 254 M-~ - :ed_unassigned, - # 255 M-^? - :ed_unassigned - # EOF - ] -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_stroke.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_stroke.rb deleted file mode 100644 index bceffbb..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/key_stroke.rb +++ /dev/null @@ -1,148 +0,0 @@ -class Reline::KeyStroke - ESC_BYTE = 27 - CSI_PARAMETER_BYTES_RANGE = 0x30..0x3f - CSI_INTERMEDIATE_BYTES_RANGE = (0x20..0x2f) - - def initialize(config) - @config = config - end - - def compress_meta_key(ary) - return ary unless @config.convert_meta - ary.inject([]) { |result, key| - if result.size > 0 and result.last == "\e".ord - result[result.size - 1] = Reline::Key.new(key, key | 0b10000000, true) - else - result << key - end - result - } - end - - def start_with?(me, other) - compressed_me = compress_meta_key(me) - compressed_other = compress_meta_key(other) - i = 0 - loop do - my_c = compressed_me[i] - other_c = compressed_other[i] - other_is_last = (i + 1) == compressed_other.size - me_is_last = (i + 1) == compressed_me.size - if my_c != other_c - if other_c == "\e".ord and other_is_last and my_c.is_a?(Reline::Key) and my_c.with_meta - return true - else - return false - end - elsif other_is_last - return true - elsif me_is_last - return false - end - i += 1 - end - end - - def equal?(me, other) - case me - when Array - compressed_me = compress_meta_key(me) - compressed_other = compress_meta_key(other) - compressed_me.size == compressed_other.size and [compressed_me, compressed_other].transpose.all?{ |i| equal?(i[0], i[1]) } - when Integer - if other.is_a?(Reline::Key) - if other.combined_char == "\e".ord - false - else - other.combined_char == me - end - else - me == other - end - when Reline::Key - if other.is_a?(Integer) - me.combined_char == other - else - me == other - end - end - end - - def match_status(input) - key_mapping.keys.select { |lhs| - start_with?(lhs, input) - }.tap { |it| - return :matched if it.size == 1 && equal?(it[0], input) - return :matching if it.size == 1 && !equal?(it[0], input) - return :matched if it.max_by(&:size)&.size&.< input.size - return :matching if it.size > 1 - } - if key_mapping.keys.any? { |lhs| start_with?(input, lhs) } - :matched - else - match_unknown_escape_sequence(input).first - end - end - - def expand(input) - lhs = key_mapping.keys.select { |item| start_with?(input, item) }.sort_by(&:size).last - unless lhs - status, size = match_unknown_escape_sequence(input) - case status - when :matched - return [:ed_unassigned] + expand(input.drop(size)) - when :matching - return [:ed_unassigned] - else - return input - end - end - rhs = key_mapping[lhs] - - case rhs - when String - rhs_bytes = rhs.bytes - expand(expand(rhs_bytes) + expand(input.drop(lhs.size))) - when Symbol - [rhs] + expand(input.drop(lhs.size)) - when Array - rhs - end - end - - private - - # returns match status of CSI/SS3 sequence and matched length - def match_unknown_escape_sequence(input) - idx = 0 - return [:unmatched, nil] unless input[idx] == ESC_BYTE - idx += 1 - idx += 1 if input[idx] == ESC_BYTE - - case input[idx] - when nil - return [:matching, nil] - when 91 # == '['.ord - # CSI sequence - idx += 1 - idx += 1 while idx < input.size && CSI_PARAMETER_BYTES_RANGE.cover?(input[idx]) - idx += 1 while idx < input.size && CSI_INTERMEDIATE_BYTES_RANGE.cover?(input[idx]) - input[idx] ? [:matched, idx + 1] : [:matching, nil] - when 79 # == 'O'.ord - # SS3 sequence - input[idx + 1] ? [:matched, idx + 2] : [:matching, nil] - else - if idx == 1 - # `ESC char`, make it :unmatched so that it will be handled correctly in `read_2nd_character_of_key_sequence` - [:unmatched, nil] - else - # `ESC ESC char` - [:matched, idx + 1] - end - end - end - - def key_mapping - @config.key_bindings - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/kill_ring.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/kill_ring.rb deleted file mode 100644 index bb3684b..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/kill_ring.rb +++ /dev/null @@ -1,125 +0,0 @@ -class Reline::KillRing - include Enumerable - - module State - FRESH = :fresh - CONTINUED = :continued - PROCESSED = :processed - YANK = :yank - end - - RingPoint = Struct.new(:backward, :forward, :str) do - def initialize(str) - super(nil, nil, str) - end - - def ==(other) - object_id == other.object_id - end - end - - class RingBuffer - attr_reader :size - attr_reader :head - - def initialize(max = 1024) - @max = max - @size = 0 - @head = nil # reading head of ring-shaped tape - end - - def <<(point) - if @size.zero? - @head = point - @head.backward = @head - @head.forward = @head - @size = 1 - elsif @size >= @max - tail = @head.forward - new_tail = tail.forward - @head.forward = point - point.backward = @head - new_tail.backward = point - point.forward = new_tail - @head = point - else - tail = @head.forward - @head.forward = point - point.backward = @head - tail.backward = point - point.forward = tail - @head = point - @size += 1 - end - end - - def empty? - @size.zero? - end - end - - def initialize(max = 1024) - @ring = RingBuffer.new(max) - @ring_pointer = nil - @buffer = nil - @state = State::FRESH - end - - def append(string, before_p = false) - case @state - when State::FRESH, State::YANK - @ring << RingPoint.new(string) - @state = State::CONTINUED - when State::CONTINUED, State::PROCESSED - if before_p - @ring.head.str.prepend(string) - else - @ring.head.str.concat(string) - end - @state = State::CONTINUED - end - end - - def process - case @state - when State::FRESH - # nothing to do - when State::CONTINUED - @state = State::PROCESSED - when State::PROCESSED - @state = State::FRESH - when State::YANK - # nothing to do - end - end - - def yank - unless @ring.empty? - @state = State::YANK - @ring_pointer = @ring.head - @ring_pointer.str - else - nil - end - end - - def yank_pop - if @state == State::YANK - prev_yank = @ring_pointer.str - @ring_pointer = @ring_pointer.backward - [@ring_pointer.str, prev_yank] - else - nil - end - end - - def each - start = head = @ring.head - loop do - break if head.nil? - yield head.str - head = head.backward - break if head == start - end - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/line_editor.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/line_editor.rb deleted file mode 100644 index eb57650..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/line_editor.rb +++ /dev/null @@ -1,3298 +0,0 @@ -require 'reline/kill_ring' -require 'reline/unicode' - -require 'tempfile' - -class Reline::LineEditor - # TODO: undo - # TODO: Use "private alias_method" idiom after drop Ruby 2.5. - attr_reader :line - attr_reader :byte_pointer - attr_accessor :confirm_multiline_termination_proc - attr_accessor :completion_proc - attr_accessor :completion_append_character - attr_accessor :output_modifier_proc - attr_accessor :prompt_proc - attr_accessor :auto_indent_proc - attr_accessor :pre_input_hook - attr_accessor :dig_perfect_match_proc - attr_writer :output - - VI_MOTIONS = %i{ - ed_prev_char - ed_next_char - vi_zero - ed_move_to_beg - ed_move_to_end - vi_to_column - vi_next_char - vi_prev_char - vi_next_word - vi_prev_word - vi_to_next_char - vi_to_prev_char - vi_end_word - vi_next_big_word - vi_prev_big_word - vi_end_big_word - vi_repeat_next_char - vi_repeat_prev_char - } - - module CompletionState - NORMAL = :normal - COMPLETION = :completion - MENU = :menu - JOURNEY = :journey - MENU_WITH_PERFECT_MATCH = :menu_with_perfect_match - PERFECT_MATCH = :perfect_match - end - - CompletionJourneyData = Struct.new(:preposing, :postposing, :list, :pointer) - MenuInfo = Struct.new(:target, :list) - - PROMPT_LIST_CACHE_TIMEOUT = 0.5 - MINIMUM_SCROLLBAR_HEIGHT = 1 - - def initialize(config, encoding) - @config = config - @completion_append_character = '' - reset_variables(encoding: encoding) - end - - def io_gate - Reline::IOGate - end - - def set_pasting_state(in_pasting) - @in_pasting = in_pasting - end - - def simplified_rendering? - if finished? - false - elsif @just_cursor_moving and not @rerender_all - true - else - not @rerender_all and not finished? and @in_pasting - end - end - - private def check_mode_string - mode_string = nil - if @config.show_mode_in_prompt - if @config.editing_mode_is?(:vi_command) - mode_string = @config.vi_cmd_mode_string - elsif @config.editing_mode_is?(:vi_insert) - mode_string = @config.vi_ins_mode_string - elsif @config.editing_mode_is?(:emacs) - mode_string = @config.emacs_mode_string - else - mode_string = '?' - end - end - if mode_string != @prev_mode_string - @rerender_all = true - end - @prev_mode_string = mode_string - mode_string - end - - private def check_multiline_prompt(buffer, force_recalc: false) - if @vi_arg - prompt = "(arg: #{@vi_arg}) " - @rerender_all = true - elsif @searching_prompt - prompt = @searching_prompt - @rerender_all = true - else - prompt = @prompt - end - if simplified_rendering? && !force_recalc - mode_string = check_mode_string - prompt = mode_string + prompt if mode_string - return [prompt, calculate_width(prompt, true), [prompt] * buffer.size] - end - if @prompt_proc - use_cached_prompt_list = false - if @cached_prompt_list - if @just_cursor_moving - use_cached_prompt_list = true - elsif Time.now.to_f < (@prompt_cache_time + PROMPT_LIST_CACHE_TIMEOUT) and buffer.size == @cached_prompt_list.size - use_cached_prompt_list = true - end - end - use_cached_prompt_list = false if @rerender_all - if use_cached_prompt_list - prompt_list = @cached_prompt_list - else - prompt_list = @cached_prompt_list = @prompt_proc.(buffer).map { |pr| pr.gsub("\n", "\\n") } - @prompt_cache_time = Time.now.to_f - end - prompt_list.map!{ prompt } if @vi_arg or @searching_prompt - prompt_list = [prompt] if prompt_list.empty? - mode_string = check_mode_string - prompt_list = prompt_list.map{ |pr| mode_string + pr } if mode_string - prompt = prompt_list[@line_index] - prompt = prompt_list[0] if prompt.nil? - prompt = prompt_list.last if prompt.nil? - if buffer.size > prompt_list.size - (buffer.size - prompt_list.size).times do - prompt_list << prompt_list.last - end - end - prompt_width = calculate_width(prompt, true) - [prompt, prompt_width, prompt_list] - else - mode_string = check_mode_string - prompt = mode_string + prompt if mode_string - prompt_width = calculate_width(prompt, true) - [prompt, prompt_width, nil] - end - end - - def reset(prompt = '', encoding:) - @rest_height = (Reline::IOGate.get_screen_size.first - 1) - Reline::IOGate.cursor_pos.y - @screen_size = Reline::IOGate.get_screen_size - @screen_height = @screen_size.first - reset_variables(prompt, encoding: encoding) - Reline::IOGate.set_winch_handler do - @resized = true - end - if ENV.key?('RELINE_ALT_SCROLLBAR') - @full_block = '::' - @upper_half_block = "''" - @lower_half_block = '..' - @block_elem_width = 2 - elsif Reline::IOGate.win? - @full_block = '█' - @upper_half_block = '▀' - @lower_half_block = '▄' - @block_elem_width = 1 - elsif @encoding == Encoding::UTF_8 - @full_block = '█' - @upper_half_block = '▀' - @lower_half_block = '▄' - @block_elem_width = Reline::Unicode.calculate_width('█') - else - @full_block = '::' - @upper_half_block = "''" - @lower_half_block = '..' - @block_elem_width = 2 - end - end - - def resize - return unless @resized - @resized = false - @rest_height = (Reline::IOGate.get_screen_size.first - 1) - Reline::IOGate.cursor_pos.y - old_screen_size = @screen_size - @screen_size = Reline::IOGate.get_screen_size - @screen_height = @screen_size.first - if old_screen_size.last < @screen_size.last # columns increase - @rerender_all = true - rerender - else - back = 0 - new_buffer = whole_lines - prompt, prompt_width, prompt_list = check_multiline_prompt(new_buffer) - new_buffer.each_with_index do |line, index| - prompt_width = calculate_width(prompt_list[index], true) if @prompt_proc - width = prompt_width + calculate_width(line) - height = calculate_height_by_width(width) - back += height - end - @highest_in_all = back - @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max) - @first_line_started_from = - if @line_index.zero? - 0 - else - calculate_height_by_lines(@buffer_of_lines[0..(@line_index - 1)], prompt_list || prompt) - end - if @prompt_proc - prompt = prompt_list[@line_index] - prompt_width = calculate_width(prompt, true) - end - calculate_nearest_cursor - @started_from = calculate_height_by_width(prompt_width + @cursor) - 1 - Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) - @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max) - @rerender_all = true - end - end - - def set_signal_handlers - @old_trap = Signal.trap('INT') { - clear_dialog(0) - if @scroll_partial_screen - move_cursor_down(@screen_height - (@line_index - @scroll_partial_screen) - 1) - else - move_cursor_down(@highest_in_all - @line_index - 1) - end - Reline::IOGate.move_cursor_column(0) - scroll_down(1) - case @old_trap - when 'DEFAULT', 'SYSTEM_DEFAULT' - raise Interrupt - when 'IGNORE' - # Do nothing - when 'EXIT' - exit - else - @old_trap.call if @old_trap.respond_to?(:call) - end - } - end - - def finalize - Signal.trap('INT', @old_trap) - end - - def eof? - @eof - end - - def reset_variables(prompt = '', encoding:) - @prompt = prompt.gsub("\n", "\\n") - @mark_pointer = nil - @encoding = encoding - @is_multiline = false - @finished = false - @cleared = false - @rerender_all = false - @history_pointer = nil - @kill_ring ||= Reline::KillRing.new - @vi_clipboard = '' - @vi_arg = nil - @waiting_proc = nil - @waiting_operator_proc = nil - @waiting_operator_vi_arg = nil - @completion_journey_data = nil - @completion_state = CompletionState::NORMAL - @perfect_matched = nil - @menu_info = nil - @first_prompt = true - @searching_prompt = nil - @first_char = true - @add_newline_to_end_of_buffer = false - @just_cursor_moving = nil - @cached_prompt_list = nil - @prompt_cache_time = nil - @eof = false - @continuous_insertion_buffer = String.new(encoding: @encoding) - @scroll_partial_screen = nil - @prev_mode_string = nil - @drop_terminate_spaces = false - @in_pasting = false - @auto_indent_proc = nil - @dialogs = [] - @previous_rendered_dialog_y = 0 - @last_key = nil - @resized = false - reset_line - end - - def reset_line - @cursor = 0 - @cursor_max = 0 - @byte_pointer = 0 - @buffer_of_lines = [String.new(encoding: @encoding)] - @line_index = 0 - @previous_line_index = nil - @line = @buffer_of_lines[0] - @first_line_started_from = 0 - @move_up = 0 - @started_from = 0 - @highest_in_this = 1 - @highest_in_all = 1 - @line_backup_in_history = nil - @multibyte_buffer = String.new(encoding: 'ASCII-8BIT') - @check_new_auto_indent = false - end - - def multiline_on - @is_multiline = true - end - - def multiline_off - @is_multiline = false - end - - private def calculate_height_by_lines(lines, prompt) - result = 0 - prompt_list = prompt.is_a?(Array) ? prompt : nil - lines.each_with_index { |line, i| - prompt = prompt_list[i] if prompt_list and prompt_list[i] - result += calculate_height_by_width(calculate_width(prompt, true) + calculate_width(line)) - } - result - end - - private def insert_new_line(cursor_line, next_line) - @line = cursor_line - @buffer_of_lines.insert(@line_index + 1, String.new(next_line, encoding: @encoding)) - @previous_line_index = @line_index - @line_index += 1 - @just_cursor_moving = false - end - - private def calculate_height_by_width(width) - width.div(@screen_size.last) + 1 - end - - private def split_by_width(str, max_width) - Reline::Unicode.split_by_width(str, max_width, @encoding) - end - - private def scroll_down(val) - if val <= @rest_height - Reline::IOGate.move_cursor_down(val) - @rest_height -= val - else - Reline::IOGate.move_cursor_down(@rest_height) - Reline::IOGate.scroll_down(val - @rest_height) - @rest_height = 0 - end - end - - private def move_cursor_up(val) - if val > 0 - Reline::IOGate.move_cursor_up(val) - @rest_height += val - elsif val < 0 - move_cursor_down(-val) - end - end - - private def move_cursor_down(val) - if val > 0 - Reline::IOGate.move_cursor_down(val) - @rest_height -= val - @rest_height = 0 if @rest_height < 0 - elsif val < 0 - move_cursor_up(-val) - end - end - - private def calculate_nearest_cursor(line_to_calc = @line, cursor = @cursor, started_from = @started_from, byte_pointer = @byte_pointer, update = true) - new_cursor_max = calculate_width(line_to_calc) - new_cursor = 0 - new_byte_pointer = 0 - height = 1 - max_width = @screen_size.last - if @config.editing_mode_is?(:vi_command) - last_byte_size = Reline::Unicode.get_prev_mbchar_size(line_to_calc, line_to_calc.bytesize) - if last_byte_size > 0 - last_mbchar = line_to_calc.byteslice(line_to_calc.bytesize - last_byte_size, last_byte_size) - last_width = Reline::Unicode.get_mbchar_width(last_mbchar) - end_of_line_cursor = new_cursor_max - last_width - else - end_of_line_cursor = new_cursor_max - end - else - end_of_line_cursor = new_cursor_max - end - line_to_calc.grapheme_clusters.each do |gc| - mbchar = gc.encode(Encoding::UTF_8) - mbchar_width = Reline::Unicode.get_mbchar_width(mbchar) - now = new_cursor + mbchar_width - if now > end_of_line_cursor or now > cursor - break - end - new_cursor += mbchar_width - if new_cursor > max_width * height - height += 1 - end - new_byte_pointer += gc.bytesize - end - new_started_from = height - 1 - if update - @cursor = new_cursor - @cursor_max = new_cursor_max - @started_from = new_started_from - @byte_pointer = new_byte_pointer - else - [new_cursor, new_cursor_max, new_started_from, new_byte_pointer] - end - end - - def rerender_all - @rerender_all = true - process_insert(force: true) - rerender - end - - def rerender - return if @line.nil? - if @menu_info - scroll_down(@highest_in_all - @first_line_started_from) - @rerender_all = true - end - if @menu_info - show_menu - @menu_info = nil - end - prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines) - cursor_column = (prompt_width + @cursor) % @screen_size.last - if @cleared - clear_screen_buffer(prompt, prompt_list, prompt_width) - @cleared = false - return - end - if @is_multiline and finished? and @scroll_partial_screen - # Re-output all code higher than the screen when finished. - Reline::IOGate.move_cursor_up(@first_line_started_from + @started_from - @scroll_partial_screen) - Reline::IOGate.move_cursor_column(0) - @scroll_partial_screen = nil - new_lines = whole_lines - prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines) - modify_lines(new_lines).each_with_index do |line, index| - @output.write "#{prompt_list ? prompt_list[index] : prompt}#{line}\r\n" - Reline::IOGate.erase_after_cursor - end - @output.flush - clear_dialog(cursor_column) - return - end - new_highest_in_this = calculate_height_by_width(prompt_width + calculate_width(@line.nil? ? '' : @line)) - rendered = false - if @add_newline_to_end_of_buffer - clear_dialog_with_trap_key(cursor_column) - rerender_added_newline(prompt, prompt_width, prompt_list) - @add_newline_to_end_of_buffer = false - else - if @just_cursor_moving and not @rerender_all - clear_dialog_with_trap_key(cursor_column) - rendered = just_move_cursor - @just_cursor_moving = false - return - elsif @previous_line_index or new_highest_in_this != @highest_in_this - clear_dialog_with_trap_key(cursor_column) - rerender_changed_current_line - @previous_line_index = nil - rendered = true - elsif @rerender_all - rerender_all_lines - @rerender_all = false - rendered = true - else - end - end - if @is_multiline - if finished? - # Always rerender on finish because output_modifier_proc may return a different output. - new_lines = whole_lines - line = modify_lines(new_lines)[@line_index] - clear_dialog(cursor_column) - prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines) - render_partial(prompt, prompt_width, line, @first_line_started_from) - move_cursor_down(@highest_in_all - (@first_line_started_from + @highest_in_this - 1) - 1) - scroll_down(1) - Reline::IOGate.move_cursor_column(0) - Reline::IOGate.erase_after_cursor - else - if not rendered and not @in_pasting - line = modify_lines(whole_lines)[@line_index] - prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines) - render_partial(prompt, prompt_width, line, @first_line_started_from) - end - render_dialog(cursor_column) - end - @buffer_of_lines[@line_index] = @line - @rest_height = 0 if @scroll_partial_screen - else - line = modify_lines(whole_lines)[@line_index] - render_partial(prompt, prompt_width, line, 0) - if finished? - scroll_down(1) - Reline::IOGate.move_cursor_column(0) - Reline::IOGate.erase_after_cursor - end - end - end - - class DialogProcScope - def initialize(line_editor, config, proc_to_exec, context) - @line_editor = line_editor - @config = config - @proc_to_exec = proc_to_exec - @context = context - @cursor_pos = Reline::CursorPos.new - end - - def context - @context - end - - def retrieve_completion_block(set_completion_quote_character = false) - @line_editor.retrieve_completion_block(set_completion_quote_character) - end - - def call_completion_proc_with_checking_args(pre, target, post) - @line_editor.call_completion_proc_with_checking_args(pre, target, post) - end - - def set_dialog(dialog) - @dialog = dialog - end - - def dialog - @dialog - end - - def set_cursor_pos(col, row) - @cursor_pos.x = col - @cursor_pos.y = row - end - - def set_key(key) - @key = key - end - - def key - @key - end - - def cursor_pos - @cursor_pos - end - - def just_cursor_moving - @line_editor.instance_variable_get(:@just_cursor_moving) - end - - def screen_width - @line_editor.instance_variable_get(:@screen_size).last - end - - def screen_height - @line_editor.instance_variable_get(:@screen_size).first - end - - def preferred_dialog_height - rest_height = @line_editor.instance_variable_get(:@rest_height) - scroll_partial_screen = @line_editor.instance_variable_get(:@scroll_partial_screen) || 0 - [cursor_pos.y - scroll_partial_screen, rest_height, (screen_height + 6) / 5].max - end - - def completion_journey_data - @line_editor.instance_variable_get(:@completion_journey_data) - end - - def config - @config - end - - def call - instance_exec(&@proc_to_exec) - end - end - - class Dialog - attr_reader :name, :contents, :width - attr_accessor :scroll_top, :pointer, :column, :vertical_offset, :trap_key - - def initialize(name, config, proc_scope) - @name = name - @config = config - @proc_scope = proc_scope - @width = nil - @scroll_top = 0 - @trap_key = nil - end - - def set_cursor_pos(col, row) - @proc_scope.set_cursor_pos(col, row) - end - - def width=(v) - @width = v - end - - def contents=(contents) - @contents = contents - if contents and @width.nil? - @width = contents.map{ |line| Reline::Unicode.calculate_width(line, true) }.max - end - end - - def call(key) - @proc_scope.set_dialog(self) - @proc_scope.set_key(key) - dialog_render_info = @proc_scope.call - if @trap_key - if @trap_key.any?{ |i| i.is_a?(Array) } # multiple trap - @trap_key.each do |t| - @config.add_oneshot_key_binding(t, @name) - end - elsif @trap_key.is_a?(Array) - @config.add_oneshot_key_binding(@trap_key, @name) - elsif @trap_key.is_a?(Integer) or @trap_key.is_a?(Reline::Key) - @config.add_oneshot_key_binding([@trap_key], @name) - end - end - dialog_render_info - end - end - - def add_dialog_proc(name, p, context = nil) - dialog = Dialog.new(name, @config, DialogProcScope.new(self, @config, p, context)) - if index = @dialogs.find_index { |d| d.name == name } - @dialogs[index] = dialog - else - @dialogs << dialog - end - end - - DIALOG_DEFAULT_HEIGHT = 20 - private def render_dialog(cursor_column) - changes = @dialogs.map do |dialog| - old_dialog = dialog.dup - update_each_dialog(dialog, cursor_column) - [old_dialog, dialog] - end - render_dialog_changes(changes, cursor_column) - end - - private def padding_space_with_escape_sequences(str, width) - padding_width = width - calculate_width(str, true) - # padding_width should be only positive value. But macOS and Alacritty returns negative value. - padding_width = 0 if padding_width < 0 - str + (' ' * padding_width) - end - - private def range_subtract(base_ranges, subtract_ranges) - indices = base_ranges.flat_map(&:to_a).uniq.sort - subtract_ranges.flat_map(&:to_a) - chunks = indices.chunk_while { |a, b| a + 1 == b } - chunks.map { |a| a.first...a.last + 1 } - end - - private def dialog_range(dialog, dialog_y) - x_range = dialog.column...dialog.column + dialog.width - y_range = dialog_y + dialog.vertical_offset...dialog_y + dialog.vertical_offset + dialog.contents.size - [x_range, y_range] - end - - private def render_dialog_changes(changes, cursor_column) - # Collect x-coordinate range and content of previous and current dialogs for each line - old_dialog_ranges = {} - new_dialog_ranges = {} - new_dialog_contents = {} - changes.each do |old_dialog, new_dialog| - if old_dialog.contents - x_range, y_range = dialog_range(old_dialog, @previous_rendered_dialog_y) - y_range.each do |y| - (old_dialog_ranges[y] ||= []) << x_range - end - end - if new_dialog.contents - x_range, y_range = dialog_range(new_dialog, @first_line_started_from + @started_from) - y_range.each do |y| - (new_dialog_ranges[y] ||= []) << x_range - (new_dialog_contents[y] ||= []) << [x_range, new_dialog.contents[y - y_range.begin]] - end - end - end - return if old_dialog_ranges.empty? && new_dialog_ranges.empty? - - # Calculate x-coordinate ranges to restore text that was hidden behind dialogs for each line - ranges_to_restore = {} - subtract_cache = {} - old_dialog_ranges.each do |y, old_x_ranges| - new_x_ranges = new_dialog_ranges[y] || [] - ranges = subtract_cache[[old_x_ranges, new_x_ranges]] ||= range_subtract(old_x_ranges, new_x_ranges) - ranges_to_restore[y] = ranges if ranges.any? - end - - # Create visual_lines for restoring text hidden behind dialogs - if ranges_to_restore.any? - lines = whole_lines - prompt, _prompt_width, prompt_list = check_multiline_prompt(lines, force_recalc: true) - modified_lines = modify_lines(lines, force_recalc: true) - visual_lines = [] - modified_lines.each_with_index { |l, i| - pr = prompt_list ? prompt_list[i] : prompt - vl, = split_by_width(pr + l, @screen_size.last) - vl.compact! - visual_lines.concat(vl) - } - end - - # Clear and rerender all dialogs line by line - Reline::IOGate.hide_cursor - ymin, ymax = (ranges_to_restore.keys + new_dialog_ranges.keys).minmax - scroll_partial_screen = @scroll_partial_screen || 0 - screen_y_range = scroll_partial_screen..(scroll_partial_screen + @screen_height - 1) - ymin = ymin.clamp(screen_y_range.begin, screen_y_range.end) - ymax = ymax.clamp(screen_y_range.begin, screen_y_range.end) - dialog_y = @first_line_started_from + @started_from - cursor_y = dialog_y - if @highest_in_all <= ymax - scroll_down(ymax - cursor_y) - move_cursor_up(ymax - cursor_y) - end - (ymin..ymax).each do |y| - move_cursor_down(y - cursor_y) - cursor_y = y - new_x_ranges = new_dialog_ranges[y] - restore_ranges = ranges_to_restore[y] - # Restore text that was hidden behind dialogs - if restore_ranges - line = visual_lines[y] || '' - restore_ranges.each do |range| - col = range.begin - width = range.end - range.begin - s = padding_space_with_escape_sequences(Reline::Unicode.take_range(line, col, width), width) - Reline::IOGate.move_cursor_column(col) - @output.write "\e[0m#{s}\e[0m" - end - max_column = [calculate_width(line, true), new_x_ranges&.map(&:end)&.max || 0].max - if max_column < restore_ranges.map(&:end).max - Reline::IOGate.move_cursor_column(max_column) - Reline::IOGate.erase_after_cursor - end - end - # Render dialog contents - new_dialog_contents[y]&.each do |x_range, content| - Reline::IOGate.move_cursor_column(x_range.begin) - @output.write "\e[0m#{content}\e[0m" - end - end - move_cursor_up(cursor_y - dialog_y) - Reline::IOGate.move_cursor_column(cursor_column) - Reline::IOGate.show_cursor - - @previous_rendered_dialog_y = dialog_y - end - - private def update_each_dialog(dialog, cursor_column) - if @in_pasting - dialog.contents = nil - dialog.trap_key = nil - return - end - dialog.set_cursor_pos(cursor_column, @first_line_started_from + @started_from) - dialog_render_info = dialog.call(@last_key) - if dialog_render_info.nil? or dialog_render_info.contents.nil? or dialog_render_info.contents.empty? - dialog.contents = nil - dialog.trap_key = nil - return - end - contents = dialog_render_info.contents - pointer = dialog.pointer - if dialog_render_info.width - dialog.width = dialog_render_info.width - else - dialog.width = contents.map { |l| calculate_width(l, true) }.max - end - height = dialog_render_info.height || DIALOG_DEFAULT_HEIGHT - height = contents.size if contents.size < height - if contents.size > height - if dialog.pointer - if dialog.pointer < 0 - dialog.scroll_top = 0 - elsif (dialog.pointer - dialog.scroll_top) >= (height - 1) - dialog.scroll_top = dialog.pointer - (height - 1) - elsif (dialog.pointer - dialog.scroll_top) < 0 - dialog.scroll_top = dialog.pointer - end - pointer = dialog.pointer - dialog.scroll_top - else - dialog.scroll_top = 0 - end - contents = contents[dialog.scroll_top, height] - end - if dialog_render_info.scrollbar and dialog_render_info.contents.size > height - bar_max_height = height * 2 - moving_distance = (dialog_render_info.contents.size - height) * 2 - position_ratio = dialog.scroll_top.zero? ? 0.0 : ((dialog.scroll_top * 2).to_f / moving_distance) - bar_height = (bar_max_height * ((contents.size * 2).to_f / (dialog_render_info.contents.size * 2))).floor.to_i - bar_height = MINIMUM_SCROLLBAR_HEIGHT if bar_height < MINIMUM_SCROLLBAR_HEIGHT - scrollbar_pos = ((bar_max_height - bar_height) * position_ratio).floor.to_i - else - scrollbar_pos = nil - end - upper_space = @first_line_started_from - @started_from - dialog.column = dialog_render_info.pos.x - dialog.width += @block_elem_width if scrollbar_pos - diff = (dialog.column + dialog.width) - (@screen_size.last) - if diff > 0 - dialog.column -= diff - end - if (@rest_height - dialog_render_info.pos.y) >= height - dialog.vertical_offset = dialog_render_info.pos.y + 1 - elsif upper_space >= height - dialog.vertical_offset = dialog_render_info.pos.y - height - else - dialog.vertical_offset = dialog_render_info.pos.y + 1 - end - if dialog.column < 0 - dialog.column = 0 - dialog.width = @screen_size.last - end - dialog.contents = contents.map.with_index do |item, i| - if i == pointer - fg_color = dialog_render_info.pointer_fg_color - bg_color = dialog_render_info.pointer_bg_color - else - fg_color = dialog_render_info.fg_color - bg_color = dialog_render_info.bg_color - end - str_width = dialog.width - (scrollbar_pos.nil? ? 0 : @block_elem_width) - str = padding_space_with_escape_sequences(Reline::Unicode.take_range(item, 0, str_width), str_width) - colored_content = "\e[#{bg_color}m\e[#{fg_color}m#{str}" - if scrollbar_pos - color_seq = "\e[37m" - if scrollbar_pos <= (i * 2) and (i * 2 + 1) < (scrollbar_pos + bar_height) - colored_content + color_seq + @full_block - elsif scrollbar_pos <= (i * 2) and (i * 2) < (scrollbar_pos + bar_height) - colored_content + color_seq + @upper_half_block - elsif scrollbar_pos <= (i * 2 + 1) and (i * 2) < (scrollbar_pos + bar_height) - colored_content + color_seq + @lower_half_block - else - colored_content + color_seq + ' ' * @block_elem_width - end - else - colored_content - end - end - end - - private def clear_dialog(cursor_column) - changes = @dialogs.map do |dialog| - old_dialog = dialog.dup - dialog.contents = nil - [old_dialog, dialog] - end - render_dialog_changes(changes, cursor_column) - end - - private def clear_dialog_with_trap_key(cursor_column) - clear_dialog(cursor_column) - @dialogs.each do |dialog| - dialog.trap_key = nil - end - end - - private def calculate_scroll_partial_screen(highest_in_all, cursor_y) - if @screen_height < highest_in_all - old_scroll_partial_screen = @scroll_partial_screen - if cursor_y == 0 - @scroll_partial_screen = 0 - elsif cursor_y == (highest_in_all - 1) - @scroll_partial_screen = highest_in_all - @screen_height - else - if @scroll_partial_screen - if cursor_y <= @scroll_partial_screen - @scroll_partial_screen = cursor_y - elsif (@scroll_partial_screen + @screen_height - 1) < cursor_y - @scroll_partial_screen = cursor_y - (@screen_height - 1) - end - else - if cursor_y > (@screen_height - 1) - @scroll_partial_screen = cursor_y - (@screen_height - 1) - else - @scroll_partial_screen = 0 - end - end - end - if @scroll_partial_screen != old_scroll_partial_screen - @rerender_all = true - end - else - if @scroll_partial_screen - @rerender_all = true - end - @scroll_partial_screen = nil - end - end - - private def rerender_added_newline(prompt, prompt_width, prompt_list) - @buffer_of_lines[@previous_line_index] = @line - @line = @buffer_of_lines[@line_index] - @previous_line_index = nil - if @in_pasting - scroll_down(1) - else - lines = whole_lines - prev_line_prompt = @prompt_proc ? prompt_list[@line_index - 1] : prompt - prev_line_prompt_width = @prompt_proc ? calculate_width(prev_line_prompt, true) : prompt_width - prev_line = modify_lines(lines)[@line_index - 1] - move_cursor_up(@started_from) - render_partial(prev_line_prompt, prev_line_prompt_width, prev_line, @first_line_started_from + @started_from, with_control: false) - scroll_down(1) - render_partial(prompt, prompt_width, @line, @first_line_started_from + @started_from + 1, with_control: false) - end - @cursor = @cursor_max = calculate_width(@line) - @byte_pointer = @line.bytesize - @highest_in_all += @highest_in_this - @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max) - @first_line_started_from += @started_from + 1 - @started_from = calculate_height_by_width(prompt_width + @cursor) - 1 - end - - def just_move_cursor - prompt, prompt_width, prompt_list = check_multiline_prompt(@buffer_of_lines) - move_cursor_up(@started_from) - new_first_line_started_from = - if @line_index.zero? - 0 - else - calculate_height_by_lines(@buffer_of_lines[0..(@line_index - 1)], prompt_list || prompt) - end - first_line_diff = new_first_line_started_from - @first_line_started_from - @cursor, @cursor_max, _, @byte_pointer = calculate_nearest_cursor(@buffer_of_lines[@line_index], @cursor, @started_from, @byte_pointer, false) - new_started_from = calculate_height_by_width(prompt_width + @cursor) - 1 - calculate_scroll_partial_screen(@highest_in_all, new_first_line_started_from + new_started_from) - @previous_line_index = nil - @line = @buffer_of_lines[@line_index] - if @rerender_all - rerender_all_lines - @rerender_all = false - true - else - @first_line_started_from = new_first_line_started_from - @started_from = new_started_from - move_cursor_down(first_line_diff + @started_from) - Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) - false - end - end - - private def rerender_changed_current_line - new_lines = whole_lines - prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines) - all_height = calculate_height_by_lines(new_lines, prompt_list || prompt) - diff = all_height - @highest_in_all - move_cursor_down(@highest_in_all - @first_line_started_from - @started_from - 1) - if diff > 0 - scroll_down(diff) - move_cursor_up(all_height - 1) - elsif diff < 0 - (-diff).times do - Reline::IOGate.move_cursor_column(0) - Reline::IOGate.erase_after_cursor - move_cursor_up(1) - end - move_cursor_up(all_height - 1) - else - move_cursor_up(all_height - 1) - end - @highest_in_all = all_height - back = render_whole_lines(new_lines, prompt_list || prompt, prompt_width) - move_cursor_up(back) - if @previous_line_index - @buffer_of_lines[@previous_line_index] = @line - @line = @buffer_of_lines[@line_index] - end - @first_line_started_from = - if @line_index.zero? - 0 - else - calculate_height_by_lines(@buffer_of_lines[0..(@line_index - 1)], prompt_list || prompt) - end - if @prompt_proc - prompt = prompt_list[@line_index] - prompt_width = calculate_width(prompt, true) - end - move_cursor_down(@first_line_started_from) - calculate_nearest_cursor - @started_from = calculate_height_by_width(prompt_width + @cursor) - 1 - move_cursor_down(@started_from) - Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) - @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max) - end - - private def rerender_all_lines - move_cursor_up(@first_line_started_from + @started_from) - Reline::IOGate.move_cursor_column(0) - back = 0 - new_buffer = whole_lines - prompt, prompt_width, prompt_list = check_multiline_prompt(new_buffer) - new_buffer.each_with_index do |line, index| - prompt_width = calculate_width(prompt_list[index], true) if @prompt_proc - width = prompt_width + calculate_width(line) - height = calculate_height_by_width(width) - back += height - end - old_highest_in_all = @highest_in_all - if @line_index.zero? - new_first_line_started_from = 0 - else - new_first_line_started_from = calculate_height_by_lines(new_buffer[0..(@line_index - 1)], prompt_list || prompt) - end - new_started_from = calculate_height_by_width(prompt_width + @cursor) - 1 - calculate_scroll_partial_screen(back, new_first_line_started_from + new_started_from) - if @scroll_partial_screen - move_cursor_up(@first_line_started_from + @started_from) - scroll_down(@screen_height - 1) - move_cursor_up(@screen_height) - Reline::IOGate.move_cursor_column(0) - elsif back > old_highest_in_all - scroll_down(back - 1) - move_cursor_up(back - 1) - elsif back < old_highest_in_all - scroll_down(back) - Reline::IOGate.erase_after_cursor - (old_highest_in_all - back - 1).times do - scroll_down(1) - Reline::IOGate.erase_after_cursor - end - move_cursor_up(old_highest_in_all - 1) - end - render_whole_lines(new_buffer, prompt_list || prompt, prompt_width) - if @prompt_proc - prompt = prompt_list[@line_index] - prompt_width = calculate_width(prompt, true) - end - @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max) - @highest_in_all = back - @first_line_started_from = new_first_line_started_from - @started_from = new_started_from - if @scroll_partial_screen - Reline::IOGate.move_cursor_up(@screen_height - (@first_line_started_from + @started_from - @scroll_partial_screen) - 1) - Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) - else - move_cursor_down(@first_line_started_from + @started_from - back + 1) - Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) - end - end - - private def render_whole_lines(lines, prompt, prompt_width) - rendered_height = 0 - modify_lines(lines).each_with_index do |line, index| - if prompt.is_a?(Array) - line_prompt = prompt[index] - prompt_width = calculate_width(line_prompt, true) - else - line_prompt = prompt - end - height = render_partial(line_prompt, prompt_width, line, rendered_height, with_control: false) - if index < (lines.size - 1) - if @scroll_partial_screen - if (@scroll_partial_screen - height) < rendered_height and (@scroll_partial_screen + @screen_height - 1) >= (rendered_height + height) - move_cursor_down(1) - end - else - scroll_down(1) - end - rendered_height += height - else - rendered_height += height - 1 - end - end - rendered_height - end - - private def render_partial(prompt, prompt_width, line_to_render, this_started_from, with_control: true) - visual_lines, height = split_by_width(line_to_render.nil? ? prompt : prompt + line_to_render, @screen_size.last) - cursor_up_from_last_line = 0 - if @scroll_partial_screen - last_visual_line = this_started_from + (height - 1) - last_screen_line = @scroll_partial_screen + (@screen_height - 1) - if (@scroll_partial_screen - this_started_from) >= height - # Render nothing because this line is before the screen. - visual_lines = [] - elsif this_started_from > last_screen_line - # Render nothing because this line is after the screen. - visual_lines = [] - else - deleted_lines_before_screen = [] - if @scroll_partial_screen > this_started_from and last_visual_line >= @scroll_partial_screen - # A part of visual lines are before the screen. - deleted_lines_before_screen = visual_lines.shift((@scroll_partial_screen - this_started_from) * 2) - deleted_lines_before_screen.compact! - end - if this_started_from <= last_screen_line and last_screen_line < last_visual_line - # A part of visual lines are after the screen. - visual_lines.pop((last_visual_line - last_screen_line) * 2) - end - move_cursor_up(deleted_lines_before_screen.size - @started_from) - cursor_up_from_last_line = @started_from - deleted_lines_before_screen.size - end - end - if with_control - if height > @highest_in_this - diff = height - @highest_in_this - scroll_down(diff) - @highest_in_all += diff - @highest_in_this = height - move_cursor_up(diff) - elsif height < @highest_in_this - diff = @highest_in_this - height - @highest_in_all -= diff - @highest_in_this = height - end - move_cursor_up(@started_from) - @started_from = calculate_height_by_width(prompt_width + @cursor) - 1 - cursor_up_from_last_line = height - 1 - @started_from - end - if Reline::Unicode::CSI_REGEXP.match?(prompt + line_to_render) - @output.write "\e[0m" # clear character decorations - end - visual_lines.each_with_index do |line, index| - Reline::IOGate.move_cursor_column(0) - if line.nil? - if calculate_width(visual_lines[index - 1], true) == Reline::IOGate.get_screen_size.last - # reaches the end of line - if Reline::IOGate.win? and Reline::IOGate.win_legacy_console? - # A newline is automatically inserted if a character is rendered at - # eol on command prompt. - else - # When the cursor is at the end of the line and erases characters - # after the cursor, some terminals delete the character at the - # cursor position. - move_cursor_down(1) - Reline::IOGate.move_cursor_column(0) - end - else - Reline::IOGate.erase_after_cursor - move_cursor_down(1) - Reline::IOGate.move_cursor_column(0) - end - next - end - @output.write line - if Reline::IOGate.win? and Reline::IOGate.win_legacy_console? and calculate_width(line, true) == Reline::IOGate.get_screen_size.last - # A newline is automatically inserted if a character is rendered at eol on command prompt. - @rest_height -= 1 if @rest_height > 0 - end - @output.flush - if @first_prompt - @first_prompt = false - @pre_input_hook&.call - end - end - unless visual_lines.empty? - Reline::IOGate.erase_after_cursor - Reline::IOGate.move_cursor_column(0) - end - if with_control - # Just after rendring, so the cursor is on the last line. - if finished? - Reline::IOGate.move_cursor_column(0) - else - # Moves up from bottom of lines to the cursor position. - move_cursor_up(cursor_up_from_last_line) - # This logic is buggy if a fullwidth char is wrapped because there is only one halfwidth at end of a line. - Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) - end - end - height - end - - private def modify_lines(before, force_recalc: false) - return before if !force_recalc && (before.nil? || before.empty? || simplified_rendering?) - - if after = @output_modifier_proc&.call("#{before.join("\n")}\n", complete: finished?) - after.lines("\n").map { |l| l.chomp('') } - else - before - end - end - - private def show_menu - scroll_down(@highest_in_all - @first_line_started_from) - @rerender_all = true - @menu_info.list.sort!.each do |item| - Reline::IOGate.move_cursor_column(0) - @output.write item - @output.flush - scroll_down(1) - end - scroll_down(@highest_in_all - 1) - move_cursor_up(@highest_in_all - 1 - @first_line_started_from) - end - - private def clear_screen_buffer(prompt, prompt_list, prompt_width) - Reline::IOGate.clear_screen - back = 0 - modify_lines(whole_lines).each_with_index do |line, index| - if @prompt_proc - pr = prompt_list[index] - height = render_partial(pr, calculate_width(pr), line, back, with_control: false) - else - height = render_partial(prompt, prompt_width, line, back, with_control: false) - end - if index < (@buffer_of_lines.size - 1) - move_cursor_down(1) - back += height - end - end - move_cursor_up(back) - move_cursor_down(@first_line_started_from + @started_from) - @rest_height = (Reline::IOGate.get_screen_size.first - 1) - Reline::IOGate.cursor_pos.y - Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last) - end - - def editing_mode - @config.editing_mode - end - - private def menu(target, list) - @menu_info = MenuInfo.new(target, list) - end - - private def complete_internal_proc(list, is_menu) - preposing, target, postposing = retrieve_completion_block - list = list.select { |i| - if i and not Encoding.compatible?(target.encoding, i.encoding) - raise Encoding::CompatibilityError, "#{target.encoding.name} is not compatible with #{i.encoding.name}" - end - if @config.completion_ignore_case - i&.downcase&.start_with?(target.downcase) - else - i&.start_with?(target) - end - }.uniq - if is_menu - menu(target, list) - return nil - end - completed = list.inject { |memo, item| - begin - memo_mbchars = memo.unicode_normalize.grapheme_clusters - item_mbchars = item.unicode_normalize.grapheme_clusters - rescue Encoding::CompatibilityError - memo_mbchars = memo.grapheme_clusters - item_mbchars = item.grapheme_clusters - end - size = [memo_mbchars.size, item_mbchars.size].min - result = '' - size.times do |i| - if @config.completion_ignore_case - if memo_mbchars[i].casecmp?(item_mbchars[i]) - result << memo_mbchars[i] - else - break - end - else - if memo_mbchars[i] == item_mbchars[i] - result << memo_mbchars[i] - else - break - end - end - end - result - } - [target, preposing, completed, postposing] - end - - private def complete(list, just_show_list = false) - case @completion_state - when CompletionState::NORMAL, CompletionState::JOURNEY - @completion_state = CompletionState::COMPLETION - when CompletionState::PERFECT_MATCH - @dig_perfect_match_proc&.(@perfect_matched) - end - if just_show_list - is_menu = true - elsif @completion_state == CompletionState::MENU - is_menu = true - elsif @completion_state == CompletionState::MENU_WITH_PERFECT_MATCH - is_menu = true - else - is_menu = false - end - result = complete_internal_proc(list, is_menu) - if @completion_state == CompletionState::MENU_WITH_PERFECT_MATCH - @completion_state = CompletionState::PERFECT_MATCH - end - return if result.nil? - target, preposing, completed, postposing = result - return if completed.nil? - if target <= completed and (@completion_state == CompletionState::COMPLETION) - if list.include?(completed) - if list.one? - @completion_state = CompletionState::PERFECT_MATCH - else - @completion_state = CompletionState::MENU_WITH_PERFECT_MATCH - end - @perfect_matched = completed - else - @completion_state = CompletionState::MENU - end - if not just_show_list and target < completed - @line = (preposing + completed + completion_append_character.to_s + postposing).split("\n")[@line_index] || String.new(encoding: @encoding) - line_to_pointer = (preposing + completed + completion_append_character.to_s).split("\n").last || String.new(encoding: @encoding) - @cursor_max = calculate_width(@line) - @cursor = calculate_width(line_to_pointer) - @byte_pointer = line_to_pointer.bytesize - end - end - end - - private def move_completed_list(list, direction) - case @completion_state - when CompletionState::NORMAL, CompletionState::COMPLETION, - CompletionState::MENU, CompletionState::MENU_WITH_PERFECT_MATCH - @completion_state = CompletionState::JOURNEY - result = retrieve_completion_block - return if result.nil? - preposing, target, postposing = result - @completion_journey_data = CompletionJourneyData.new( - preposing, postposing, - [target] + list.select{ |item| item.start_with?(target) }, 0) - if @completion_journey_data.list.size == 1 - @completion_journey_data.pointer = 0 - else - case direction - when :up - @completion_journey_data.pointer = @completion_journey_data.list.size - 1 - when :down - @completion_journey_data.pointer = 1 - end - end - @completion_state = CompletionState::JOURNEY - else - case direction - when :up - @completion_journey_data.pointer -= 1 - if @completion_journey_data.pointer < 0 - @completion_journey_data.pointer = @completion_journey_data.list.size - 1 - end - when :down - @completion_journey_data.pointer += 1 - if @completion_journey_data.pointer >= @completion_journey_data.list.size - @completion_journey_data.pointer = 0 - end - end - end - completed = @completion_journey_data.list[@completion_journey_data.pointer] - new_line = (@completion_journey_data.preposing + completed + @completion_journey_data.postposing).split("\n")[@line_index] - @line = new_line.nil? ? String.new(encoding: @encoding) : new_line - line_to_pointer = (@completion_journey_data.preposing + completed).split("\n").last - line_to_pointer = String.new(encoding: @encoding) if line_to_pointer.nil? - @cursor_max = calculate_width(@line) - @cursor = calculate_width(line_to_pointer) - @byte_pointer = line_to_pointer.bytesize - end - - private def run_for_operators(key, method_symbol, &block) - if @waiting_operator_proc - if VI_MOTIONS.include?(method_symbol) - old_cursor, old_byte_pointer = @cursor, @byte_pointer - @vi_arg = @waiting_operator_vi_arg if @waiting_operator_vi_arg&.> 1 - block.(true) - unless @waiting_proc - cursor_diff, byte_pointer_diff = @cursor - old_cursor, @byte_pointer - old_byte_pointer - @cursor, @byte_pointer = old_cursor, old_byte_pointer - @waiting_operator_proc.(cursor_diff, byte_pointer_diff) - else - old_waiting_proc = @waiting_proc - old_waiting_operator_proc = @waiting_operator_proc - current_waiting_operator_proc = @waiting_operator_proc - @waiting_proc = proc { |k| - old_cursor, old_byte_pointer = @cursor, @byte_pointer - old_waiting_proc.(k) - cursor_diff, byte_pointer_diff = @cursor - old_cursor, @byte_pointer - old_byte_pointer - @cursor, @byte_pointer = old_cursor, old_byte_pointer - current_waiting_operator_proc.(cursor_diff, byte_pointer_diff) - @waiting_operator_proc = old_waiting_operator_proc - } - end - else - # Ignores operator when not motion is given. - block.(false) - end - @waiting_operator_proc = nil - @waiting_operator_vi_arg = nil - if @vi_arg - @rerender_all = true - @vi_arg = nil - end - else - block.(false) - end - end - - private def argumentable?(method_obj) - method_obj and method_obj.parameters.any? { |param| param[0] == :key and param[1] == :arg } - end - - private def inclusive?(method_obj) - # If a motion method with the keyword argument "inclusive" follows the - # operator, it must contain the character at the cursor position. - method_obj and method_obj.parameters.any? { |param| param[0] == :key and param[1] == :inclusive } - end - - def wrap_method_call(method_symbol, method_obj, key, with_operator = false) - if @config.editing_mode_is?(:emacs, :vi_insert) and @waiting_proc.nil? and @waiting_operator_proc.nil? - not_insertion = method_symbol != :ed_insert - process_insert(force: not_insertion) - end - if @vi_arg and argumentable?(method_obj) - if with_operator and inclusive?(method_obj) - method_obj.(key, arg: @vi_arg, inclusive: true) - else - method_obj.(key, arg: @vi_arg) - end - else - if with_operator and inclusive?(method_obj) - method_obj.(key, inclusive: true) - else - method_obj.(key) - end - end - end - - private def process_key(key, method_symbol) - if method_symbol and respond_to?(method_symbol, true) - method_obj = method(method_symbol) - else - method_obj = nil - end - if method_symbol and key.is_a?(Symbol) - if @vi_arg and argumentable?(method_obj) - run_for_operators(key, method_symbol) do |with_operator| - wrap_method_call(method_symbol, method_obj, key, with_operator) - end - else - wrap_method_call(method_symbol, method_obj, key) if method_obj - end - @kill_ring.process - if @vi_arg - @rerender_al = true - @vi_arg = nil - end - elsif @vi_arg - if key.chr =~ /[0-9]/ - ed_argument_digit(key) - else - if argumentable?(method_obj) - run_for_operators(key, method_symbol) do |with_operator| - wrap_method_call(method_symbol, method_obj, key, with_operator) - end - elsif @waiting_proc - @waiting_proc.(key) - elsif method_obj - wrap_method_call(method_symbol, method_obj, key) - else - ed_insert(key) unless @config.editing_mode_is?(:vi_command) - end - @kill_ring.process - if @vi_arg - @rerender_all = true - @vi_arg = nil - end - end - elsif @waiting_proc - @waiting_proc.(key) - @kill_ring.process - elsif method_obj - if method_symbol == :ed_argument_digit - wrap_method_call(method_symbol, method_obj, key) - else - run_for_operators(key, method_symbol) do |with_operator| - wrap_method_call(method_symbol, method_obj, key, with_operator) - end - end - @kill_ring.process - else - ed_insert(key) unless @config.editing_mode_is?(:vi_command) - end - end - - private def normal_char(key) - method_symbol = method_obj = nil - if key.combined_char.is_a?(Symbol) - process_key(key.combined_char, key.combined_char) - return - end - @multibyte_buffer << key.combined_char - if @multibyte_buffer.size > 1 - if @multibyte_buffer.dup.force_encoding(@encoding).valid_encoding? - process_key(@multibyte_buffer.dup.force_encoding(@encoding), nil) - @multibyte_buffer.clear - else - # invalid - return - end - else # single byte - return if key.char >= 128 # maybe, first byte of multi byte - method_symbol = @config.editing_mode.get_method(key.combined_char) - if key.with_meta and method_symbol == :ed_unassigned - if @config.editing_mode_is?(:vi_command, :vi_insert) - # split ESC + key in vi mode - method_symbol = @config.editing_mode.get_method("\e".ord) - process_key("\e".ord, method_symbol) - method_symbol = @config.editing_mode.get_method(key.char) - process_key(key.char, method_symbol) - end - else - process_key(key.combined_char, method_symbol) - end - @multibyte_buffer.clear - end - if @config.editing_mode_is?(:vi_command) and @cursor > 0 and @cursor == @cursor_max - byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer) - @byte_pointer -= byte_size - mbchar = @line.byteslice(@byte_pointer, byte_size) - width = Reline::Unicode.get_mbchar_width(mbchar) - @cursor -= width - end - end - - def input_key(key) - @last_key = key - @config.reset_oneshot_key_bindings - @dialogs.each do |dialog| - if key.char.instance_of?(Symbol) and key.char == dialog.name - return - end - end - @just_cursor_moving = nil - if key.char.nil? - if @first_char - @line = nil - end - finish - return - end - old_line = @line.dup - @first_char = false - completion_occurs = false - if @config.editing_mode_is?(:emacs, :vi_insert) and key.char == "\C-i".ord - unless @config.disable_completion - result = call_completion_proc - if result.is_a?(Array) - completion_occurs = true - process_insert - if @config.autocompletion - move_completed_list(result, :down) - else - complete(result) - end - end - end - elsif @config.editing_mode_is?(:emacs, :vi_insert) and key.char == :completion_journey_up - if not @config.disable_completion and @config.autocompletion - result = call_completion_proc - if result.is_a?(Array) - completion_occurs = true - process_insert - move_completed_list(result, :up) - end - end - elsif not @config.disable_completion and @config.editing_mode_is?(:vi_insert) and ["\C-p".ord, "\C-n".ord].include?(key.char) - unless @config.disable_completion - result = call_completion_proc - if result.is_a?(Array) - completion_occurs = true - process_insert - move_completed_list(result, "\C-p".ord == key.char ? :up : :down) - end - end - elsif Symbol === key.char and respond_to?(key.char, true) - process_key(key.char, key.char) - else - normal_char(key) - end - unless completion_occurs - @completion_state = CompletionState::NORMAL - @completion_journey_data = nil - end - if not @in_pasting and @just_cursor_moving.nil? - if @previous_line_index and @buffer_of_lines[@previous_line_index] == @line - @just_cursor_moving = true - elsif @previous_line_index.nil? and @buffer_of_lines[@line_index] == @line and old_line == @line - @just_cursor_moving = true - else - @just_cursor_moving = false - end - else - @just_cursor_moving = false - end - if @is_multiline and @auto_indent_proc and not simplified_rendering? and @line - process_auto_indent - end - end - - def call_completion_proc - result = retrieve_completion_block(true) - pre, target, post = result - result = call_completion_proc_with_checking_args(pre, target, post) - Reline.core.instance_variable_set(:@completion_quote_character, nil) - result - end - - def call_completion_proc_with_checking_args(pre, target, post) - if @completion_proc and target - argnum = @completion_proc.parameters.inject(0) { |result, item| - case item.first - when :req, :opt - result + 1 - when :rest - break 3 - end - } - case argnum - when 1 - result = @completion_proc.(target) - when 2 - result = @completion_proc.(target, pre) - when 3..Float::INFINITY - result = @completion_proc.(target, pre, post) - end - end - result - end - - private def process_auto_indent - return if not @check_new_auto_indent and @previous_line_index # move cursor up or down - if @check_new_auto_indent and @previous_line_index and @previous_line_index > 0 and @line_index > @previous_line_index - # Fix indent of a line when a newline is inserted to the next - new_lines = whole_lines - new_indent = @auto_indent_proc.(new_lines[0..-3].push(''), @line_index - 1, 0, true) - md = @line.match(/\A */) - prev_indent = md[0].count(' ') - @line = ' ' * new_indent + @line.lstrip - - new_indent = nil - result = @auto_indent_proc.(new_lines[0..-2], @line_index - 1, (new_lines[@line_index - 1].bytesize + 1), false) - if result - new_indent = result - end - if new_indent&.>= 0 - @line = ' ' * new_indent + @line.lstrip - end - end - new_lines = whole_lines - new_indent = @auto_indent_proc.(new_lines, @line_index, @byte_pointer, @check_new_auto_indent) - if new_indent&.>= 0 - md = new_lines[@line_index].match(/\A */) - prev_indent = md[0].count(' ') - if @check_new_auto_indent - line = @buffer_of_lines[@line_index] = ' ' * new_indent + @buffer_of_lines[@line_index].lstrip - @cursor = new_indent - @cursor_max = calculate_width(line) - @byte_pointer = new_indent - else - @line = ' ' * new_indent + @line.lstrip - @cursor += new_indent - prev_indent - @cursor_max = calculate_width(@line) - @byte_pointer += new_indent - prev_indent - end - end - @check_new_auto_indent = false - end - - def retrieve_completion_block(set_completion_quote_character = false) - if Reline.completer_word_break_characters.empty? - word_break_regexp = nil - else - word_break_regexp = /\A[#{Regexp.escape(Reline.completer_word_break_characters)}]/ - end - if Reline.completer_quote_characters.empty? - quote_characters_regexp = nil - else - quote_characters_regexp = /\A[#{Regexp.escape(Reline.completer_quote_characters)}]/ - end - before = @line.byteslice(0, @byte_pointer) - rest = nil - break_pointer = nil - quote = nil - closing_quote = nil - escaped_quote = nil - i = 0 - while i < @byte_pointer do - slice = @line.byteslice(i, @byte_pointer - i) - unless slice.valid_encoding? - i += 1 - next - end - if quote and slice.start_with?(closing_quote) - quote = nil - i += 1 - rest = nil - elsif quote and slice.start_with?(escaped_quote) - # skip - i += 2 - elsif quote_characters_regexp and slice =~ quote_characters_regexp # find new " - rest = $' - quote = $& - closing_quote = /(?!\\)#{Regexp.escape(quote)}/ - escaped_quote = /\\#{Regexp.escape(quote)}/ - i += 1 - break_pointer = i - 1 - elsif word_break_regexp and not quote and slice =~ word_break_regexp - rest = $' - i += 1 - before = @line.byteslice(i, @byte_pointer - i) - break_pointer = i - else - i += 1 - end - end - postposing = @line.byteslice(@byte_pointer, @line.bytesize - @byte_pointer) - if rest - preposing = @line.byteslice(0, break_pointer) - target = rest - if set_completion_quote_character and quote - Reline.core.instance_variable_set(:@completion_quote_character, quote) - if postposing !~ /(?!\\)#{Regexp.escape(quote)}/ # closing quote - insert_text(quote) - end - end - else - preposing = '' - if break_pointer - preposing = @line.byteslice(0, break_pointer) - else - preposing = '' - end - target = before - end - if @is_multiline - lines = whole_lines - if @line_index > 0 - preposing = lines[0..(@line_index - 1)].join("\n") + "\n" + preposing - end - if (lines.size - 1) > @line_index - postposing = postposing + "\n" + lines[(@line_index + 1)..-1].join("\n") - end - end - [preposing.encode(@encoding), target.encode(@encoding), postposing.encode(@encoding)] - end - - def confirm_multiline_termination - temp_buffer = @buffer_of_lines.dup - if @previous_line_index and @line_index == (@buffer_of_lines.size - 1) - temp_buffer[@previous_line_index] = @line - else - temp_buffer[@line_index] = @line - end - @confirm_multiline_termination_proc.(temp_buffer.join("\n") + "\n") - end - - def insert_text(text) - width = calculate_width(text) - if @cursor == @cursor_max - @line += text - else - @line = byteinsert(@line, @byte_pointer, text) - end - @byte_pointer += text.bytesize - @cursor += width - @cursor_max += width - end - - def delete_text(start = nil, length = nil) - if start.nil? and length.nil? - if @is_multiline - if @buffer_of_lines.size == 1 - @line&.clear - @byte_pointer = 0 - @cursor = 0 - @cursor_max = 0 - elsif @line_index == (@buffer_of_lines.size - 1) and @line_index > 0 - @buffer_of_lines.pop - @line_index -= 1 - @line = @buffer_of_lines[@line_index] - @byte_pointer = 0 - @cursor = 0 - @cursor_max = calculate_width(@line) - elsif @line_index < (@buffer_of_lines.size - 1) - @buffer_of_lines.delete_at(@line_index) - @line = @buffer_of_lines[@line_index] - @byte_pointer = 0 - @cursor = 0 - @cursor_max = calculate_width(@line) - end - else - @line&.clear - @byte_pointer = 0 - @cursor = 0 - @cursor_max = 0 - end - elsif not start.nil? and not length.nil? - if @line - before = @line.byteslice(0, start) - after = @line.byteslice(start + length, @line.bytesize) - @line = before + after - @byte_pointer = @line.bytesize if @byte_pointer > @line.bytesize - str = @line.byteslice(0, @byte_pointer) - @cursor = calculate_width(str) - @cursor_max = calculate_width(@line) - end - elsif start.is_a?(Range) - range = start - first = range.first - last = range.last - last = @line.bytesize - 1 if last > @line.bytesize - last += @line.bytesize if last < 0 - first += @line.bytesize if first < 0 - range = range.exclude_end? ? first...last : first..last - @line = @line.bytes.reject.with_index{ |c, i| range.include?(i) }.map{ |c| c.chr(Encoding::ASCII_8BIT) }.join.force_encoding(@encoding) - @byte_pointer = @line.bytesize if @byte_pointer > @line.bytesize - str = @line.byteslice(0, @byte_pointer) - @cursor = calculate_width(str) - @cursor_max = calculate_width(@line) - else - @line = @line.byteslice(0, start) - @byte_pointer = @line.bytesize if @byte_pointer > @line.bytesize - str = @line.byteslice(0, @byte_pointer) - @cursor = calculate_width(str) - @cursor_max = calculate_width(@line) - end - end - - def byte_pointer=(val) - @byte_pointer = val - str = @line.byteslice(0, @byte_pointer) - @cursor = calculate_width(str) - @cursor_max = calculate_width(@line) - end - - def whole_lines - index = @previous_line_index || @line_index - temp_lines = @buffer_of_lines.dup - temp_lines[index] = @line - temp_lines - end - - def whole_buffer - if @buffer_of_lines.size == 1 and @line.nil? - nil - else - whole_lines.join("\n") - end - end - - def finished? - @finished - end - - def finish - @finished = true - @rerender_all = true - @config.reset - end - - private def byteslice!(str, byte_pointer, size) - new_str = str.byteslice(0, byte_pointer) - new_str << str.byteslice(byte_pointer + size, str.bytesize) - [new_str, str.byteslice(byte_pointer, size)] - end - - private def byteinsert(str, byte_pointer, other) - new_str = str.byteslice(0, byte_pointer) - new_str << other - new_str << str.byteslice(byte_pointer, str.bytesize) - new_str - end - - private def calculate_width(str, allow_escape_code = false) - Reline::Unicode.calculate_width(str, allow_escape_code) - end - - private def key_delete(key) - if @config.editing_mode_is?(:vi_insert) - ed_delete_next_char(key) - elsif @config.editing_mode_is?(:emacs) - em_delete(key) - end - end - - private def key_newline(key) - if @is_multiline - if (@buffer_of_lines.size - 1) == @line_index and @line.bytesize == @byte_pointer - @add_newline_to_end_of_buffer = true - end - next_line = @line.byteslice(@byte_pointer, @line.bytesize - @byte_pointer) - cursor_line = @line.byteslice(0, @byte_pointer) - insert_new_line(cursor_line, next_line) - @cursor = 0 - @check_new_auto_indent = true unless @in_pasting - end - end - - # Editline:: +ed-unassigned+ This editor command always results in an error. - # GNU Readline:: There is no corresponding macro. - private def ed_unassigned(key) end # do nothing - - private def process_insert(force: false) - return if @continuous_insertion_buffer.empty? or (@in_pasting and not force) - width = Reline::Unicode.calculate_width(@continuous_insertion_buffer) - bytesize = @continuous_insertion_buffer.bytesize - if @cursor == @cursor_max - @line += @continuous_insertion_buffer - else - @line = byteinsert(@line, @byte_pointer, @continuous_insertion_buffer) - end - @byte_pointer += bytesize - @cursor += width - @cursor_max += width - @continuous_insertion_buffer.clear - end - - # Editline:: +ed-insert+ (vi input: almost all; emacs: printable characters) - # In insert mode, insert the input character left of the cursor - # position. In replace mode, overwrite the character at the - # cursor and move the cursor to the right by one character - # position. Accept an argument to do this repeatedly. It is an - # error if the input character is the NUL character (+Ctrl-@+). - # Failure to enlarge the edit buffer also results in an error. - # Editline:: +ed-digit+ (emacs: 0 to 9) If in argument input mode, append - # the input digit to the argument being read. Otherwise, call - # +ed-insert+. It is an error if the input character is not a - # digit or if the existing argument is already greater than a - # million. - # GNU Readline:: +self-insert+ (a, b, A, 1, !, …) Insert yourself. - private def ed_insert(key) - str = nil - width = nil - bytesize = nil - if key.instance_of?(String) - begin - key.encode(Encoding::UTF_8) - rescue Encoding::UndefinedConversionError - return - end - str = key - bytesize = key.bytesize - else - begin - key.chr.encode(Encoding::UTF_8) - rescue Encoding::UndefinedConversionError - return - end - str = key.chr - bytesize = 1 - end - if @in_pasting - @continuous_insertion_buffer << str - return - elsif not @continuous_insertion_buffer.empty? - process_insert - end - width = Reline::Unicode.get_mbchar_width(str) - if @cursor == @cursor_max - @line += str - else - @line = byteinsert(@line, @byte_pointer, str) - end - last_byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer) - @byte_pointer += bytesize - last_mbchar = @line.byteslice((@byte_pointer - bytesize - last_byte_size), last_byte_size) - combined_char = last_mbchar + str - if last_byte_size != 0 and combined_char.grapheme_clusters.size == 1 - # combined char - last_mbchar_width = Reline::Unicode.get_mbchar_width(last_mbchar) - combined_char_width = Reline::Unicode.get_mbchar_width(combined_char) - if combined_char_width > last_mbchar_width - width = combined_char_width - last_mbchar_width - else - width = 0 - end - end - @cursor += width - @cursor_max += width - end - alias_method :ed_digit, :ed_insert - alias_method :self_insert, :ed_insert - - private def ed_quoted_insert(str, arg: 1) - @waiting_proc = proc { |key| - arg.times do - if key == "\C-j".ord or key == "\C-m".ord - key_newline(key) - elsif key == 0 - # Ignore NUL. - else - ed_insert(key) - end - end - @waiting_proc = nil - } - end - alias_method :quoted_insert, :ed_quoted_insert - - private def ed_next_char(key, arg: 1) - byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer) - if (@byte_pointer < @line.bytesize) - mbchar = @line.byteslice(@byte_pointer, byte_size) - width = Reline::Unicode.get_mbchar_width(mbchar) - @cursor += width if width - @byte_pointer += byte_size - elsif @is_multiline and @config.editing_mode_is?(:emacs) and @byte_pointer == @line.bytesize and @line_index < @buffer_of_lines.size - 1 - next_line = @buffer_of_lines[@line_index + 1] - @cursor = 0 - @byte_pointer = 0 - @cursor_max = calculate_width(next_line) - @previous_line_index = @line_index - @line_index += 1 - end - arg -= 1 - ed_next_char(key, arg: arg) if arg > 0 - end - alias_method :forward_char, :ed_next_char - - private def ed_prev_char(key, arg: 1) - if @cursor > 0 - byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer) - @byte_pointer -= byte_size - mbchar = @line.byteslice(@byte_pointer, byte_size) - width = Reline::Unicode.get_mbchar_width(mbchar) - @cursor -= width - elsif @is_multiline and @config.editing_mode_is?(:emacs) and @byte_pointer == 0 and @line_index > 0 - prev_line = @buffer_of_lines[@line_index - 1] - @cursor = calculate_width(prev_line) - @byte_pointer = prev_line.bytesize - @cursor_max = calculate_width(prev_line) - @previous_line_index = @line_index - @line_index -= 1 - end - arg -= 1 - ed_prev_char(key, arg: arg) if arg > 0 - end - alias_method :backward_char, :ed_prev_char - - private def vi_first_print(key) - @byte_pointer, @cursor = Reline::Unicode.vi_first_print(@line) - end - - private def ed_move_to_beg(key) - @byte_pointer = @cursor = 0 - end - alias_method :beginning_of_line, :ed_move_to_beg - - private def ed_move_to_end(key) - @byte_pointer = 0 - @cursor = 0 - byte_size = 0 - while @byte_pointer < @line.bytesize - byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer) - if byte_size > 0 - mbchar = @line.byteslice(@byte_pointer, byte_size) - @cursor += Reline::Unicode.get_mbchar_width(mbchar) - end - @byte_pointer += byte_size - end - end - alias_method :end_of_line, :ed_move_to_end - - private def generate_searcher - Fiber.new do |first_key| - prev_search_key = first_key - search_word = String.new(encoding: @encoding) - multibyte_buf = String.new(encoding: 'ASCII-8BIT') - last_hit = nil - case first_key - when "\C-r".ord - prompt_name = 'reverse-i-search' - when "\C-s".ord - prompt_name = 'i-search' - end - loop do - key = Fiber.yield(search_word) - search_again = false - case key - when -1 # determined - Reline.last_incremental_search = search_word - break - when "\C-h".ord, "\C-?".ord - grapheme_clusters = search_word.grapheme_clusters - if grapheme_clusters.size > 0 - grapheme_clusters.pop - search_word = grapheme_clusters.join - end - when "\C-r".ord, "\C-s".ord - search_again = true if prev_search_key == key - prev_search_key = key - else - multibyte_buf << key - if multibyte_buf.dup.force_encoding(@encoding).valid_encoding? - search_word << multibyte_buf.dup.force_encoding(@encoding) - multibyte_buf.clear - end - end - hit = nil - if not search_word.empty? and @line_backup_in_history&.include?(search_word) - @history_pointer = nil - hit = @line_backup_in_history - else - if search_again - if search_word.empty? and Reline.last_incremental_search - search_word = Reline.last_incremental_search - end - if @history_pointer - case prev_search_key - when "\C-r".ord - history_pointer_base = 0 - history = Reline::HISTORY[0..(@history_pointer - 1)] - when "\C-s".ord - history_pointer_base = @history_pointer + 1 - history = Reline::HISTORY[(@history_pointer + 1)..-1] - end - else - history_pointer_base = 0 - history = Reline::HISTORY - end - elsif @history_pointer - case prev_search_key - when "\C-r".ord - history_pointer_base = 0 - history = Reline::HISTORY[0..@history_pointer] - when "\C-s".ord - history_pointer_base = @history_pointer - history = Reline::HISTORY[@history_pointer..-1] - end - else - history_pointer_base = 0 - history = Reline::HISTORY - end - case prev_search_key - when "\C-r".ord - hit_index = history.rindex { |item| - item.include?(search_word) - } - when "\C-s".ord - hit_index = history.index { |item| - item.include?(search_word) - } - end - if hit_index - @history_pointer = history_pointer_base + hit_index - hit = Reline::HISTORY[@history_pointer] - end - end - case prev_search_key - when "\C-r".ord - prompt_name = 'reverse-i-search' - when "\C-s".ord - prompt_name = 'i-search' - end - if hit - if @is_multiline - @buffer_of_lines = hit.split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = @buffer_of_lines.size - 1 - @line = @buffer_of_lines.last - @byte_pointer = @line.bytesize - @cursor = @cursor_max = calculate_width(@line) - @rerender_all = true - @searching_prompt = "(%s)`%s'" % [prompt_name, search_word] - else - @line = hit - @searching_prompt = "(%s)`%s': %s" % [prompt_name, search_word, hit] - end - last_hit = hit - else - if @is_multiline - @rerender_all = true - @searching_prompt = "(failed %s)`%s'" % [prompt_name, search_word] - else - @searching_prompt = "(failed %s)`%s': %s" % [prompt_name, search_word, last_hit] - end - end - end - end - end - - private def incremental_search_history(key) - unless @history_pointer - if @is_multiline - @line_backup_in_history = whole_buffer - else - @line_backup_in_history = @line - end - end - searcher = generate_searcher - searcher.resume(key) - @searching_prompt = "(reverse-i-search)`': " - termination_keys = ["\C-j".ord] - termination_keys.concat(@config.isearch_terminators&.chars&.map(&:ord)) if @config.isearch_terminators - @waiting_proc = ->(k) { - case k - when *termination_keys - if @history_pointer - buffer = Reline::HISTORY[@history_pointer] - else - buffer = @line_backup_in_history - end - if @is_multiline - @buffer_of_lines = buffer.split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = @buffer_of_lines.size - 1 - @line = @buffer_of_lines.last - @rerender_all = true - else - @line = buffer - end - @searching_prompt = nil - @waiting_proc = nil - @cursor_max = calculate_width(@line) - @cursor = @byte_pointer = 0 - @rerender_all = true - @cached_prompt_list = nil - searcher.resume(-1) - when "\C-g".ord - if @is_multiline - @buffer_of_lines = @line_backup_in_history.split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = @buffer_of_lines.size - 1 - @line = @buffer_of_lines.last - @rerender_all = true - else - @line = @line_backup_in_history - end - @history_pointer = nil - @searching_prompt = nil - @waiting_proc = nil - @line_backup_in_history = nil - @cursor_max = calculate_width(@line) - @cursor = @byte_pointer = 0 - @rerender_all = true - else - chr = k.is_a?(String) ? k : k.chr(Encoding::ASCII_8BIT) - if chr.match?(/[[:print:]]/) or k == "\C-h".ord or k == "\C-?".ord or k == "\C-r".ord or k == "\C-s".ord - searcher.resume(k) - else - if @history_pointer - line = Reline::HISTORY[@history_pointer] - else - line = @line_backup_in_history - end - if @is_multiline - @line_backup_in_history = whole_buffer - @buffer_of_lines = line.split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = @buffer_of_lines.size - 1 - @line = @buffer_of_lines.last - @rerender_all = true - else - @line_backup_in_history = @line - @line = line - end - @searching_prompt = nil - @waiting_proc = nil - @cursor_max = calculate_width(@line) - @cursor = @byte_pointer = 0 - @rerender_all = true - @cached_prompt_list = nil - searcher.resume(-1) - end - end - } - end - - private def vi_search_prev(key) - incremental_search_history(key) - end - alias_method :reverse_search_history, :vi_search_prev - - private def vi_search_next(key) - incremental_search_history(key) - end - alias_method :forward_search_history, :vi_search_next - - private def ed_search_prev_history(key, arg: 1) - history = nil - h_pointer = nil - line_no = nil - substr = @line.slice(0, @byte_pointer) - if @history_pointer.nil? - return if not @line.empty? and substr.empty? - history = Reline::HISTORY - elsif @history_pointer.zero? - history = nil - h_pointer = nil - else - history = Reline::HISTORY.slice(0, @history_pointer) - end - return if history.nil? - if @is_multiline - h_pointer = history.rindex { |h| - h.split("\n").each_with_index { |l, i| - if l.start_with?(substr) - line_no = i - break - end - } - not line_no.nil? - } - else - h_pointer = history.rindex { |l| - l.start_with?(substr) - } - end - return if h_pointer.nil? - @history_pointer = h_pointer - if @is_multiline - @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = line_no - @line = @buffer_of_lines[@line_index] - @rerender_all = true - else - @line = Reline::HISTORY[@history_pointer] - end - @cursor_max = calculate_width(@line) - arg -= 1 - ed_search_prev_history(key, arg: arg) if arg > 0 - end - alias_method :history_search_backward, :ed_search_prev_history - - private def ed_search_next_history(key, arg: 1) - substr = @line.slice(0, @byte_pointer) - if @history_pointer.nil? - return - elsif @history_pointer == (Reline::HISTORY.size - 1) and not substr.empty? - return - end - history = Reline::HISTORY.slice((@history_pointer + 1)..-1) - h_pointer = nil - line_no = nil - if @is_multiline - h_pointer = history.index { |h| - h.split("\n").each_with_index { |l, i| - if l.start_with?(substr) - line_no = i - break - end - } - not line_no.nil? - } - else - h_pointer = history.index { |l| - l.start_with?(substr) - } - end - h_pointer += @history_pointer + 1 if h_pointer and @history_pointer - return if h_pointer.nil? and not substr.empty? - @history_pointer = h_pointer - if @is_multiline - if @history_pointer.nil? and substr.empty? - @buffer_of_lines = [] - @line_index = 0 - else - @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n") - @line_index = line_no - end - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line = @buffer_of_lines[@line_index] - @rerender_all = true - else - if @history_pointer.nil? and substr.empty? - @line = '' - else - @line = Reline::HISTORY[@history_pointer] - end - end - @cursor_max = calculate_width(@line) - arg -= 1 - ed_search_next_history(key, arg: arg) if arg > 0 - end - alias_method :history_search_forward, :ed_search_next_history - - private def ed_prev_history(key, arg: 1) - if @is_multiline and @line_index > 0 - @previous_line_index = @line_index - @line_index -= 1 - return - end - if Reline::HISTORY.empty? - return - end - if @history_pointer.nil? - @history_pointer = Reline::HISTORY.size - 1 - if @is_multiline - @line_backup_in_history = whole_buffer - @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = @buffer_of_lines.size - 1 - @line = @buffer_of_lines.last - @rerender_all = true - else - @line_backup_in_history = @line - @line = Reline::HISTORY[@history_pointer] - end - elsif @history_pointer.zero? - return - else - if @is_multiline - Reline::HISTORY[@history_pointer] = whole_buffer - @history_pointer -= 1 - @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = @buffer_of_lines.size - 1 - @line = @buffer_of_lines.last - @rerender_all = true - else - Reline::HISTORY[@history_pointer] = @line - @history_pointer -= 1 - @line = Reline::HISTORY[@history_pointer] - end - end - if @config.editing_mode_is?(:emacs, :vi_insert) - @cursor_max = @cursor = calculate_width(@line) - @byte_pointer = @line.bytesize - elsif @config.editing_mode_is?(:vi_command) - @byte_pointer = @cursor = 0 - @cursor_max = calculate_width(@line) - end - arg -= 1 - ed_prev_history(key, arg: arg) if arg > 0 - end - alias_method :previous_history, :ed_prev_history - - private def ed_next_history(key, arg: 1) - if @is_multiline and @line_index < (@buffer_of_lines.size - 1) - @previous_line_index = @line_index - @line_index += 1 - return - end - if @history_pointer.nil? - return - elsif @history_pointer == (Reline::HISTORY.size - 1) - if @is_multiline - @history_pointer = nil - @buffer_of_lines = @line_backup_in_history.split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = 0 - @line = @buffer_of_lines.first - @rerender_all = true - else - @history_pointer = nil - @line = @line_backup_in_history - end - else - if @is_multiline - Reline::HISTORY[@history_pointer] = whole_buffer - @history_pointer += 1 - @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = 0 - @line = @buffer_of_lines.first - @rerender_all = true - else - Reline::HISTORY[@history_pointer] = @line - @history_pointer += 1 - @line = Reline::HISTORY[@history_pointer] - end - end - @line = '' unless @line - if @config.editing_mode_is?(:emacs, :vi_insert) - @cursor_max = @cursor = calculate_width(@line) - @byte_pointer = @line.bytesize - elsif @config.editing_mode_is?(:vi_command) - @byte_pointer = @cursor = 0 - @cursor_max = calculate_width(@line) - end - arg -= 1 - ed_next_history(key, arg: arg) if arg > 0 - end - alias_method :next_history, :ed_next_history - - private def ed_newline(key) - process_insert(force: true) - if @is_multiline - if @config.editing_mode_is?(:vi_command) - if @line_index < (@buffer_of_lines.size - 1) - ed_next_history(key) # means cursor down - else - # should check confirm_multiline_termination to finish? - finish - end - else - if @line_index == (@buffer_of_lines.size - 1) - if confirm_multiline_termination - finish - else - key_newline(key) - end - else - # should check confirm_multiline_termination to finish? - @previous_line_index = @line_index - @line_index = @buffer_of_lines.size - 1 - finish - end - end - else - if @history_pointer - Reline::HISTORY[@history_pointer] = @line - @history_pointer = nil - end - finish - end - end - - private def em_delete_prev_char(key, arg: 1) - if @is_multiline and @cursor == 0 and @line_index > 0 - @buffer_of_lines[@line_index] = @line - @cursor = calculate_width(@buffer_of_lines[@line_index - 1]) - @byte_pointer = @buffer_of_lines[@line_index - 1].bytesize - @buffer_of_lines[@line_index - 1] += @buffer_of_lines.delete_at(@line_index) - @line_index -= 1 - @line = @buffer_of_lines[@line_index] - @cursor_max = calculate_width(@line) - @rerender_all = true - elsif @cursor > 0 - byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer) - @byte_pointer -= byte_size - @line, mbchar = byteslice!(@line, @byte_pointer, byte_size) - width = Reline::Unicode.get_mbchar_width(mbchar) - @cursor -= width - @cursor_max -= width - end - arg -= 1 - em_delete_prev_char(key, arg: arg) if arg > 0 - end - alias_method :backward_delete_char, :em_delete_prev_char - - # Editline:: +ed-kill-line+ (vi command: +D+, +Ctrl-K+; emacs: +Ctrl-K+, - # +Ctrl-U+) + Kill from the cursor to the end of the line. - # GNU Readline:: +kill-line+ (+C-k+) Kill the text from point to the end of - # the line. With a negative numeric argument, kill backward - # from the cursor to the beginning of the current line. - private def ed_kill_line(key) - if @line.bytesize > @byte_pointer - @line, deleted = byteslice!(@line, @byte_pointer, @line.bytesize - @byte_pointer) - @byte_pointer = @line.bytesize - @cursor = @cursor_max = calculate_width(@line) - @kill_ring.append(deleted) - elsif @is_multiline and @byte_pointer == @line.bytesize and @buffer_of_lines.size > @line_index + 1 - @cursor = calculate_width(@line) - @byte_pointer = @line.bytesize - @line += @buffer_of_lines.delete_at(@line_index + 1) - @cursor_max = calculate_width(@line) - @buffer_of_lines[@line_index] = @line - @rerender_all = true - @rest_height += 1 - end - end - alias_method :kill_line, :ed_kill_line - - # Editline:: +vi-kill-line-prev+ (vi: +Ctrl-U+) Delete the string from the - # beginning of the edit buffer to the cursor and save it to the - # cut buffer. - # GNU Readline:: +unix-line-discard+ (+C-u+) Kill backward from the cursor - # to the beginning of the current line. - private def vi_kill_line_prev(key) - if @byte_pointer > 0 - @line, deleted = byteslice!(@line, 0, @byte_pointer) - @byte_pointer = 0 - @kill_ring.append(deleted, true) - @cursor_max = calculate_width(@line) - @cursor = 0 - end - end - alias_method :unix_line_discard, :vi_kill_line_prev - - # Editline:: +em-kill-line+ (not bound) Delete the entire contents of the - # edit buffer and save it to the cut buffer. +vi-kill-line-prev+ - # GNU Readline:: +kill-whole-line+ (not bound) Kill all characters on the - # current line, no matter where point is. - private def em_kill_line(key) - if @line.size > 0 - @kill_ring.append(@line.dup, true) - @line.clear - @byte_pointer = 0 - @cursor_max = 0 - @cursor = 0 - end - end - alias_method :kill_whole_line, :em_kill_line - - private def em_delete(key) - if @line.empty? and (not @is_multiline or @buffer_of_lines.size == 1) and key == "\C-d".ord - @line = nil - if @buffer_of_lines.size > 1 - scroll_down(@highest_in_all - @first_line_started_from) - end - Reline::IOGate.move_cursor_column(0) - @eof = true - finish - elsif @byte_pointer < @line.bytesize - splitted_last = @line.byteslice(@byte_pointer, @line.bytesize) - mbchar = splitted_last.grapheme_clusters.first - width = Reline::Unicode.get_mbchar_width(mbchar) - @cursor_max -= width - @line, = byteslice!(@line, @byte_pointer, mbchar.bytesize) - elsif @is_multiline and @byte_pointer == @line.bytesize and @buffer_of_lines.size > @line_index + 1 - @cursor = calculate_width(@line) - @byte_pointer = @line.bytesize - @line += @buffer_of_lines.delete_at(@line_index + 1) - @cursor_max = calculate_width(@line) - @buffer_of_lines[@line_index] = @line - @rerender_all = true - @rest_height += 1 - end - end - alias_method :delete_char, :em_delete - - private def em_delete_or_list(key) - if @line.empty? or @byte_pointer < @line.bytesize - em_delete(key) - else # show completed list - result = call_completion_proc - if result.is_a?(Array) - complete(result, true) - end - end - end - alias_method :delete_char_or_list, :em_delete_or_list - - private def em_yank(key) - yanked = @kill_ring.yank - if yanked - @line = byteinsert(@line, @byte_pointer, yanked) - yanked_width = calculate_width(yanked) - @cursor += yanked_width - @cursor_max += yanked_width - @byte_pointer += yanked.bytesize - end - end - alias_method :yank, :em_yank - - private def em_yank_pop(key) - yanked, prev_yank = @kill_ring.yank_pop - if yanked - prev_yank_width = calculate_width(prev_yank) - @cursor -= prev_yank_width - @cursor_max -= prev_yank_width - @byte_pointer -= prev_yank.bytesize - @line, = byteslice!(@line, @byte_pointer, prev_yank.bytesize) - @line = byteinsert(@line, @byte_pointer, yanked) - yanked_width = calculate_width(yanked) - @cursor += yanked_width - @cursor_max += yanked_width - @byte_pointer += yanked.bytesize - end - end - alias_method :yank_pop, :em_yank_pop - - private def ed_clear_screen(key) - @cleared = true - end - alias_method :clear_screen, :ed_clear_screen - - private def em_next_word(key) - if @line.bytesize > @byte_pointer - byte_size, width = Reline::Unicode.em_forward_word(@line, @byte_pointer) - @byte_pointer += byte_size - @cursor += width - end - end - alias_method :forward_word, :em_next_word - - private def ed_prev_word(key) - if @byte_pointer > 0 - byte_size, width = Reline::Unicode.em_backward_word(@line, @byte_pointer) - @byte_pointer -= byte_size - @cursor -= width - end - end - alias_method :backward_word, :ed_prev_word - - private def em_delete_next_word(key) - if @line.bytesize > @byte_pointer - byte_size, width = Reline::Unicode.em_forward_word(@line, @byte_pointer) - @line, word = byteslice!(@line, @byte_pointer, byte_size) - @kill_ring.append(word) - @cursor_max -= width - end - end - - private def ed_delete_prev_word(key) - if @byte_pointer > 0 - byte_size, width = Reline::Unicode.em_backward_word(@line, @byte_pointer) - @line, word = byteslice!(@line, @byte_pointer - byte_size, byte_size) - @kill_ring.append(word, true) - @byte_pointer -= byte_size - @cursor -= width - @cursor_max -= width - end - end - - private def ed_transpose_chars(key) - if @byte_pointer > 0 - if @cursor_max > @cursor - byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer) - mbchar = @line.byteslice(@byte_pointer, byte_size) - width = Reline::Unicode.get_mbchar_width(mbchar) - @cursor += width - @byte_pointer += byte_size - end - back1_byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer) - if (@byte_pointer - back1_byte_size) > 0 - back2_byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer - back1_byte_size) - back2_pointer = @byte_pointer - back1_byte_size - back2_byte_size - @line, back2_mbchar = byteslice!(@line, back2_pointer, back2_byte_size) - @line = byteinsert(@line, @byte_pointer - back2_byte_size, back2_mbchar) - end - end - end - alias_method :transpose_chars, :ed_transpose_chars - - private def ed_transpose_words(key) - left_word_start, middle_start, right_word_start, after_start = Reline::Unicode.ed_transpose_words(@line, @byte_pointer) - before = @line.byteslice(0, left_word_start) - left_word = @line.byteslice(left_word_start, middle_start - left_word_start) - middle = @line.byteslice(middle_start, right_word_start - middle_start) - right_word = @line.byteslice(right_word_start, after_start - right_word_start) - after = @line.byteslice(after_start, @line.bytesize - after_start) - return if left_word.empty? or right_word.empty? - @line = before + right_word + middle + left_word + after - from_head_to_left_word = before + right_word + middle + left_word - @byte_pointer = from_head_to_left_word.bytesize - @cursor = calculate_width(from_head_to_left_word) - end - alias_method :transpose_words, :ed_transpose_words - - private def em_capitol_case(key) - if @line.bytesize > @byte_pointer - byte_size, _, new_str = Reline::Unicode.em_forward_word_with_capitalization(@line, @byte_pointer) - before = @line.byteslice(0, @byte_pointer) - after = @line.byteslice((@byte_pointer + byte_size)..-1) - @line = before + new_str + after - @byte_pointer += new_str.bytesize - @cursor += calculate_width(new_str) - end - end - alias_method :capitalize_word, :em_capitol_case - - private def em_lower_case(key) - if @line.bytesize > @byte_pointer - byte_size, = Reline::Unicode.em_forward_word(@line, @byte_pointer) - part = @line.byteslice(@byte_pointer, byte_size).grapheme_clusters.map { |mbchar| - mbchar =~ /[A-Z]/ ? mbchar.downcase : mbchar - }.join - rest = @line.byteslice((@byte_pointer + byte_size)..-1) - @line = @line.byteslice(0, @byte_pointer) + part - @byte_pointer = @line.bytesize - @cursor = calculate_width(@line) - @cursor_max = @cursor + calculate_width(rest) - @line += rest - end - end - alias_method :downcase_word, :em_lower_case - - private def em_upper_case(key) - if @line.bytesize > @byte_pointer - byte_size, = Reline::Unicode.em_forward_word(@line, @byte_pointer) - part = @line.byteslice(@byte_pointer, byte_size).grapheme_clusters.map { |mbchar| - mbchar =~ /[a-z]/ ? mbchar.upcase : mbchar - }.join - rest = @line.byteslice((@byte_pointer + byte_size)..-1) - @line = @line.byteslice(0, @byte_pointer) + part - @byte_pointer = @line.bytesize - @cursor = calculate_width(@line) - @cursor_max = @cursor + calculate_width(rest) - @line += rest - end - end - alias_method :upcase_word, :em_upper_case - - private def em_kill_region(key) - if @byte_pointer > 0 - byte_size, width = Reline::Unicode.em_big_backward_word(@line, @byte_pointer) - @line, deleted = byteslice!(@line, @byte_pointer - byte_size, byte_size) - @byte_pointer -= byte_size - @cursor -= width - @cursor_max -= width - @kill_ring.append(deleted, true) - end - end - alias_method :unix_word_rubout, :em_kill_region - - private def copy_for_vi(text) - if @config.editing_mode_is?(:vi_insert) or @config.editing_mode_is?(:vi_command) - @vi_clipboard = text - end - end - - private def vi_insert(key) - @config.editing_mode = :vi_insert - end - - private def vi_add(key) - @config.editing_mode = :vi_insert - ed_next_char(key) - end - - private def vi_command_mode(key) - ed_prev_char(key) - @config.editing_mode = :vi_command - end - alias_method :vi_movement_mode, :vi_command_mode - - private def vi_next_word(key, arg: 1) - if @line.bytesize > @byte_pointer - byte_size, width = Reline::Unicode.vi_forward_word(@line, @byte_pointer, @drop_terminate_spaces) - @byte_pointer += byte_size - @cursor += width - end - arg -= 1 - vi_next_word(key, arg: arg) if arg > 0 - end - - private def vi_prev_word(key, arg: 1) - if @byte_pointer > 0 - byte_size, width = Reline::Unicode.vi_backward_word(@line, @byte_pointer) - @byte_pointer -= byte_size - @cursor -= width - end - arg -= 1 - vi_prev_word(key, arg: arg) if arg > 0 - end - - private def vi_end_word(key, arg: 1, inclusive: false) - if @line.bytesize > @byte_pointer - byte_size, width = Reline::Unicode.vi_forward_end_word(@line, @byte_pointer) - @byte_pointer += byte_size - @cursor += width - end - arg -= 1 - if inclusive and arg.zero? - byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer) - if byte_size > 0 - c = @line.byteslice(@byte_pointer, byte_size) - width = Reline::Unicode.get_mbchar_width(c) - @byte_pointer += byte_size - @cursor += width - end - end - vi_end_word(key, arg: arg) if arg > 0 - end - - private def vi_next_big_word(key, arg: 1) - if @line.bytesize > @byte_pointer - byte_size, width = Reline::Unicode.vi_big_forward_word(@line, @byte_pointer) - @byte_pointer += byte_size - @cursor += width - end - arg -= 1 - vi_next_big_word(key, arg: arg) if arg > 0 - end - - private def vi_prev_big_word(key, arg: 1) - if @byte_pointer > 0 - byte_size, width = Reline::Unicode.vi_big_backward_word(@line, @byte_pointer) - @byte_pointer -= byte_size - @cursor -= width - end - arg -= 1 - vi_prev_big_word(key, arg: arg) if arg > 0 - end - - private def vi_end_big_word(key, arg: 1, inclusive: false) - if @line.bytesize > @byte_pointer - byte_size, width = Reline::Unicode.vi_big_forward_end_word(@line, @byte_pointer) - @byte_pointer += byte_size - @cursor += width - end - arg -= 1 - if inclusive and arg.zero? - byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer) - if byte_size > 0 - c = @line.byteslice(@byte_pointer, byte_size) - width = Reline::Unicode.get_mbchar_width(c) - @byte_pointer += byte_size - @cursor += width - end - end - vi_end_big_word(key, arg: arg) if arg > 0 - end - - private def vi_delete_prev_char(key) - if @is_multiline and @cursor == 0 and @line_index > 0 - @buffer_of_lines[@line_index] = @line - @cursor = calculate_width(@buffer_of_lines[@line_index - 1]) - @byte_pointer = @buffer_of_lines[@line_index - 1].bytesize - @buffer_of_lines[@line_index - 1] += @buffer_of_lines.delete_at(@line_index) - @line_index -= 1 - @line = @buffer_of_lines[@line_index] - @cursor_max = calculate_width(@line) - @rerender_all = true - elsif @cursor > 0 - byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer) - @byte_pointer -= byte_size - @line, mbchar = byteslice!(@line, @byte_pointer, byte_size) - width = Reline::Unicode.get_mbchar_width(mbchar) - @cursor -= width - @cursor_max -= width - end - end - - private def vi_insert_at_bol(key) - ed_move_to_beg(key) - @config.editing_mode = :vi_insert - end - - private def vi_add_at_eol(key) - ed_move_to_end(key) - @config.editing_mode = :vi_insert - end - - private def ed_delete_prev_char(key, arg: 1) - deleted = '' - arg.times do - if @cursor > 0 - byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer) - @byte_pointer -= byte_size - @line, mbchar = byteslice!(@line, @byte_pointer, byte_size) - deleted.prepend(mbchar) - width = Reline::Unicode.get_mbchar_width(mbchar) - @cursor -= width - @cursor_max -= width - end - end - copy_for_vi(deleted) - end - - private def vi_zero(key) - @byte_pointer = 0 - @cursor = 0 - end - - private def vi_change_meta(key, arg: 1) - @drop_terminate_spaces = true - @waiting_operator_proc = proc { |cursor_diff, byte_pointer_diff| - if byte_pointer_diff > 0 - @line, cut = byteslice!(@line, @byte_pointer, byte_pointer_diff) - elsif byte_pointer_diff < 0 - @line, cut = byteslice!(@line, @byte_pointer + byte_pointer_diff, -byte_pointer_diff) - end - copy_for_vi(cut) - @cursor += cursor_diff if cursor_diff < 0 - @cursor_max -= cursor_diff.abs - @byte_pointer += byte_pointer_diff if byte_pointer_diff < 0 - @config.editing_mode = :vi_insert - @drop_terminate_spaces = false - } - @waiting_operator_vi_arg = arg - end - - private def vi_delete_meta(key, arg: 1) - @waiting_operator_proc = proc { |cursor_diff, byte_pointer_diff| - if byte_pointer_diff > 0 - @line, cut = byteslice!(@line, @byte_pointer, byte_pointer_diff) - elsif byte_pointer_diff < 0 - @line, cut = byteslice!(@line, @byte_pointer + byte_pointer_diff, -byte_pointer_diff) - end - copy_for_vi(cut) - @cursor += cursor_diff if cursor_diff < 0 - @cursor_max -= cursor_diff.abs - @byte_pointer += byte_pointer_diff if byte_pointer_diff < 0 - } - @waiting_operator_vi_arg = arg - end - - private def vi_yank(key, arg: 1) - @waiting_operator_proc = proc { |cursor_diff, byte_pointer_diff| - if byte_pointer_diff > 0 - cut = @line.byteslice(@byte_pointer, byte_pointer_diff) - elsif byte_pointer_diff < 0 - cut = @line.byteslice(@byte_pointer + byte_pointer_diff, -byte_pointer_diff) - end - copy_for_vi(cut) - } - @waiting_operator_vi_arg = arg - end - - private def vi_list_or_eof(key) - if (not @is_multiline and @line.empty?) or (@is_multiline and @line.empty? and @buffer_of_lines.size == 1) - @line = nil - if @buffer_of_lines.size > 1 - scroll_down(@highest_in_all - @first_line_started_from) - end - Reline::IOGate.move_cursor_column(0) - @eof = true - finish - else - ed_newline(key) - end - end - alias_method :vi_end_of_transmission, :vi_list_or_eof - alias_method :vi_eof_maybe, :vi_list_or_eof - - private def ed_delete_next_char(key, arg: 1) - byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer) - unless @line.empty? || byte_size == 0 - @line, mbchar = byteslice!(@line, @byte_pointer, byte_size) - copy_for_vi(mbchar) - width = Reline::Unicode.get_mbchar_width(mbchar) - @cursor_max -= width - if @cursor > 0 and @cursor >= @cursor_max - byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer) - mbchar = @line.byteslice(@byte_pointer - byte_size, byte_size) - width = Reline::Unicode.get_mbchar_width(mbchar) - @byte_pointer -= byte_size - @cursor -= width - end - end - arg -= 1 - ed_delete_next_char(key, arg: arg) if arg > 0 - end - - private def vi_to_history_line(key) - if Reline::HISTORY.empty? - return - end - if @history_pointer.nil? - @history_pointer = 0 - @line_backup_in_history = @line - @line = Reline::HISTORY[@history_pointer] - @cursor_max = calculate_width(@line) - @cursor = 0 - @byte_pointer = 0 - elsif @history_pointer.zero? - return - else - Reline::HISTORY[@history_pointer] = @line - @history_pointer = 0 - @line = Reline::HISTORY[@history_pointer] - @cursor_max = calculate_width(@line) - @cursor = 0 - @byte_pointer = 0 - end - end - - private def vi_histedit(key) - path = Tempfile.open { |fp| - if @is_multiline - fp.write whole_lines.join("\n") - else - fp.write @line - end - fp.path - } - system("#{ENV['EDITOR']} #{path}") - if @is_multiline - @buffer_of_lines = File.read(path).split("\n") - @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty? - @line_index = 0 - @line = @buffer_of_lines[@line_index] - @rerender_all = true - else - @line = File.read(path) - end - finish - end - - private def vi_paste_prev(key, arg: 1) - if @vi_clipboard.size > 0 - @line = byteinsert(@line, @byte_pointer, @vi_clipboard) - @cursor_max += calculate_width(@vi_clipboard) - cursor_point = @vi_clipboard.grapheme_clusters[0..-2].join - @cursor += calculate_width(cursor_point) - @byte_pointer += cursor_point.bytesize - end - arg -= 1 - vi_paste_prev(key, arg: arg) if arg > 0 - end - - private def vi_paste_next(key, arg: 1) - if @vi_clipboard.size > 0 - byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer) - @line = byteinsert(@line, @byte_pointer + byte_size, @vi_clipboard) - @cursor_max += calculate_width(@vi_clipboard) - @cursor += calculate_width(@vi_clipboard) - @byte_pointer += @vi_clipboard.bytesize - end - arg -= 1 - vi_paste_next(key, arg: arg) if arg > 0 - end - - private def ed_argument_digit(key) - if @vi_arg.nil? - if key.chr.to_i.zero? - if key.anybits?(0b10000000) - unescaped_key = key ^ 0b10000000 - unless unescaped_key.chr.to_i.zero? - @vi_arg = unescaped_key.chr.to_i - end - end - else - @vi_arg = key.chr.to_i - end - else - @vi_arg = @vi_arg * 10 + key.chr.to_i - end - end - - private def vi_to_column(key, arg: 0) - @byte_pointer, @cursor = @line.grapheme_clusters.inject([0, 0]) { |total, gc| - # total has [byte_size, cursor] - mbchar_width = Reline::Unicode.get_mbchar_width(gc) - if (total.last + mbchar_width) >= arg - break total - elsif (total.last + mbchar_width) >= @cursor_max - break total - else - total = [total.first + gc.bytesize, total.last + mbchar_width] - total - end - } - end - - private def vi_replace_char(key, arg: 1) - @waiting_proc = ->(k) { - if arg == 1 - byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer) - before = @line.byteslice(0, @byte_pointer) - remaining_point = @byte_pointer + byte_size - after = @line.byteslice(remaining_point, @line.bytesize - remaining_point) - @line = before + k.chr + after - @cursor_max = calculate_width(@line) - @waiting_proc = nil - elsif arg > 1 - byte_size = 0 - arg.times do - byte_size += Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer + byte_size) - end - before = @line.byteslice(0, @byte_pointer) - remaining_point = @byte_pointer + byte_size - after = @line.byteslice(remaining_point, @line.bytesize - remaining_point) - replaced = k.chr * arg - @line = before + replaced + after - @byte_pointer += replaced.bytesize - @cursor += calculate_width(replaced) - @cursor_max = calculate_width(@line) - @waiting_proc = nil - end - } - end - - private def vi_next_char(key, arg: 1, inclusive: false) - @waiting_proc = ->(key_for_proc) { search_next_char(key_for_proc, arg, inclusive: inclusive) } - end - - private def vi_to_next_char(key, arg: 1, inclusive: false) - @waiting_proc = ->(key_for_proc) { search_next_char(key_for_proc, arg, need_prev_char: true, inclusive: inclusive) } - end - - private def search_next_char(key, arg, need_prev_char: false, inclusive: false) - if key.instance_of?(String) - inputed_char = key - else - inputed_char = key.chr - end - prev_total = nil - total = nil - found = false - @line.byteslice(@byte_pointer..-1).grapheme_clusters.each do |mbchar| - # total has [byte_size, cursor] - unless total - # skip cursor point - width = Reline::Unicode.get_mbchar_width(mbchar) - total = [mbchar.bytesize, width] - else - if inputed_char == mbchar - arg -= 1 - if arg.zero? - found = true - break - end - end - width = Reline::Unicode.get_mbchar_width(mbchar) - prev_total = total - total = [total.first + mbchar.bytesize, total.last + width] - end - end - if not need_prev_char and found and total - byte_size, width = total - @byte_pointer += byte_size - @cursor += width - elsif need_prev_char and found and prev_total - byte_size, width = prev_total - @byte_pointer += byte_size - @cursor += width - end - if inclusive - byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer) - if byte_size > 0 - c = @line.byteslice(@byte_pointer, byte_size) - width = Reline::Unicode.get_mbchar_width(c) - @byte_pointer += byte_size - @cursor += width - end - end - @waiting_proc = nil - end - - private def vi_prev_char(key, arg: 1) - @waiting_proc = ->(key_for_proc) { search_prev_char(key_for_proc, arg) } - end - - private def vi_to_prev_char(key, arg: 1) - @waiting_proc = ->(key_for_proc) { search_prev_char(key_for_proc, arg, true) } - end - - private def search_prev_char(key, arg, need_next_char = false) - if key.instance_of?(String) - inputed_char = key - else - inputed_char = key.chr - end - prev_total = nil - total = nil - found = false - @line.byteslice(0..@byte_pointer).grapheme_clusters.reverse_each do |mbchar| - # total has [byte_size, cursor] - unless total - # skip cursor point - width = Reline::Unicode.get_mbchar_width(mbchar) - total = [mbchar.bytesize, width] - else - if inputed_char == mbchar - arg -= 1 - if arg.zero? - found = true - break - end - end - width = Reline::Unicode.get_mbchar_width(mbchar) - prev_total = total - total = [total.first + mbchar.bytesize, total.last + width] - end - end - if not need_next_char and found and total - byte_size, width = total - @byte_pointer -= byte_size - @cursor -= width - elsif need_next_char and found and prev_total - byte_size, width = prev_total - @byte_pointer -= byte_size - @cursor -= width - end - @waiting_proc = nil - end - - private def vi_join_lines(key, arg: 1) - if @is_multiline and @buffer_of_lines.size > @line_index + 1 - @cursor = calculate_width(@line) - @byte_pointer = @line.bytesize - @line += ' ' + @buffer_of_lines.delete_at(@line_index + 1).lstrip - @cursor_max = calculate_width(@line) - @buffer_of_lines[@line_index] = @line - @rerender_all = true - @rest_height += 1 - end - arg -= 1 - vi_join_lines(key, arg: arg) if arg > 0 - end - - private def em_set_mark(key) - @mark_pointer = [@byte_pointer, @line_index] - end - alias_method :set_mark, :em_set_mark - - private def em_exchange_mark(key) - return unless @mark_pointer - new_pointer = [@byte_pointer, @line_index] - @previous_line_index = @line_index - @byte_pointer, @line_index = @mark_pointer - @cursor = calculate_width(@line.byteslice(0, @byte_pointer)) - @cursor_max = calculate_width(@line) - @mark_pointer = new_pointer - end - alias_method :exchange_point_and_mark, :em_exchange_mark - - private def em_meta_next(key) - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/terminfo.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/terminfo.rb deleted file mode 100644 index 2cfa32b..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/terminfo.rb +++ /dev/null @@ -1,160 +0,0 @@ -begin - require 'fiddle' - require 'fiddle/import' -rescue LoadError - module Reline::Terminfo - def self.curses_dl - false - end - end -end - -module Reline::Terminfo - extend Fiddle::Importer - - class TerminfoError < StandardError; end - - def self.curses_dl_files - case RUBY_PLATFORM - when /mingw/, /mswin/ - # aren't supported - [] - when /cygwin/ - %w[cygncursesw-10.dll cygncurses-10.dll] - when /darwin/ - %w[libncursesw.dylib libcursesw.dylib libncurses.dylib libcurses.dylib] - else - %w[libncursesw.so libcursesw.so libncurses.so libcurses.so] - end - end - - @curses_dl = false - def self.curses_dl - return @curses_dl unless @curses_dl == false - if Fiddle.const_defined?(:TYPE_VARIADIC) - curses_dl_files.each do |curses_name| - result = Fiddle::Handle.new(curses_name) - rescue Fiddle::DLError - next - else - @curses_dl = result - break - end - end - @curses_dl = nil if @curses_dl == false - @curses_dl - end -end if not Reline.const_defined?(:Terminfo) or not Reline::Terminfo.respond_to?(:curses_dl) - -module Reline::Terminfo - dlload curses_dl - #extern 'int setupterm(char *term, int fildes, int *errret)' - @setupterm = Fiddle::Function.new(curses_dl['setupterm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - #extern 'char *tigetstr(char *capname)' - @tigetstr = Fiddle::Function.new(curses_dl['tigetstr'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP) - begin - #extern 'char *tiparm(const char *str, ...)' - @tiparm = Fiddle::Function.new(curses_dl['tiparm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VARIADIC], Fiddle::TYPE_VOIDP) - rescue Fiddle::DLError - # OpenBSD lacks tiparm - #extern 'char *tparm(const char *str, ...)' - @tiparm = Fiddle::Function.new(curses_dl['tparm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VARIADIC], Fiddle::TYPE_VOIDP) - end - begin - #extern 'int tigetflag(char *str)' - @tigetflag = Fiddle::Function.new(curses_dl['tigetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - rescue Fiddle::DLError - # OpenBSD lacks tigetflag - #extern 'int tgetflag(char *str)' - @tigetflag = Fiddle::Function.new(curses_dl['tgetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - end - begin - #extern 'int tigetnum(char *str)' - @tigetnum = Fiddle::Function.new(curses_dl['tigetnum'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - rescue Fiddle::DLError - # OpenBSD lacks tigetnum - #extern 'int tgetnum(char *str)' - @tigetnum = Fiddle::Function.new(curses_dl['tgetnum'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT) - end - - def self.setupterm(term, fildes) - errret_int = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT) - ret = @setupterm.(term, fildes, errret_int) - errret = errret_int[0, Fiddle::SIZEOF_INT].unpack1('i') - case ret - when 0 # OK - 0 - when -1 # ERR - case errret - when 1 - raise TerminfoError.new('The terminal is hardcopy, cannot be used for curses applications.') - when 0 - raise TerminfoError.new('The terminal could not be found, or that it is a generic type, having too little information for curses applications to run.') - when -1 - raise TerminfoError.new('The terminfo database could not be found.') - else # unknown - -1 - end - else # unknown - -2 - end - end - - class StringWithTiparm < String - def tiparm(*args) # for method chain - Reline::Terminfo.tiparm(self, *args) - end - end - - def self.tigetstr(capname) - raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String) - capability = @tigetstr.(capname) - case capability.to_i - when 0, -1 - raise TerminfoError, "can't find capability: #{capname}" - end - StringWithTiparm.new(capability.to_s) - end - - def self.tiparm(str, *args) - new_args = [] - args.each do |a| - new_args << Fiddle::TYPE_INT << a - end - @tiparm.(str, *new_args).to_s - end - - def self.tigetflag(capname) - raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String) - flag = @tigetflag.(capname).to_i - case flag - when -1 - raise TerminfoError, "not boolean capability: #{capname}" - when 0 - raise TerminfoError, "can't find capability: #{capname}" - end - flag - end - - def self.tigetnum(capname) - raise TerminfoError, "capname is not String: #{capname.inspect}" unless capname.is_a?(String) - num = @tigetnum.(capname).to_i - case num - when -2 - raise TerminfoError, "not numeric capability: #{capname}" - when -1 - raise TerminfoError, "can't find capability: #{capname}" - end - num - end - - def self.enabled? - true - end -end if Reline::Terminfo.curses_dl - -module Reline::Terminfo - def self.enabled? - false - end -end unless Reline::Terminfo.curses_dl diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/unicode.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/unicode.rb deleted file mode 100644 index 26ef207..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/unicode.rb +++ /dev/null @@ -1,642 +0,0 @@ -class Reline::Unicode - EscapedPairs = { - 0x00 => '^@', - 0x01 => '^A', # C-a - 0x02 => '^B', - 0x03 => '^C', - 0x04 => '^D', - 0x05 => '^E', - 0x06 => '^F', - 0x07 => '^G', - 0x08 => '^H', # Backspace - 0x09 => '^I', - 0x0A => '^J', - 0x0B => '^K', - 0x0C => '^L', - 0x0D => '^M', # Enter - 0x0E => '^N', - 0x0F => '^O', - 0x10 => '^P', - 0x11 => '^Q', - 0x12 => '^R', - 0x13 => '^S', - 0x14 => '^T', - 0x15 => '^U', - 0x16 => '^V', - 0x17 => '^W', - 0x18 => '^X', - 0x19 => '^Y', - 0x1A => '^Z', # C-z - 0x1B => '^[', # C-[ C-3 - 0x1D => '^]', # C-] - 0x1E => '^^', # C-~ C-6 - 0x1F => '^_', # C-_ C-7 - 0x7F => '^?', # C-? C-8 - } - EscapedChars = EscapedPairs.keys.map(&:chr) - - NON_PRINTING_START = "\1" - NON_PRINTING_END = "\2" - CSI_REGEXP = /\e\[[\d;]*[ABCDEFGHJKSTfminsuhl]/ - OSC_REGEXP = /\e\]\d+(?:;[^;\a\e]+)*(?:\a|\e\\)/ - WIDTH_SCANNER = /\G(?:(#{NON_PRINTING_START})|(#{NON_PRINTING_END})|(#{CSI_REGEXP})|(#{OSC_REGEXP})|(\X))/o - - def self.escape_for_print(str) - str.chars.map! { |gr| - escaped = EscapedPairs[gr.ord] - if escaped && gr != -"\n" && gr != -"\t" - escaped - else - gr - end - }.join - end - - require 'reline/unicode/east_asian_width' - - HalfwidthDakutenHandakuten = /[\u{FF9E}\u{FF9F}]/ - - MBCharWidthRE = / - (? - [#{ EscapedChars.map {|c| "\\x%02x" % c.ord }.join }] (?# ^ + char, such as ^M, ^H, ^[, ...) - ) - | (?^\u{2E3B}) (?# THREE-EM DASH) - | (?^\p{M}) - | (? - #{ EastAsianWidth::TYPE_F } - | #{ EastAsianWidth::TYPE_W } - ) - | (? - #{ EastAsianWidth::TYPE_H } - | #{ EastAsianWidth::TYPE_NA } - | #{ EastAsianWidth::TYPE_N } - )(?!#{ HalfwidthDakutenHandakuten }) - | (? - (?: #{ EastAsianWidth::TYPE_H } - | #{ EastAsianWidth::TYPE_NA } - | #{ EastAsianWidth::TYPE_N }) - #{ HalfwidthDakutenHandakuten } - ) - | (? - #{EastAsianWidth::TYPE_A} - ) - /x - - def self.get_mbchar_width(mbchar) - ord = mbchar.ord - if (0x00 <= ord and ord <= 0x1F) # in EscapedPairs - return 2 - elsif (0x20 <= ord and ord <= 0x7E) # printable ASCII chars - return 1 - end - m = mbchar.encode(Encoding::UTF_8).match(MBCharWidthRE) - case - when m.nil? then 1 # TODO should be U+FFFD � REPLACEMENT CHARACTER - when m[:width_2_1], m[:width_2_2], m[:width_2_3] then 2 - when m[:width_3] then 3 - when m[:width_0] then 0 - when m[:width_1] then 1 - when m[:ambiguous_width] then Reline.ambiguous_width - else - nil - end - end - - def self.calculate_width(str, allow_escape_code = false) - if allow_escape_code - width = 0 - rest = str.encode(Encoding::UTF_8) - in_zero_width = false - rest.scan(WIDTH_SCANNER) do |non_printing_start, non_printing_end, csi, osc, gc| - case - when non_printing_start - in_zero_width = true - when non_printing_end - in_zero_width = false - when csi, osc - when gc - unless in_zero_width - width += get_mbchar_width(gc) - end - end - end - width - else - str.encode(Encoding::UTF_8).grapheme_clusters.inject(0) { |w, gc| - w + get_mbchar_width(gc) - } - end - end - - def self.split_by_width(str, max_width, encoding = str.encoding) - lines = [String.new(encoding: encoding)] - height = 1 - width = 0 - rest = str.encode(Encoding::UTF_8) - in_zero_width = false - seq = String.new(encoding: encoding) - rest.scan(WIDTH_SCANNER) do |non_printing_start, non_printing_end, csi, osc, gc| - case - when non_printing_start - in_zero_width = true - lines.last << NON_PRINTING_START - when non_printing_end - in_zero_width = false - lines.last << NON_PRINTING_END - when csi - lines.last << csi - seq << csi - when osc - lines.last << osc - seq << osc - when gc - unless in_zero_width - mbchar_width = get_mbchar_width(gc) - if (width += mbchar_width) > max_width - width = mbchar_width - lines << nil - lines << seq.dup - height += 1 - end - end - lines.last << gc - end - end - # The cursor moves to next line in first - if width == max_width - lines << nil - lines << String.new(encoding: encoding) - height += 1 - end - [lines, height] - end - - # Take a chunk of a String cut by width with escape sequences. - def self.take_range(str, start_col, max_width) - chunk = String.new(encoding: str.encoding) - total_width = 0 - rest = str.encode(Encoding::UTF_8) - in_zero_width = false - rest.scan(WIDTH_SCANNER) do |non_printing_start, non_printing_end, csi, osc, gc| - case - when non_printing_start - in_zero_width = true - when non_printing_end - in_zero_width = false - when csi - chunk << csi - when osc - chunk << osc - when gc - if in_zero_width - chunk << gc - else - mbchar_width = get_mbchar_width(gc) - total_width += mbchar_width - break if (start_col + max_width) < total_width - chunk << gc if start_col < total_width - end - end - end - chunk - end - - def self.get_next_mbchar_size(line, byte_pointer) - grapheme = line.byteslice(byte_pointer..-1).grapheme_clusters.first - grapheme ? grapheme.bytesize : 0 - end - - def self.get_prev_mbchar_size(line, byte_pointer) - if byte_pointer.zero? - 0 - else - grapheme = line.byteslice(0..(byte_pointer - 1)).grapheme_clusters.last - grapheme ? grapheme.bytesize : 0 - end - end - - def self.em_forward_word(line, byte_pointer) - width = 0 - byte_size = 0 - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/ - width += get_mbchar_width(mbchar) - byte_size += size - end - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - width += get_mbchar_width(mbchar) - byte_size += size - end - [byte_size, width] - end - - def self.em_forward_word_with_capitalization(line, byte_pointer) - width = 0 - byte_size = 0 - new_str = String.new - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/ - new_str += mbchar - width += get_mbchar_width(mbchar) - byte_size += size - end - first = true - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - if first - new_str += mbchar.upcase - first = false - else - new_str += mbchar.downcase - end - width += get_mbchar_width(mbchar) - byte_size += size - end - [byte_size, width, new_str] - end - - def self.em_backward_word(line, byte_pointer) - width = 0 - byte_size = 0 - while 0 < (byte_pointer - byte_size) - size = get_prev_mbchar_size(line, byte_pointer - byte_size) - mbchar = line.byteslice(byte_pointer - byte_size - size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/ - width += get_mbchar_width(mbchar) - byte_size += size - end - while 0 < (byte_pointer - byte_size) - size = get_prev_mbchar_size(line, byte_pointer - byte_size) - mbchar = line.byteslice(byte_pointer - byte_size - size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - width += get_mbchar_width(mbchar) - byte_size += size - end - [byte_size, width] - end - - def self.em_big_backward_word(line, byte_pointer) - width = 0 - byte_size = 0 - while 0 < (byte_pointer - byte_size) - size = get_prev_mbchar_size(line, byte_pointer - byte_size) - mbchar = line.byteslice(byte_pointer - byte_size - size, size) - break if mbchar =~ /\S/ - width += get_mbchar_width(mbchar) - byte_size += size - end - while 0 < (byte_pointer - byte_size) - size = get_prev_mbchar_size(line, byte_pointer - byte_size) - mbchar = line.byteslice(byte_pointer - byte_size - size, size) - break if mbchar =~ /\s/ - width += get_mbchar_width(mbchar) - byte_size += size - end - [byte_size, width] - end - - def self.ed_transpose_words(line, byte_pointer) - right_word_start = nil - size = get_next_mbchar_size(line, byte_pointer) - mbchar = line.byteslice(byte_pointer, size) - if size.zero? - # ' aaa bbb [cursor]' - byte_size = 0 - while 0 < (byte_pointer + byte_size) - size = get_prev_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size - size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/ - byte_size -= size - end - while 0 < (byte_pointer + byte_size) - size = get_prev_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size - size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - byte_size -= size - end - right_word_start = byte_pointer + byte_size - byte_size = 0 - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - byte_size += size - end - after_start = byte_pointer + byte_size - elsif mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/ - # ' aaa bb[cursor]b' - byte_size = 0 - while 0 < (byte_pointer + byte_size) - size = get_prev_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size - size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - byte_size -= size - end - right_word_start = byte_pointer + byte_size - byte_size = 0 - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - byte_size += size - end - after_start = byte_pointer + byte_size - else - byte_size = 0 - while (line.bytesize - 1) > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/ - byte_size += size - end - if (byte_pointer + byte_size) == (line.bytesize - 1) - # ' aaa bbb [cursor] ' - after_start = line.bytesize - while 0 < (byte_pointer + byte_size) - size = get_prev_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size - size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/ - byte_size -= size - end - while 0 < (byte_pointer + byte_size) - size = get_prev_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size - size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - byte_size -= size - end - right_word_start = byte_pointer + byte_size - else - # ' aaa [cursor] bbb ' - right_word_start = byte_pointer + byte_size - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - byte_size += size - end - after_start = byte_pointer + byte_size - end - end - byte_size = right_word_start - byte_pointer - while 0 < (byte_pointer + byte_size) - size = get_prev_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size - size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/ - byte_size -= size - end - middle_start = byte_pointer + byte_size - byte_size = middle_start - byte_pointer - while 0 < (byte_pointer + byte_size) - size = get_prev_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size - size, size) - break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/ - byte_size -= size - end - left_word_start = byte_pointer + byte_size - [left_word_start, middle_start, right_word_start, after_start] - end - - def self.vi_big_forward_word(line, byte_pointer) - width = 0 - byte_size = 0 - while (line.bytesize - 1) > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar =~ /\s/ - width += get_mbchar_width(mbchar) - byte_size += size - end - while (line.bytesize - 1) > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar =~ /\S/ - width += get_mbchar_width(mbchar) - byte_size += size - end - [byte_size, width] - end - - def self.vi_big_forward_end_word(line, byte_pointer) - if (line.bytesize - 1) > byte_pointer - size = get_next_mbchar_size(line, byte_pointer) - mbchar = line.byteslice(byte_pointer, size) - width = get_mbchar_width(mbchar) - byte_size = size - else - return [0, 0] - end - while (line.bytesize - 1) > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar =~ /\S/ - width += get_mbchar_width(mbchar) - byte_size += size - end - prev_width = width - prev_byte_size = byte_size - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar =~ /\s/ - prev_width = width - prev_byte_size = byte_size - width += get_mbchar_width(mbchar) - byte_size += size - end - [prev_byte_size, prev_width] - end - - def self.vi_big_backward_word(line, byte_pointer) - width = 0 - byte_size = 0 - while 0 < (byte_pointer - byte_size) - size = get_prev_mbchar_size(line, byte_pointer - byte_size) - mbchar = line.byteslice(byte_pointer - byte_size - size, size) - break if mbchar =~ /\S/ - width += get_mbchar_width(mbchar) - byte_size += size - end - while 0 < (byte_pointer - byte_size) - size = get_prev_mbchar_size(line, byte_pointer - byte_size) - mbchar = line.byteslice(byte_pointer - byte_size - size, size) - break if mbchar =~ /\s/ - width += get_mbchar_width(mbchar) - byte_size += size - end - [byte_size, width] - end - - def self.vi_forward_word(line, byte_pointer, drop_terminate_spaces = false) - if line.bytesize > byte_pointer - size = get_next_mbchar_size(line, byte_pointer) - mbchar = line.byteslice(byte_pointer, size) - if mbchar =~ /\w/ - started_by = :word - elsif mbchar =~ /\s/ - started_by = :space - else - started_by = :non_word_printable - end - width = get_mbchar_width(mbchar) - byte_size = size - else - return [0, 0] - end - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - case started_by - when :word - break if mbchar =~ /\W/ - when :space - break if mbchar =~ /\S/ - when :non_word_printable - break if mbchar =~ /\w|\s/ - end - width += get_mbchar_width(mbchar) - byte_size += size - end - return [byte_size, width] if drop_terminate_spaces - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - break if mbchar =~ /\S/ - width += get_mbchar_width(mbchar) - byte_size += size - end - [byte_size, width] - end - - def self.vi_forward_end_word(line, byte_pointer) - if (line.bytesize - 1) > byte_pointer - size = get_next_mbchar_size(line, byte_pointer) - mbchar = line.byteslice(byte_pointer, size) - if mbchar =~ /\w/ - started_by = :word - elsif mbchar =~ /\s/ - started_by = :space - else - started_by = :non_word_printable - end - width = get_mbchar_width(mbchar) - byte_size = size - else - return [0, 0] - end - if (line.bytesize - 1) > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - if mbchar =~ /\w/ - second = :word - elsif mbchar =~ /\s/ - second = :space - else - second = :non_word_printable - end - second_width = get_mbchar_width(mbchar) - second_byte_size = size - else - return [byte_size, width] - end - if second == :space - width += second_width - byte_size += second_byte_size - while (line.bytesize - 1) > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - if mbchar =~ /\S/ - if mbchar =~ /\w/ - started_by = :word - else - started_by = :non_word_printable - end - break - end - width += get_mbchar_width(mbchar) - byte_size += size - end - else - case [started_by, second] - when [:word, :non_word_printable], [:non_word_printable, :word] - started_by = second - else - width += second_width - byte_size += second_byte_size - started_by = second - end - end - prev_width = width - prev_byte_size = byte_size - while line.bytesize > (byte_pointer + byte_size) - size = get_next_mbchar_size(line, byte_pointer + byte_size) - mbchar = line.byteslice(byte_pointer + byte_size, size) - case started_by - when :word - break if mbchar =~ /\W/ - when :non_word_printable - break if mbchar =~ /[\w\s]/ - end - prev_width = width - prev_byte_size = byte_size - width += get_mbchar_width(mbchar) - byte_size += size - end - [prev_byte_size, prev_width] - end - - def self.vi_backward_word(line, byte_pointer) - width = 0 - byte_size = 0 - while 0 < (byte_pointer - byte_size) - size = get_prev_mbchar_size(line, byte_pointer - byte_size) - mbchar = line.byteslice(byte_pointer - byte_size - size, size) - if mbchar =~ /\S/ - if mbchar =~ /\w/ - started_by = :word - else - started_by = :non_word_printable - end - break - end - width += get_mbchar_width(mbchar) - byte_size += size - end - while 0 < (byte_pointer - byte_size) - size = get_prev_mbchar_size(line, byte_pointer - byte_size) - mbchar = line.byteslice(byte_pointer - byte_size - size, size) - case started_by - when :word - break if mbchar =~ /\W/ - when :non_word_printable - break if mbchar =~ /[\w\s]/ - end - width += get_mbchar_width(mbchar) - byte_size += size - end - [byte_size, width] - end - - def self.vi_first_print(line) - width = 0 - byte_size = 0 - while (line.bytesize - 1) > byte_size - size = get_next_mbchar_size(line, byte_size) - mbchar = line.byteslice(byte_size, size) - if mbchar =~ /\S/ - break - end - width += get_mbchar_width(mbchar) - byte_size += size - end - [byte_size, width] - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/unicode/east_asian_width.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/unicode/east_asian_width.rb deleted file mode 100644 index 97dfec4..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/unicode/east_asian_width.rb +++ /dev/null @@ -1,1196 +0,0 @@ -class Reline::Unicode::EastAsianWidth - # This is based on EastAsianWidth.txt - # EastAsianWidth.txt - - # Fullwidth - TYPE_F = /^[#{ %W( - \u{3000} - \u{FF01}-\u{FF60} - \u{FFE0}-\u{FFE6} - ).join }]/ - - # Halfwidth - TYPE_H = /^[#{ %W( - \u{20A9} - \u{FF61}-\u{FFBE} - \u{FFC2}-\u{FFC7} - \u{FFCA}-\u{FFCF} - \u{FFD2}-\u{FFD7} - \u{FFDA}-\u{FFDC} - \u{FFE8}-\u{FFEE} - ).join }]/ - - # Wide - TYPE_W = /^[#{ %W( - \u{1100}-\u{115F} - \u{231A}-\u{231B} - \u{2329}-\u{232A} - \u{23E9}-\u{23EC} - \u{23F0} - \u{23F3} - \u{25FD}-\u{25FE} - \u{2614}-\u{2615} - \u{2648}-\u{2653} - \u{267F} - \u{2693} - \u{26A1} - \u{26AA}-\u{26AB} - \u{26BD}-\u{26BE} - \u{26C4}-\u{26C5} - \u{26CE} - \u{26D4} - \u{26EA} - \u{26F2}-\u{26F3} - \u{26F5} - \u{26FA} - \u{26FD} - \u{2705} - \u{270A}-\u{270B} - \u{2728} - \u{274C} - \u{274E} - \u{2753}-\u{2755} - \u{2757} - \u{2795}-\u{2797} - \u{27B0} - \u{27BF} - \u{2B1B}-\u{2B1C} - \u{2B50} - \u{2B55} - \u{2E80}-\u{2E99} - \u{2E9B}-\u{2EF3} - \u{2F00}-\u{2FD5} - \u{2FF0}-\u{2FFB} - \u{3001}-\u{303E} - \u{3041}-\u{3096} - \u{3099}-\u{30FF} - \u{3105}-\u{312F} - \u{3131}-\u{318E} - \u{3190}-\u{31E3} - \u{31F0}-\u{321E} - \u{3220}-\u{3247} - \u{3250}-\u{4DBF} - \u{4E00}-\u{A48C} - \u{A490}-\u{A4C6} - \u{A960}-\u{A97C} - \u{AC00}-\u{D7A3} - \u{F900}-\u{FAFF} - \u{FE10}-\u{FE19} - \u{FE30}-\u{FE52} - \u{FE54}-\u{FE66} - \u{FE68}-\u{FE6B} - \u{16FE0}-\u{16FE4} - \u{16FF0}-\u{16FF1} - \u{17000}-\u{187F7} - \u{18800}-\u{18CD5} - \u{18D00}-\u{18D08} - \u{1AFF0}-\u{1AFF3} - \u{1AFF5}-\u{1AFFB} - \u{1AFFD}-\u{1AFFE} - \u{1B000}-\u{1B122} - \u{1B132} - \u{1B150}-\u{1B152} - \u{1B155} - \u{1B164}-\u{1B167} - \u{1B170}-\u{1B2FB} - \u{1F004} - \u{1F0CF} - \u{1F18E} - \u{1F191}-\u{1F19A} - \u{1F200}-\u{1F202} - \u{1F210}-\u{1F23B} - \u{1F240}-\u{1F248} - \u{1F250}-\u{1F251} - \u{1F260}-\u{1F265} - \u{1F300}-\u{1F320} - \u{1F32D}-\u{1F335} - \u{1F337}-\u{1F37C} - \u{1F37E}-\u{1F393} - \u{1F3A0}-\u{1F3CA} - \u{1F3CF}-\u{1F3D3} - \u{1F3E0}-\u{1F3F0} - \u{1F3F4} - \u{1F3F8}-\u{1F43E} - \u{1F440} - \u{1F442}-\u{1F4FC} - \u{1F4FF}-\u{1F53D} - \u{1F54B}-\u{1F54E} - \u{1F550}-\u{1F567} - \u{1F57A} - \u{1F595}-\u{1F596} - \u{1F5A4} - \u{1F5FB}-\u{1F64F} - \u{1F680}-\u{1F6C5} - \u{1F6CC} - \u{1F6D0}-\u{1F6D2} - \u{1F6D5}-\u{1F6D7} - \u{1F6DC}-\u{1F6DF} - \u{1F6EB}-\u{1F6EC} - \u{1F6F4}-\u{1F6FC} - \u{1F7E0}-\u{1F7EB} - \u{1F7F0} - \u{1F90C}-\u{1F93A} - \u{1F93C}-\u{1F945} - \u{1F947}-\u{1F9FF} - \u{1FA70}-\u{1FA7C} - \u{1FA80}-\u{1FA88} - \u{1FA90}-\u{1FABD} - \u{1FABF}-\u{1FAC5} - \u{1FACE}-\u{1FADB} - \u{1FAE0}-\u{1FAE8} - \u{1FAF0}-\u{1FAF8} - \u{20000}-\u{2FFFD} - \u{30000}-\u{3FFFD} - ).join }]/ - - # Narrow - TYPE_NA = /^[#{ %W( - \u{0020}-\u{007E} - \u{00A2}-\u{00A3} - \u{00A5}-\u{00A6} - \u{00AC} - \u{00AF} - \u{27E6}-\u{27ED} - \u{2985}-\u{2986} - ).join }]/ - - # Ambiguous - TYPE_A = /^[#{ %W( - \u{00A1} - \u{00A4} - \u{00A7}-\u{00A8} - \u{00AA} - \u{00AD}-\u{00AE} - \u{00B0}-\u{00B4} - \u{00B6}-\u{00BA} - \u{00BC}-\u{00BF} - \u{00C6} - \u{00D0} - \u{00D7}-\u{00D8} - \u{00DE}-\u{00E1} - \u{00E6} - \u{00E8}-\u{00EA} - \u{00EC}-\u{00ED} - \u{00F0} - \u{00F2}-\u{00F3} - \u{00F7}-\u{00FA} - \u{00FC} - \u{00FE} - \u{0101} - \u{0111} - \u{0113} - \u{011B} - \u{0126}-\u{0127} - \u{012B} - \u{0131}-\u{0133} - \u{0138} - \u{013F}-\u{0142} - \u{0144} - \u{0148}-\u{014B} - \u{014D} - \u{0152}-\u{0153} - \u{0166}-\u{0167} - \u{016B} - \u{01CE} - \u{01D0} - \u{01D2} - \u{01D4} - \u{01D6} - \u{01D8} - \u{01DA} - \u{01DC} - \u{0251} - \u{0261} - \u{02C4} - \u{02C7} - \u{02C9}-\u{02CB} - \u{02CD} - \u{02D0} - \u{02D8}-\u{02DB} - \u{02DD} - \u{02DF} - \u{0300}-\u{036F} - \u{0391}-\u{03A1} - \u{03A3}-\u{03A9} - \u{03B1}-\u{03C1} - \u{03C3}-\u{03C9} - \u{0401} - \u{0410}-\u{044F} - \u{0451} - \u{2010} - \u{2013}-\u{2016} - \u{2018}-\u{2019} - \u{201C}-\u{201D} - \u{2020}-\u{2022} - \u{2024}-\u{2027} - \u{2030} - \u{2032}-\u{2033} - \u{2035} - \u{203B} - \u{203E} - \u{2074} - \u{207F} - \u{2081}-\u{2084} - \u{20AC} - \u{2103} - \u{2105} - \u{2109} - \u{2113} - \u{2116} - \u{2121}-\u{2122} - \u{2126} - \u{212B} - \u{2153}-\u{2154} - \u{215B}-\u{215E} - \u{2160}-\u{216B} - \u{2170}-\u{2179} - \u{2189} - \u{2190}-\u{2199} - \u{21B8}-\u{21B9} - \u{21D2} - \u{21D4} - \u{21E7} - \u{2200} - \u{2202}-\u{2203} - \u{2207}-\u{2208} - \u{220B} - \u{220F} - \u{2211} - \u{2215} - \u{221A} - \u{221D}-\u{2220} - \u{2223} - \u{2225} - \u{2227}-\u{222C} - \u{222E} - \u{2234}-\u{2237} - \u{223C}-\u{223D} - \u{2248} - \u{224C} - \u{2252} - \u{2260}-\u{2261} - \u{2264}-\u{2267} - \u{226A}-\u{226B} - \u{226E}-\u{226F} - \u{2282}-\u{2283} - \u{2286}-\u{2287} - \u{2295} - \u{2299} - \u{22A5} - \u{22BF} - \u{2312} - \u{2460}-\u{24E9} - \u{24EB}-\u{254B} - \u{2550}-\u{2573} - \u{2580}-\u{258F} - \u{2592}-\u{2595} - \u{25A0}-\u{25A1} - \u{25A3}-\u{25A9} - \u{25B2}-\u{25B3} - \u{25B6}-\u{25B7} - \u{25BC}-\u{25BD} - \u{25C0}-\u{25C1} - \u{25C6}-\u{25C8} - \u{25CB} - \u{25CE}-\u{25D1} - \u{25E2}-\u{25E5} - \u{25EF} - \u{2605}-\u{2606} - \u{2609} - \u{260E}-\u{260F} - \u{261C} - \u{261E} - \u{2640} - \u{2642} - \u{2660}-\u{2661} - \u{2663}-\u{2665} - \u{2667}-\u{266A} - \u{266C}-\u{266D} - \u{266F} - \u{269E}-\u{269F} - \u{26BF} - \u{26C6}-\u{26CD} - \u{26CF}-\u{26D3} - \u{26D5}-\u{26E1} - \u{26E3} - \u{26E8}-\u{26E9} - \u{26EB}-\u{26F1} - \u{26F4} - \u{26F6}-\u{26F9} - \u{26FB}-\u{26FC} - \u{26FE}-\u{26FF} - \u{273D} - \u{2776}-\u{277F} - \u{2B56}-\u{2B59} - \u{3248}-\u{324F} - \u{E000}-\u{F8FF} - \u{FE00}-\u{FE0F} - \u{FFFD} - \u{1F100}-\u{1F10A} - \u{1F110}-\u{1F12D} - \u{1F130}-\u{1F169} - \u{1F170}-\u{1F18D} - \u{1F18F}-\u{1F190} - \u{1F19B}-\u{1F1AC} - \u{E0100}-\u{E01EF} - \u{F0000}-\u{FFFFD} - \u{100000}-\u{10FFFD} - ).join }]/ - - # Neutral - TYPE_N = /^[#{ %W( - \u{0000}-\u{001F} - \u{007F}-\u{00A0} - \u{00A9} - \u{00AB} - \u{00B5} - \u{00BB} - \u{00C0}-\u{00C5} - \u{00C7}-\u{00CF} - \u{00D1}-\u{00D6} - \u{00D9}-\u{00DD} - \u{00E2}-\u{00E5} - \u{00E7} - \u{00EB} - \u{00EE}-\u{00EF} - \u{00F1} - \u{00F4}-\u{00F6} - \u{00FB} - \u{00FD} - \u{00FF}-\u{0100} - \u{0102}-\u{0110} - \u{0112} - \u{0114}-\u{011A} - \u{011C}-\u{0125} - \u{0128}-\u{012A} - \u{012C}-\u{0130} - \u{0134}-\u{0137} - \u{0139}-\u{013E} - \u{0143} - \u{0145}-\u{0147} - \u{014C} - \u{014E}-\u{0151} - \u{0154}-\u{0165} - \u{0168}-\u{016A} - \u{016C}-\u{01CD} - \u{01CF} - \u{01D1} - \u{01D3} - \u{01D5} - \u{01D7} - \u{01D9} - \u{01DB} - \u{01DD}-\u{0250} - \u{0252}-\u{0260} - \u{0262}-\u{02C3} - \u{02C5}-\u{02C6} - \u{02C8} - \u{02CC} - \u{02CE}-\u{02CF} - \u{02D1}-\u{02D7} - \u{02DC} - \u{02DE} - \u{02E0}-\u{02FF} - \u{0370}-\u{0377} - \u{037A}-\u{037F} - \u{0384}-\u{038A} - \u{038C} - \u{038E}-\u{0390} - \u{03AA}-\u{03B0} - \u{03C2} - \u{03CA}-\u{0400} - \u{0402}-\u{040F} - \u{0450} - \u{0452}-\u{052F} - \u{0531}-\u{0556} - \u{0559}-\u{058A} - \u{058D}-\u{058F} - \u{0591}-\u{05C7} - \u{05D0}-\u{05EA} - \u{05EF}-\u{05F4} - \u{0600}-\u{070D} - \u{070F}-\u{074A} - \u{074D}-\u{07B1} - \u{07C0}-\u{07FA} - \u{07FD}-\u{082D} - \u{0830}-\u{083E} - \u{0840}-\u{085B} - \u{085E} - \u{0860}-\u{086A} - \u{0870}-\u{088E} - \u{0890}-\u{0891} - \u{0898}-\u{0983} - \u{0985}-\u{098C} - \u{098F}-\u{0990} - \u{0993}-\u{09A8} - \u{09AA}-\u{09B0} - \u{09B2} - \u{09B6}-\u{09B9} - \u{09BC}-\u{09C4} - \u{09C7}-\u{09C8} - \u{09CB}-\u{09CE} - \u{09D7} - \u{09DC}-\u{09DD} - \u{09DF}-\u{09E3} - \u{09E6}-\u{09FE} - \u{0A01}-\u{0A03} - \u{0A05}-\u{0A0A} - \u{0A0F}-\u{0A10} - \u{0A13}-\u{0A28} - \u{0A2A}-\u{0A30} - \u{0A32}-\u{0A33} - \u{0A35}-\u{0A36} - \u{0A38}-\u{0A39} - \u{0A3C} - \u{0A3E}-\u{0A42} - \u{0A47}-\u{0A48} - \u{0A4B}-\u{0A4D} - \u{0A51} - \u{0A59}-\u{0A5C} - \u{0A5E} - \u{0A66}-\u{0A76} - \u{0A81}-\u{0A83} - \u{0A85}-\u{0A8D} - \u{0A8F}-\u{0A91} - \u{0A93}-\u{0AA8} - \u{0AAA}-\u{0AB0} - \u{0AB2}-\u{0AB3} - \u{0AB5}-\u{0AB9} - \u{0ABC}-\u{0AC5} - \u{0AC7}-\u{0AC9} - \u{0ACB}-\u{0ACD} - \u{0AD0} - \u{0AE0}-\u{0AE3} - \u{0AE6}-\u{0AF1} - \u{0AF9}-\u{0AFF} - \u{0B01}-\u{0B03} - \u{0B05}-\u{0B0C} - \u{0B0F}-\u{0B10} - \u{0B13}-\u{0B28} - \u{0B2A}-\u{0B30} - \u{0B32}-\u{0B33} - \u{0B35}-\u{0B39} - \u{0B3C}-\u{0B44} - \u{0B47}-\u{0B48} - \u{0B4B}-\u{0B4D} - \u{0B55}-\u{0B57} - \u{0B5C}-\u{0B5D} - \u{0B5F}-\u{0B63} - \u{0B66}-\u{0B77} - \u{0B82}-\u{0B83} - \u{0B85}-\u{0B8A} - \u{0B8E}-\u{0B90} - \u{0B92}-\u{0B95} - \u{0B99}-\u{0B9A} - \u{0B9C} - \u{0B9E}-\u{0B9F} - \u{0BA3}-\u{0BA4} - \u{0BA8}-\u{0BAA} - \u{0BAE}-\u{0BB9} - \u{0BBE}-\u{0BC2} - \u{0BC6}-\u{0BC8} - \u{0BCA}-\u{0BCD} - \u{0BD0} - \u{0BD7} - \u{0BE6}-\u{0BFA} - \u{0C00}-\u{0C0C} - \u{0C0E}-\u{0C10} - \u{0C12}-\u{0C28} - \u{0C2A}-\u{0C39} - \u{0C3C}-\u{0C44} - \u{0C46}-\u{0C48} - \u{0C4A}-\u{0C4D} - \u{0C55}-\u{0C56} - \u{0C58}-\u{0C5A} - \u{0C5D} - \u{0C60}-\u{0C63} - \u{0C66}-\u{0C6F} - \u{0C77}-\u{0C8C} - \u{0C8E}-\u{0C90} - \u{0C92}-\u{0CA8} - \u{0CAA}-\u{0CB3} - \u{0CB5}-\u{0CB9} - \u{0CBC}-\u{0CC4} - \u{0CC6}-\u{0CC8} - \u{0CCA}-\u{0CCD} - \u{0CD5}-\u{0CD6} - \u{0CDD}-\u{0CDE} - \u{0CE0}-\u{0CE3} - \u{0CE6}-\u{0CEF} - \u{0CF1}-\u{0CF3} - \u{0D00}-\u{0D0C} - \u{0D0E}-\u{0D10} - \u{0D12}-\u{0D44} - \u{0D46}-\u{0D48} - \u{0D4A}-\u{0D4F} - \u{0D54}-\u{0D63} - \u{0D66}-\u{0D7F} - \u{0D81}-\u{0D83} - \u{0D85}-\u{0D96} - \u{0D9A}-\u{0DB1} - \u{0DB3}-\u{0DBB} - \u{0DBD} - \u{0DC0}-\u{0DC6} - \u{0DCA} - \u{0DCF}-\u{0DD4} - \u{0DD6} - \u{0DD8}-\u{0DDF} - \u{0DE6}-\u{0DEF} - \u{0DF2}-\u{0DF4} - \u{0E01}-\u{0E3A} - \u{0E3F}-\u{0E5B} - \u{0E81}-\u{0E82} - \u{0E84} - \u{0E86}-\u{0E8A} - \u{0E8C}-\u{0EA3} - \u{0EA5} - \u{0EA7}-\u{0EBD} - \u{0EC0}-\u{0EC4} - \u{0EC6} - \u{0EC8}-\u{0ECE} - \u{0ED0}-\u{0ED9} - \u{0EDC}-\u{0EDF} - \u{0F00}-\u{0F47} - \u{0F49}-\u{0F6C} - \u{0F71}-\u{0F97} - \u{0F99}-\u{0FBC} - \u{0FBE}-\u{0FCC} - \u{0FCE}-\u{0FDA} - \u{1000}-\u{10C5} - \u{10C7} - \u{10CD} - \u{10D0}-\u{10FF} - \u{1160}-\u{1248} - \u{124A}-\u{124D} - \u{1250}-\u{1256} - \u{1258} - \u{125A}-\u{125D} - \u{1260}-\u{1288} - \u{128A}-\u{128D} - \u{1290}-\u{12B0} - \u{12B2}-\u{12B5} - \u{12B8}-\u{12BE} - \u{12C0} - \u{12C2}-\u{12C5} - \u{12C8}-\u{12D6} - \u{12D8}-\u{1310} - \u{1312}-\u{1315} - \u{1318}-\u{135A} - \u{135D}-\u{137C} - \u{1380}-\u{1399} - \u{13A0}-\u{13F5} - \u{13F8}-\u{13FD} - \u{1400}-\u{169C} - \u{16A0}-\u{16F8} - \u{1700}-\u{1715} - \u{171F}-\u{1736} - \u{1740}-\u{1753} - \u{1760}-\u{176C} - \u{176E}-\u{1770} - \u{1772}-\u{1773} - \u{1780}-\u{17DD} - \u{17E0}-\u{17E9} - \u{17F0}-\u{17F9} - \u{1800}-\u{1819} - \u{1820}-\u{1878} - \u{1880}-\u{18AA} - \u{18B0}-\u{18F5} - \u{1900}-\u{191E} - \u{1920}-\u{192B} - \u{1930}-\u{193B} - \u{1940} - \u{1944}-\u{196D} - \u{1970}-\u{1974} - \u{1980}-\u{19AB} - \u{19B0}-\u{19C9} - \u{19D0}-\u{19DA} - \u{19DE}-\u{1A1B} - \u{1A1E}-\u{1A5E} - \u{1A60}-\u{1A7C} - \u{1A7F}-\u{1A89} - \u{1A90}-\u{1A99} - \u{1AA0}-\u{1AAD} - \u{1AB0}-\u{1ACE} - \u{1B00}-\u{1B4C} - \u{1B50}-\u{1B7E} - \u{1B80}-\u{1BF3} - \u{1BFC}-\u{1C37} - \u{1C3B}-\u{1C49} - \u{1C4D}-\u{1C88} - \u{1C90}-\u{1CBA} - \u{1CBD}-\u{1CC7} - \u{1CD0}-\u{1CFA} - \u{1D00}-\u{1F15} - \u{1F18}-\u{1F1D} - \u{1F20}-\u{1F45} - \u{1F48}-\u{1F4D} - \u{1F50}-\u{1F57} - \u{1F59} - \u{1F5B} - \u{1F5D} - \u{1F5F}-\u{1F7D} - \u{1F80}-\u{1FB4} - \u{1FB6}-\u{1FC4} - \u{1FC6}-\u{1FD3} - \u{1FD6}-\u{1FDB} - \u{1FDD}-\u{1FEF} - \u{1FF2}-\u{1FF4} - \u{1FF6}-\u{1FFE} - \u{2000}-\u{200F} - \u{2011}-\u{2012} - \u{2017} - \u{201A}-\u{201B} - \u{201E}-\u{201F} - \u{2023} - \u{2028}-\u{202F} - \u{2031} - \u{2034} - \u{2036}-\u{203A} - \u{203C}-\u{203D} - \u{203F}-\u{2064} - \u{2066}-\u{2071} - \u{2075}-\u{207E} - \u{2080} - \u{2085}-\u{208E} - \u{2090}-\u{209C} - \u{20A0}-\u{20A8} - \u{20AA}-\u{20AB} - \u{20AD}-\u{20C0} - \u{20D0}-\u{20F0} - \u{2100}-\u{2102} - \u{2104} - \u{2106}-\u{2108} - \u{210A}-\u{2112} - \u{2114}-\u{2115} - \u{2117}-\u{2120} - \u{2123}-\u{2125} - \u{2127}-\u{212A} - \u{212C}-\u{2152} - \u{2155}-\u{215A} - \u{215F} - \u{216C}-\u{216F} - \u{217A}-\u{2188} - \u{218A}-\u{218B} - \u{219A}-\u{21B7} - \u{21BA}-\u{21D1} - \u{21D3} - \u{21D5}-\u{21E6} - \u{21E8}-\u{21FF} - \u{2201} - \u{2204}-\u{2206} - \u{2209}-\u{220A} - \u{220C}-\u{220E} - \u{2210} - \u{2212}-\u{2214} - \u{2216}-\u{2219} - \u{221B}-\u{221C} - \u{2221}-\u{2222} - \u{2224} - \u{2226} - \u{222D} - \u{222F}-\u{2233} - \u{2238}-\u{223B} - \u{223E}-\u{2247} - \u{2249}-\u{224B} - \u{224D}-\u{2251} - \u{2253}-\u{225F} - \u{2262}-\u{2263} - \u{2268}-\u{2269} - \u{226C}-\u{226D} - \u{2270}-\u{2281} - \u{2284}-\u{2285} - \u{2288}-\u{2294} - \u{2296}-\u{2298} - \u{229A}-\u{22A4} - \u{22A6}-\u{22BE} - \u{22C0}-\u{2311} - \u{2313}-\u{2319} - \u{231C}-\u{2328} - \u{232B}-\u{23E8} - \u{23ED}-\u{23EF} - \u{23F1}-\u{23F2} - \u{23F4}-\u{2426} - \u{2440}-\u{244A} - \u{24EA} - \u{254C}-\u{254F} - \u{2574}-\u{257F} - \u{2590}-\u{2591} - \u{2596}-\u{259F} - \u{25A2} - \u{25AA}-\u{25B1} - \u{25B4}-\u{25B5} - \u{25B8}-\u{25BB} - \u{25BE}-\u{25BF} - \u{25C2}-\u{25C5} - \u{25C9}-\u{25CA} - \u{25CC}-\u{25CD} - \u{25D2}-\u{25E1} - \u{25E6}-\u{25EE} - \u{25F0}-\u{25FC} - \u{25FF}-\u{2604} - \u{2607}-\u{2608} - \u{260A}-\u{260D} - \u{2610}-\u{2613} - \u{2616}-\u{261B} - \u{261D} - \u{261F}-\u{263F} - \u{2641} - \u{2643}-\u{2647} - \u{2654}-\u{265F} - \u{2662} - \u{2666} - \u{266B} - \u{266E} - \u{2670}-\u{267E} - \u{2680}-\u{2692} - \u{2694}-\u{269D} - \u{26A0} - \u{26A2}-\u{26A9} - \u{26AC}-\u{26BC} - \u{26C0}-\u{26C3} - \u{26E2} - \u{26E4}-\u{26E7} - \u{2700}-\u{2704} - \u{2706}-\u{2709} - \u{270C}-\u{2727} - \u{2729}-\u{273C} - \u{273E}-\u{274B} - \u{274D} - \u{274F}-\u{2752} - \u{2756} - \u{2758}-\u{2775} - \u{2780}-\u{2794} - \u{2798}-\u{27AF} - \u{27B1}-\u{27BE} - \u{27C0}-\u{27E5} - \u{27EE}-\u{2984} - \u{2987}-\u{2B1A} - \u{2B1D}-\u{2B4F} - \u{2B51}-\u{2B54} - \u{2B5A}-\u{2B73} - \u{2B76}-\u{2B95} - \u{2B97}-\u{2CF3} - \u{2CF9}-\u{2D25} - \u{2D27} - \u{2D2D} - \u{2D30}-\u{2D67} - \u{2D6F}-\u{2D70} - \u{2D7F}-\u{2D96} - \u{2DA0}-\u{2DA6} - \u{2DA8}-\u{2DAE} - \u{2DB0}-\u{2DB6} - \u{2DB8}-\u{2DBE} - \u{2DC0}-\u{2DC6} - \u{2DC8}-\u{2DCE} - \u{2DD0}-\u{2DD6} - \u{2DD8}-\u{2DDE} - \u{2DE0}-\u{2E5D} - \u{303F} - \u{4DC0}-\u{4DFF} - \u{A4D0}-\u{A62B} - \u{A640}-\u{A6F7} - \u{A700}-\u{A7CA} - \u{A7D0}-\u{A7D1} - \u{A7D3} - \u{A7D5}-\u{A7D9} - \u{A7F2}-\u{A82C} - \u{A830}-\u{A839} - \u{A840}-\u{A877} - \u{A880}-\u{A8C5} - \u{A8CE}-\u{A8D9} - \u{A8E0}-\u{A953} - \u{A95F} - \u{A980}-\u{A9CD} - \u{A9CF}-\u{A9D9} - \u{A9DE}-\u{A9FE} - \u{AA00}-\u{AA36} - \u{AA40}-\u{AA4D} - \u{AA50}-\u{AA59} - \u{AA5C}-\u{AAC2} - \u{AADB}-\u{AAF6} - \u{AB01}-\u{AB06} - \u{AB09}-\u{AB0E} - \u{AB11}-\u{AB16} - \u{AB20}-\u{AB26} - \u{AB28}-\u{AB2E} - \u{AB30}-\u{AB6B} - \u{AB70}-\u{ABED} - \u{ABF0}-\u{ABF9} - \u{D7B0}-\u{D7C6} - \u{D7CB}-\u{D7FB} - \u{FB00}-\u{FB06} - \u{FB13}-\u{FB17} - \u{FB1D}-\u{FB36} - \u{FB38}-\u{FB3C} - \u{FB3E} - \u{FB40}-\u{FB41} - \u{FB43}-\u{FB44} - \u{FB46}-\u{FBC2} - \u{FBD3}-\u{FD8F} - \u{FD92}-\u{FDC7} - \u{FDCF} - \u{FDF0}-\u{FDFF} - \u{FE20}-\u{FE2F} - \u{FE70}-\u{FE74} - \u{FE76}-\u{FEFC} - \u{FEFF} - \u{FFF9}-\u{FFFC} - \u{10000}-\u{1000B} - \u{1000D}-\u{10026} - \u{10028}-\u{1003A} - \u{1003C}-\u{1003D} - \u{1003F}-\u{1004D} - \u{10050}-\u{1005D} - \u{10080}-\u{100FA} - \u{10100}-\u{10102} - \u{10107}-\u{10133} - \u{10137}-\u{1018E} - \u{10190}-\u{1019C} - \u{101A0} - \u{101D0}-\u{101FD} - \u{10280}-\u{1029C} - \u{102A0}-\u{102D0} - \u{102E0}-\u{102FB} - \u{10300}-\u{10323} - \u{1032D}-\u{1034A} - \u{10350}-\u{1037A} - \u{10380}-\u{1039D} - \u{1039F}-\u{103C3} - \u{103C8}-\u{103D5} - \u{10400}-\u{1049D} - \u{104A0}-\u{104A9} - \u{104B0}-\u{104D3} - \u{104D8}-\u{104FB} - \u{10500}-\u{10527} - \u{10530}-\u{10563} - \u{1056F}-\u{1057A} - \u{1057C}-\u{1058A} - \u{1058C}-\u{10592} - \u{10594}-\u{10595} - \u{10597}-\u{105A1} - \u{105A3}-\u{105B1} - \u{105B3}-\u{105B9} - \u{105BB}-\u{105BC} - \u{10600}-\u{10736} - \u{10740}-\u{10755} - \u{10760}-\u{10767} - \u{10780}-\u{10785} - \u{10787}-\u{107B0} - \u{107B2}-\u{107BA} - \u{10800}-\u{10805} - \u{10808} - \u{1080A}-\u{10835} - \u{10837}-\u{10838} - \u{1083C} - \u{1083F}-\u{10855} - \u{10857}-\u{1089E} - \u{108A7}-\u{108AF} - \u{108E0}-\u{108F2} - \u{108F4}-\u{108F5} - \u{108FB}-\u{1091B} - \u{1091F}-\u{10939} - \u{1093F} - \u{10980}-\u{109B7} - \u{109BC}-\u{109CF} - \u{109D2}-\u{10A03} - \u{10A05}-\u{10A06} - \u{10A0C}-\u{10A13} - \u{10A15}-\u{10A17} - \u{10A19}-\u{10A35} - \u{10A38}-\u{10A3A} - \u{10A3F}-\u{10A48} - \u{10A50}-\u{10A58} - \u{10A60}-\u{10A9F} - \u{10AC0}-\u{10AE6} - \u{10AEB}-\u{10AF6} - \u{10B00}-\u{10B35} - \u{10B39}-\u{10B55} - \u{10B58}-\u{10B72} - \u{10B78}-\u{10B91} - \u{10B99}-\u{10B9C} - \u{10BA9}-\u{10BAF} - \u{10C00}-\u{10C48} - \u{10C80}-\u{10CB2} - \u{10CC0}-\u{10CF2} - \u{10CFA}-\u{10D27} - \u{10D30}-\u{10D39} - \u{10E60}-\u{10E7E} - \u{10E80}-\u{10EA9} - \u{10EAB}-\u{10EAD} - \u{10EB0}-\u{10EB1} - \u{10EFD}-\u{10F27} - \u{10F30}-\u{10F59} - \u{10F70}-\u{10F89} - \u{10FB0}-\u{10FCB} - \u{10FE0}-\u{10FF6} - \u{11000}-\u{1104D} - \u{11052}-\u{11075} - \u{1107F}-\u{110C2} - \u{110CD} - \u{110D0}-\u{110E8} - \u{110F0}-\u{110F9} - \u{11100}-\u{11134} - \u{11136}-\u{11147} - \u{11150}-\u{11176} - \u{11180}-\u{111DF} - \u{111E1}-\u{111F4} - \u{11200}-\u{11211} - \u{11213}-\u{11241} - \u{11280}-\u{11286} - \u{11288} - \u{1128A}-\u{1128D} - \u{1128F}-\u{1129D} - \u{1129F}-\u{112A9} - \u{112B0}-\u{112EA} - \u{112F0}-\u{112F9} - \u{11300}-\u{11303} - \u{11305}-\u{1130C} - \u{1130F}-\u{11310} - \u{11313}-\u{11328} - \u{1132A}-\u{11330} - \u{11332}-\u{11333} - \u{11335}-\u{11339} - \u{1133B}-\u{11344} - \u{11347}-\u{11348} - \u{1134B}-\u{1134D} - \u{11350} - \u{11357} - \u{1135D}-\u{11363} - \u{11366}-\u{1136C} - \u{11370}-\u{11374} - \u{11400}-\u{1145B} - \u{1145D}-\u{11461} - \u{11480}-\u{114C7} - \u{114D0}-\u{114D9} - \u{11580}-\u{115B5} - \u{115B8}-\u{115DD} - \u{11600}-\u{11644} - \u{11650}-\u{11659} - \u{11660}-\u{1166C} - \u{11680}-\u{116B9} - \u{116C0}-\u{116C9} - \u{11700}-\u{1171A} - \u{1171D}-\u{1172B} - \u{11730}-\u{11746} - \u{11800}-\u{1183B} - \u{118A0}-\u{118F2} - \u{118FF}-\u{11906} - \u{11909} - \u{1190C}-\u{11913} - \u{11915}-\u{11916} - \u{11918}-\u{11935} - \u{11937}-\u{11938} - \u{1193B}-\u{11946} - \u{11950}-\u{11959} - \u{119A0}-\u{119A7} - \u{119AA}-\u{119D7} - \u{119DA}-\u{119E4} - \u{11A00}-\u{11A47} - \u{11A50}-\u{11AA2} - \u{11AB0}-\u{11AF8} - \u{11B00}-\u{11B09} - \u{11C00}-\u{11C08} - \u{11C0A}-\u{11C36} - \u{11C38}-\u{11C45} - \u{11C50}-\u{11C6C} - \u{11C70}-\u{11C8F} - \u{11C92}-\u{11CA7} - \u{11CA9}-\u{11CB6} - \u{11D00}-\u{11D06} - \u{11D08}-\u{11D09} - \u{11D0B}-\u{11D36} - \u{11D3A} - \u{11D3C}-\u{11D3D} - \u{11D3F}-\u{11D47} - \u{11D50}-\u{11D59} - \u{11D60}-\u{11D65} - \u{11D67}-\u{11D68} - \u{11D6A}-\u{11D8E} - \u{11D90}-\u{11D91} - \u{11D93}-\u{11D98} - \u{11DA0}-\u{11DA9} - \u{11EE0}-\u{11EF8} - \u{11F00}-\u{11F10} - \u{11F12}-\u{11F3A} - \u{11F3E}-\u{11F59} - \u{11FB0} - \u{11FC0}-\u{11FF1} - \u{11FFF}-\u{12399} - \u{12400}-\u{1246E} - \u{12470}-\u{12474} - \u{12480}-\u{12543} - \u{12F90}-\u{12FF2} - \u{13000}-\u{13455} - \u{14400}-\u{14646} - \u{16800}-\u{16A38} - \u{16A40}-\u{16A5E} - \u{16A60}-\u{16A69} - \u{16A6E}-\u{16ABE} - \u{16AC0}-\u{16AC9} - \u{16AD0}-\u{16AED} - \u{16AF0}-\u{16AF5} - \u{16B00}-\u{16B45} - \u{16B50}-\u{16B59} - \u{16B5B}-\u{16B61} - \u{16B63}-\u{16B77} - \u{16B7D}-\u{16B8F} - \u{16E40}-\u{16E9A} - \u{16F00}-\u{16F4A} - \u{16F4F}-\u{16F87} - \u{16F8F}-\u{16F9F} - \u{1BC00}-\u{1BC6A} - \u{1BC70}-\u{1BC7C} - \u{1BC80}-\u{1BC88} - \u{1BC90}-\u{1BC99} - \u{1BC9C}-\u{1BCA3} - \u{1CF00}-\u{1CF2D} - \u{1CF30}-\u{1CF46} - \u{1CF50}-\u{1CFC3} - \u{1D000}-\u{1D0F5} - \u{1D100}-\u{1D126} - \u{1D129}-\u{1D1EA} - \u{1D200}-\u{1D245} - \u{1D2C0}-\u{1D2D3} - \u{1D2E0}-\u{1D2F3} - \u{1D300}-\u{1D356} - \u{1D360}-\u{1D378} - \u{1D400}-\u{1D454} - \u{1D456}-\u{1D49C} - \u{1D49E}-\u{1D49F} - \u{1D4A2} - \u{1D4A5}-\u{1D4A6} - \u{1D4A9}-\u{1D4AC} - \u{1D4AE}-\u{1D4B9} - \u{1D4BB} - \u{1D4BD}-\u{1D4C3} - \u{1D4C5}-\u{1D505} - \u{1D507}-\u{1D50A} - \u{1D50D}-\u{1D514} - \u{1D516}-\u{1D51C} - \u{1D51E}-\u{1D539} - \u{1D53B}-\u{1D53E} - \u{1D540}-\u{1D544} - \u{1D546} - \u{1D54A}-\u{1D550} - \u{1D552}-\u{1D6A5} - \u{1D6A8}-\u{1D7CB} - \u{1D7CE}-\u{1DA8B} - \u{1DA9B}-\u{1DA9F} - \u{1DAA1}-\u{1DAAF} - \u{1DF00}-\u{1DF1E} - \u{1DF25}-\u{1DF2A} - \u{1E000}-\u{1E006} - \u{1E008}-\u{1E018} - \u{1E01B}-\u{1E021} - \u{1E023}-\u{1E024} - \u{1E026}-\u{1E02A} - \u{1E030}-\u{1E06D} - \u{1E08F} - \u{1E100}-\u{1E12C} - \u{1E130}-\u{1E13D} - \u{1E140}-\u{1E149} - \u{1E14E}-\u{1E14F} - \u{1E290}-\u{1E2AE} - \u{1E2C0}-\u{1E2F9} - \u{1E2FF} - \u{1E4D0}-\u{1E4F9} - \u{1E7E0}-\u{1E7E6} - \u{1E7E8}-\u{1E7EB} - \u{1E7ED}-\u{1E7EE} - \u{1E7F0}-\u{1E7FE} - \u{1E800}-\u{1E8C4} - \u{1E8C7}-\u{1E8D6} - \u{1E900}-\u{1E94B} - \u{1E950}-\u{1E959} - \u{1E95E}-\u{1E95F} - \u{1EC71}-\u{1ECB4} - \u{1ED01}-\u{1ED3D} - \u{1EE00}-\u{1EE03} - \u{1EE05}-\u{1EE1F} - \u{1EE21}-\u{1EE22} - \u{1EE24} - \u{1EE27} - \u{1EE29}-\u{1EE32} - \u{1EE34}-\u{1EE37} - \u{1EE39} - \u{1EE3B} - \u{1EE42} - \u{1EE47} - \u{1EE49} - \u{1EE4B} - \u{1EE4D}-\u{1EE4F} - \u{1EE51}-\u{1EE52} - \u{1EE54} - \u{1EE57} - \u{1EE59} - \u{1EE5B} - \u{1EE5D} - \u{1EE5F} - \u{1EE61}-\u{1EE62} - \u{1EE64} - \u{1EE67}-\u{1EE6A} - \u{1EE6C}-\u{1EE72} - \u{1EE74}-\u{1EE77} - \u{1EE79}-\u{1EE7C} - \u{1EE7E} - \u{1EE80}-\u{1EE89} - \u{1EE8B}-\u{1EE9B} - \u{1EEA1}-\u{1EEA3} - \u{1EEA5}-\u{1EEA9} - \u{1EEAB}-\u{1EEBB} - \u{1EEF0}-\u{1EEF1} - \u{1F000}-\u{1F003} - \u{1F005}-\u{1F02B} - \u{1F030}-\u{1F093} - \u{1F0A0}-\u{1F0AE} - \u{1F0B1}-\u{1F0BF} - \u{1F0C1}-\u{1F0CE} - \u{1F0D1}-\u{1F0F5} - \u{1F10B}-\u{1F10F} - \u{1F12E}-\u{1F12F} - \u{1F16A}-\u{1F16F} - \u{1F1AD} - \u{1F1E6}-\u{1F1FF} - \u{1F321}-\u{1F32C} - \u{1F336} - \u{1F37D} - \u{1F394}-\u{1F39F} - \u{1F3CB}-\u{1F3CE} - \u{1F3D4}-\u{1F3DF} - \u{1F3F1}-\u{1F3F3} - \u{1F3F5}-\u{1F3F7} - \u{1F43F} - \u{1F441} - \u{1F4FD}-\u{1F4FE} - \u{1F53E}-\u{1F54A} - \u{1F54F} - \u{1F568}-\u{1F579} - \u{1F57B}-\u{1F594} - \u{1F597}-\u{1F5A3} - \u{1F5A5}-\u{1F5FA} - \u{1F650}-\u{1F67F} - \u{1F6C6}-\u{1F6CB} - \u{1F6CD}-\u{1F6CF} - \u{1F6D3}-\u{1F6D4} - \u{1F6E0}-\u{1F6EA} - \u{1F6F0}-\u{1F6F3} - \u{1F700}-\u{1F776} - \u{1F77B}-\u{1F7D9} - \u{1F800}-\u{1F80B} - \u{1F810}-\u{1F847} - \u{1F850}-\u{1F859} - \u{1F860}-\u{1F887} - \u{1F890}-\u{1F8AD} - \u{1F8B0}-\u{1F8B1} - \u{1F900}-\u{1F90B} - \u{1F93B} - \u{1F946} - \u{1FA00}-\u{1FA53} - \u{1FA60}-\u{1FA6D} - \u{1FB00}-\u{1FB92} - \u{1FB94}-\u{1FBCA} - \u{1FBF0}-\u{1FBF9} - \u{E0001} - \u{E0020}-\u{E007F} - ).join }]/ -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/version.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/version.rb deleted file mode 100644 index c8bbf61..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/version.rb +++ /dev/null @@ -1,3 +0,0 @@ -module Reline - VERSION = '0.3.7' -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/windows.rb b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/windows.rb deleted file mode 100644 index 7ea2a00..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/lib/reline/windows.rb +++ /dev/null @@ -1,501 +0,0 @@ -require 'fiddle/import' - -class Reline::Windows - def self.encoding - Encoding::UTF_8 - end - - def self.win? - true - end - - def self.win_legacy_console? - @@legacy_console - end - - def self.set_default_key_bindings(config) - { - [224, 72] => :ed_prev_history, # ↑ - [224, 80] => :ed_next_history, # ↓ - [224, 77] => :ed_next_char, # → - [224, 75] => :ed_prev_char, # ← - [224, 83] => :key_delete, # Del - [224, 71] => :ed_move_to_beg, # Home - [224, 79] => :ed_move_to_end, # End - [ 0, 41] => :ed_unassigned, # input method on/off - [ 0, 72] => :ed_prev_history, # ↑ - [ 0, 80] => :ed_next_history, # ↓ - [ 0, 77] => :ed_next_char, # → - [ 0, 75] => :ed_prev_char, # ← - [ 0, 83] => :key_delete, # Del - [ 0, 71] => :ed_move_to_beg, # Home - [ 0, 79] => :ed_move_to_end # End - }.each_pair do |key, func| - config.add_default_key_binding_by_keymap(:emacs, key, func) - config.add_default_key_binding_by_keymap(:vi_insert, key, func) - config.add_default_key_binding_by_keymap(:vi_command, key, func) - end - - { - [27, 32] => :em_set_mark, # M- - [24, 24] => :em_exchange_mark, # C-x C-x - }.each_pair do |key, func| - config.add_default_key_binding_by_keymap(:emacs, key, func) - end - - # Emulate ANSI key sequence. - { - [27, 91, 90] => :completion_journey_up, # S-Tab - }.each_pair do |key, func| - config.add_default_key_binding_by_keymap(:emacs, key, func) - config.add_default_key_binding_by_keymap(:vi_insert, key, func) - end - end - - if defined? JRUBY_VERSION - require 'win32api' - else - class Win32API - DLL = {} - TYPEMAP = {"0" => Fiddle::TYPE_VOID, "S" => Fiddle::TYPE_VOIDP, "I" => Fiddle::TYPE_LONG} - POINTER_TYPE = Fiddle::SIZEOF_VOIDP == Fiddle::SIZEOF_LONG_LONG ? 'q*' : 'l!*' - - WIN32_TYPES = "VPpNnLlIi" - DL_TYPES = "0SSI" - - def initialize(dllname, func, import, export = "0", calltype = :stdcall) - @proto = [import].join.tr(WIN32_TYPES, DL_TYPES).sub(/^(.)0*$/, '\1') - import = @proto.chars.map {|win_type| TYPEMAP[win_type.tr(WIN32_TYPES, DL_TYPES)]} - export = TYPEMAP[export.tr(WIN32_TYPES, DL_TYPES)] - calltype = Fiddle::Importer.const_get(:CALL_TYPE_TO_ABI)[calltype] - - handle = DLL[dllname] ||= - begin - Fiddle.dlopen(dllname) - rescue Fiddle::DLError - raise unless File.extname(dllname).empty? - Fiddle.dlopen(dllname + ".dll") - end - - @func = Fiddle::Function.new(handle[func], import, export, calltype) - rescue Fiddle::DLError => e - raise LoadError, e.message, e.backtrace - end - - def call(*args) - import = @proto.split("") - args.each_with_index do |x, i| - args[i], = [x == 0 ? nil : x].pack("p").unpack(POINTER_TYPE) if import[i] == "S" - args[i], = [x].pack("I").unpack("i") if import[i] == "I" - end - ret, = @func.call(*args) - return ret || 0 - end - end - end - - VK_RETURN = 0x0D - VK_MENU = 0x12 # ALT key - VK_LMENU = 0xA4 - VK_CONTROL = 0x11 - VK_SHIFT = 0x10 - VK_DIVIDE = 0x6F - - KEY_EVENT = 0x01 - WINDOW_BUFFER_SIZE_EVENT = 0x04 - - CAPSLOCK_ON = 0x0080 - ENHANCED_KEY = 0x0100 - LEFT_ALT_PRESSED = 0x0002 - LEFT_CTRL_PRESSED = 0x0008 - NUMLOCK_ON = 0x0020 - RIGHT_ALT_PRESSED = 0x0001 - RIGHT_CTRL_PRESSED = 0x0004 - SCROLLLOCK_ON = 0x0040 - SHIFT_PRESSED = 0x0010 - - VK_TAB = 0x09 - VK_END = 0x23 - VK_HOME = 0x24 - VK_LEFT = 0x25 - VK_UP = 0x26 - VK_RIGHT = 0x27 - VK_DOWN = 0x28 - VK_DELETE = 0x2E - - STD_INPUT_HANDLE = -10 - STD_OUTPUT_HANDLE = -11 - FILE_TYPE_PIPE = 0x0003 - FILE_NAME_INFO = 2 - @@getwch = Win32API.new('msvcrt', '_getwch', [], 'I') - @@kbhit = Win32API.new('msvcrt', '_kbhit', [], 'I') - @@GetKeyState = Win32API.new('user32', 'GetKeyState', ['L'], 'L') - @@GetConsoleScreenBufferInfo = Win32API.new('kernel32', 'GetConsoleScreenBufferInfo', ['L', 'P'], 'L') - @@SetConsoleCursorPosition = Win32API.new('kernel32', 'SetConsoleCursorPosition', ['L', 'L'], 'L') - @@GetStdHandle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L') - @@FillConsoleOutputCharacter = Win32API.new('kernel32', 'FillConsoleOutputCharacter', ['L', 'L', 'L', 'L', 'P'], 'L') - @@ScrollConsoleScreenBuffer = Win32API.new('kernel32', 'ScrollConsoleScreenBuffer', ['L', 'P', 'P', 'L', 'P'], 'L') - @@hConsoleHandle = @@GetStdHandle.call(STD_OUTPUT_HANDLE) - @@hConsoleInputHandle = @@GetStdHandle.call(STD_INPUT_HANDLE) - @@GetNumberOfConsoleInputEvents = Win32API.new('kernel32', 'GetNumberOfConsoleInputEvents', ['L', 'P'], 'L') - @@ReadConsoleInputW = Win32API.new('kernel32', 'ReadConsoleInputW', ['L', 'P', 'L', 'P'], 'L') - @@GetFileType = Win32API.new('kernel32', 'GetFileType', ['L'], 'L') - @@GetFileInformationByHandleEx = Win32API.new('kernel32', 'GetFileInformationByHandleEx', ['L', 'I', 'P', 'L'], 'I') - @@FillConsoleOutputAttribute = Win32API.new('kernel32', 'FillConsoleOutputAttribute', ['L', 'L', 'L', 'L', 'P'], 'L') - @@SetConsoleCursorInfo = Win32API.new('kernel32', 'SetConsoleCursorInfo', ['L', 'P'], 'L') - - @@GetConsoleMode = Win32API.new('kernel32', 'GetConsoleMode', ['L', 'P'], 'L') - @@SetConsoleMode = Win32API.new('kernel32', 'SetConsoleMode', ['L', 'L'], 'L') - @@WaitForSingleObject = Win32API.new('kernel32', 'WaitForSingleObject', ['L', 'L'], 'L') - ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 - - private_class_method def self.getconsolemode - mode = "\000\000\000\000" - @@GetConsoleMode.call(@@hConsoleHandle, mode) - mode.unpack1('L') - end - - private_class_method def self.setconsolemode(mode) - @@SetConsoleMode.call(@@hConsoleHandle, mode) - end - - @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0) - #if @@legacy_console - # setconsolemode(getconsolemode() | ENABLE_VIRTUAL_TERMINAL_PROCESSING) - # @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0) - #end - - @@input_buf = [] - @@output_buf = [] - - @@output = STDOUT - - def self.msys_tty?(io = @@hConsoleInputHandle) - # check if fd is a pipe - if @@GetFileType.call(io) != FILE_TYPE_PIPE - return false - end - - bufsize = 1024 - p_buffer = "\0" * bufsize - res = @@GetFileInformationByHandleEx.call(io, FILE_NAME_INFO, p_buffer, bufsize - 2) - return false if res == 0 - - # get pipe name: p_buffer layout is: - # struct _FILE_NAME_INFO { - # DWORD FileNameLength; - # WCHAR FileName[1]; - # } FILE_NAME_INFO - len = p_buffer[0, 4].unpack1("L") - name = p_buffer[4, len].encode(Encoding::UTF_8, Encoding::UTF_16LE, invalid: :replace) - - # Check if this could be a MSYS2 pty pipe ('\msys-XXXX-ptyN-XX') - # or a cygwin pty pipe ('\cygwin-XXXX-ptyN-XX') - name =~ /(msys-|cygwin-).*-pty/ ? true : false - end - - KEY_MAP = [ - # It's treated as Meta+Enter on Windows. - [ { control_keys: :CTRL, virtual_key_code: 0x0D }, "\e\r".bytes ], - [ { control_keys: :SHIFT, virtual_key_code: 0x0D }, "\e\r".bytes ], - - # It's treated as Meta+Space on Windows. - [ { control_keys: :CTRL, char_code: 0x20 }, "\e ".bytes ], - - # Emulate getwch() key sequences. - [ { control_keys: [], virtual_key_code: VK_UP }, [0, 72] ], - [ { control_keys: [], virtual_key_code: VK_DOWN }, [0, 80] ], - [ { control_keys: [], virtual_key_code: VK_RIGHT }, [0, 77] ], - [ { control_keys: [], virtual_key_code: VK_LEFT }, [0, 75] ], - [ { control_keys: [], virtual_key_code: VK_DELETE }, [0, 83] ], - [ { control_keys: [], virtual_key_code: VK_HOME }, [0, 71] ], - [ { control_keys: [], virtual_key_code: VK_END }, [0, 79] ], - - # Emulate ANSI key sequence. - [ { control_keys: :SHIFT, virtual_key_code: VK_TAB }, [27, 91, 90] ], - ] - - @@hsg = nil - - def self.process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state) - - # high-surrogate - if 0xD800 <= char_code and char_code <= 0xDBFF - @@hsg = char_code - return - end - # low-surrogate - if 0xDC00 <= char_code and char_code <= 0xDFFF - if @@hsg - char_code = 0x10000 + (@@hsg - 0xD800) * 0x400 + char_code - 0xDC00 - @@hsg = nil - else - # no high-surrogate. ignored. - return - end - else - # ignore high-surrogate without low-surrogate if there - @@hsg = nil - end - - key = KeyEventRecord.new(virtual_key_code, char_code, control_key_state) - - match = KEY_MAP.find { |args,| key.matches?(**args) } - unless match.nil? - @@output_buf.concat(match.last) - return - end - - # no char, only control keys - return if key.char_code == 0 and key.control_keys.any? - - @@output_buf.push("\e".ord) if key.control_keys.include?(:ALT) and !key.control_keys.include?(:CTRL) - - @@output_buf.concat(key.char.bytes) - end - - def self.check_input_event - num_of_events = 0.chr * 8 - while @@output_buf.empty? - Reline.core.line_editor.resize - if @@WaitForSingleObject.(@@hConsoleInputHandle, 100) != 0 # max 0.1 sec - # prevent for background consolemode change - @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0) - next - end - next if @@GetNumberOfConsoleInputEvents.(@@hConsoleInputHandle, num_of_events) == 0 or num_of_events.unpack1('L') == 0 - input_records = 0.chr * 20 * 80 - read_event = 0.chr * 4 - if @@ReadConsoleInputW.(@@hConsoleInputHandle, input_records, 80, read_event) != 0 - read_events = read_event.unpack1('L') - 0.upto(read_events) do |idx| - input_record = input_records[idx * 20, 20] - event = input_record[0, 2].unpack1('s*') - case event - when WINDOW_BUFFER_SIZE_EVENT - @@winch_handler.() - when KEY_EVENT - key_down = input_record[4, 4].unpack1('l*') - repeat_count = input_record[8, 2].unpack1('s*') - virtual_key_code = input_record[10, 2].unpack1('s*') - virtual_scan_code = input_record[12, 2].unpack1('s*') - char_code = input_record[14, 2].unpack1('S*') - control_key_state = input_record[16, 2].unpack1('S*') - is_key_down = key_down.zero? ? false : true - if is_key_down - process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state) - end - end - end - end - end - end - - def self.with_raw_input - yield - end - - def self.getc - check_input_event - @@output_buf.shift - end - - def self.ungetc(c) - @@output_buf.unshift(c) - end - - def self.in_pasting? - not self.empty_buffer? - end - - def self.empty_buffer? - if not @@output_buf.empty? - false - elsif @@kbhit.call == 0 - true - else - false - end - end - - def self.get_console_screen_buffer_info - # CONSOLE_SCREEN_BUFFER_INFO - # [ 0,2] dwSize.X - # [ 2,2] dwSize.Y - # [ 4,2] dwCursorPositions.X - # [ 6,2] dwCursorPositions.Y - # [ 8,2] wAttributes - # [10,2] srWindow.Left - # [12,2] srWindow.Top - # [14,2] srWindow.Right - # [16,2] srWindow.Bottom - # [18,2] dwMaximumWindowSize.X - # [20,2] dwMaximumWindowSize.Y - csbi = 0.chr * 22 - return if @@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi) == 0 - csbi - end - - def self.get_screen_size - unless csbi = get_console_screen_buffer_info - return [1, 1] - end - csbi[0, 4].unpack('SS').reverse - end - - def self.cursor_pos - unless csbi = get_console_screen_buffer_info - return Reline::CursorPos.new(0, 0) - end - x = csbi[4, 2].unpack1('s') - y = csbi[6, 2].unpack1('s') - Reline::CursorPos.new(x, y) - end - - def self.move_cursor_column(val) - @@SetConsoleCursorPosition.call(@@hConsoleHandle, cursor_pos.y * 65536 + val) - end - - def self.move_cursor_up(val) - if val > 0 - y = cursor_pos.y - val - y = 0 if y < 0 - @@SetConsoleCursorPosition.call(@@hConsoleHandle, y * 65536 + cursor_pos.x) - elsif val < 0 - move_cursor_down(-val) - end - end - - def self.move_cursor_down(val) - if val > 0 - return unless csbi = get_console_screen_buffer_info - screen_height = get_screen_size.first - y = cursor_pos.y + val - y = screen_height - 1 if y > (screen_height - 1) - @@SetConsoleCursorPosition.call(@@hConsoleHandle, (cursor_pos.y + val) * 65536 + cursor_pos.x) - elsif val < 0 - move_cursor_up(-val) - end - end - - def self.erase_after_cursor - return unless csbi = get_console_screen_buffer_info - attributes = csbi[8, 2].unpack1('S') - cursor = csbi[4, 4].unpack1('L') - written = 0.chr * 4 - @@FillConsoleOutputCharacter.call(@@hConsoleHandle, 0x20, get_screen_size.last - cursor_pos.x, cursor, written) - @@FillConsoleOutputAttribute.call(@@hConsoleHandle, attributes, get_screen_size.last - cursor_pos.x, cursor, written) - end - - def self.scroll_down(val) - return if val < 0 - return unless csbi = get_console_screen_buffer_info - buffer_width, buffer_lines, x, y, attributes, window_left, window_top, window_bottom = csbi.unpack('ssssSssx2s') - screen_height = window_bottom - window_top + 1 - val = screen_height if val > screen_height - - if @@legacy_console || window_left != 0 - # unless ENABLE_VIRTUAL_TERMINAL, - # if srWindow.Left != 0 then it's conhost.exe hosted console - # and puts "\n" causes horizontal scroll. its glitch. - # FYI irb write from culumn 1, so this gives no gain. - scroll_rectangle = [0, val, buffer_width, buffer_lines - val].pack('s4') - destination_origin = 0 # y * 65536 + x - fill = [' '.ord, attributes].pack('SS') - @@ScrollConsoleScreenBuffer.call(@@hConsoleHandle, scroll_rectangle, nil, destination_origin, fill) - else - origin_x = x + 1 - origin_y = y - window_top + 1 - @@output.write [ - (origin_y != screen_height) ? "\e[#{screen_height};H" : nil, - "\n" * val, - (origin_y != screen_height or !x.zero?) ? "\e[#{origin_y};#{origin_x}H" : nil - ].join - end - end - - def self.clear_screen - if @@legacy_console - return unless csbi = get_console_screen_buffer_info - buffer_width, _buffer_lines, attributes, window_top, window_bottom = csbi.unpack('ss@8S@12sx2s') - fill_length = buffer_width * (window_bottom - window_top + 1) - screen_topleft = window_top * 65536 - written = 0.chr * 4 - @@FillConsoleOutputCharacter.call(@@hConsoleHandle, 0x20, fill_length, screen_topleft, written) - @@FillConsoleOutputAttribute.call(@@hConsoleHandle, attributes, fill_length, screen_topleft, written) - @@SetConsoleCursorPosition.call(@@hConsoleHandle, screen_topleft) - else - @@output.write "\e[2J" "\e[H" - end - end - - def self.set_screen_size(rows, columns) - raise NotImplementedError - end - - def self.hide_cursor - size = 100 - visible = 0 # 0 means false - cursor_info = [size, visible].pack('Li') - @@SetConsoleCursorInfo.call(@@hConsoleHandle, cursor_info) - end - - def self.show_cursor - size = 100 - visible = 1 # 1 means true - cursor_info = [size, visible].pack('Li') - @@SetConsoleCursorInfo.call(@@hConsoleHandle, cursor_info) - end - - def self.set_winch_handler(&handler) - @@winch_handler = handler - end - - def self.prep - # do nothing - nil - end - - def self.deprep(otio) - # do nothing - end - - class KeyEventRecord - - attr_reader :virtual_key_code, :char_code, :control_key_state, :control_keys - - def initialize(virtual_key_code, char_code, control_key_state) - @virtual_key_code = virtual_key_code - @char_code = char_code - @control_key_state = control_key_state - @enhanced = control_key_state & ENHANCED_KEY != 0 - - (@control_keys = []).tap do |control_keys| - # symbols must be sorted to make comparison is easier later on - control_keys << :ALT if control_key_state & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED) != 0 - control_keys << :CTRL if control_key_state & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) != 0 - control_keys << :SHIFT if control_key_state & SHIFT_PRESSED != 0 - end.freeze - end - - def char - @char_code.chr(Encoding::UTF_8) - end - - def enhanced? - @enhanced - end - - # Verifies if the arguments match with this key event. - # Nil arguments are ignored, but at least one must be passed as non-nil. - # To verify that no control keys were pressed, pass an empty array: `control_keys: []`. - def matches?(control_keys: nil, virtual_key_code: nil, char_code: nil) - raise ArgumentError, 'No argument was passed to match key event' if control_keys.nil? && virtual_key_code.nil? && char_code.nil? - - (control_keys.nil? || [*control_keys].sort == @control_keys) && - (virtual_key_code.nil? || @virtual_key_code == virtual_key_code) && - (char_code.nil? || char_code == @char_code) - end - - end -end diff --git a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/license_of_rb-readline b/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/license_of_rb-readline deleted file mode 100644 index fe5606c..0000000 --- a/vendor/bundle/ruby/3.0.0/gems/reline-0.3.7/license_of_rb-readline +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2009, Park Heesob -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. -* Neither the name of Park Heesob nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/bundle/ruby/3.0.0/specifications/reline-0.3.7.gemspec b/vendor/bundle/ruby/3.0.0/specifications/reline-0.3.7.gemspec deleted file mode 100644 index 73f4aad..0000000 --- a/vendor/bundle/ruby/3.0.0/specifications/reline-0.3.7.gemspec +++ /dev/null @@ -1,31 +0,0 @@ -# -*- encoding: utf-8 -*- -# stub: reline 0.3.7 ruby lib - -Gem::Specification.new do |s| - s.name = "reline".freeze - s.version = "0.3.7" - - s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= - s.require_paths = ["lib".freeze] - s.authors = ["aycabta".freeze] - s.date = "2023-07-27" - s.description = "Alternative GNU Readline or Editline implementation by pure Ruby.".freeze - s.email = ["aycabta@gmail.com".freeze] - s.homepage = "https://github.com/ruby/reline".freeze - s.licenses = ["Ruby".freeze] - s.required_ruby_version = Gem::Requirement.new(">= 2.6".freeze) - s.rubygems_version = "3.2.33".freeze - s.summary = "Alternative GNU Readline or Editline implementation by pure Ruby.".freeze - - s.installed_by_version = "3.2.33" if s.respond_to? :installed_by_version - - if s.respond_to? :specification_version then - s.specification_version = 4 - end - - if s.respond_to? :add_runtime_dependency then - s.add_runtime_dependency(%q.freeze, ["~> 0.5"]) - else - s.add_dependency(%q.freeze, ["~> 0.5"]) - end -end