diff options
author | tomoya ishida <[email protected]> | 2024-12-16 22:53:30 +0900 |
---|---|---|
committer | git <[email protected]> | 2024-12-16 13:53:34 +0000 |
commit | 4428c51f01638c1ce6ba8a9eb8ffea00a4c78318 (patch) | |
tree | 80b517cb30d6b578c6e9a6d3042f71814f0ad340 /lib | |
parent | 3c9f3c3e9b135653be9b790207c3b04a244e3db9 (diff) |
[ruby/reline] Change quoted_insert and bracketed_paste to a single
key input
(https://github.com/ruby/reline/pull/792)
https://github.com/ruby/reline/commit/8f331edb07
Diffstat (limited to 'lib')
-rw-r--r-- | lib/reline.rb | 13 | ||||
-rw-r--r-- | lib/reline/io.rb | 14 | ||||
-rw-r--r-- | lib/reline/key_actor/vi_insert.rb | 20 | ||||
-rw-r--r-- | lib/reline/line_editor.rb | 29 |
4 files changed, 42 insertions, 34 deletions
diff --git a/lib/reline.rb b/lib/reline.rb index 671c222ef7..52e1e399c3 100644 --- a/lib/reline.rb +++ b/lib/reline.rb @@ -343,13 +343,14 @@ module Reline read_io(config.keyseq_timeout) { |inputs| line_editor.set_pasting_state(io_gate.in_pasting?) inputs.each do |key| - if key.method_symbol == :bracketed_paste_start - text = io_gate.read_bracketed_paste - line_editor.insert_multiline_text(text) - line_editor.scroll_into_view - else - line_editor.update(key) + case key.method_symbol + when :bracketed_paste_start + # io_gate is Reline::ANSI because the key :bracketed_paste_start is only assigned in Reline::ANSI + key = Reline::Key.new(io_gate.read_bracketed_paste, :insert_multiline_text) + when :quoted_insert, :ed_quoted_insert + key = Reline::Key.new(io_gate.read_single_char(config.keyseq_timeout), :insert_raw_char) end + line_editor.update(key) end } if line_editor.finished? diff --git a/lib/reline/io.rb b/lib/reline/io.rb index c1dd1a56c8..0f48f53b82 100644 --- a/lib/reline/io.rb +++ b/lib/reline/io.rb @@ -35,6 +35,20 @@ module Reline def reset_color_sequence self.class::RESET_COLOR end + + # Read a single encoding valid character from the input. + def read_single_char(keyseq_timeout) + buffer = String.new(encoding: Encoding::ASCII_8BIT) + loop do + timeout = buffer.empty? ? Float::INFINITY : keyseq_timeout + c = getc(timeout) + return unless c + + buffer << c + encoded = buffer.dup.force_encoding(encoding) + return encoded if encoded.valid_encoding? + end + end end end diff --git a/lib/reline/key_actor/vi_insert.rb b/lib/reline/key_actor/vi_insert.rb index 9a0ff57253..235b6fdf38 100644 --- a/lib/reline/key_actor/vi_insert.rb +++ b/lib/reline/key_actor/vi_insert.rb @@ -97,25 +97,25 @@ module Reline::KeyActor # 47 / :ed_insert, # 48 0 - :ed_insert, + :ed_digit, # 49 1 - :ed_insert, + :ed_digit, # 50 2 - :ed_insert, + :ed_digit, # 51 3 - :ed_insert, + :ed_digit, # 52 4 - :ed_insert, + :ed_digit, # 53 5 - :ed_insert, + :ed_digit, # 54 6 - :ed_insert, + :ed_digit, # 55 7 - :ed_insert, + :ed_digit, # 56 8 - :ed_insert, + :ed_digit, # 57 9 - :ed_insert, + :ed_digit, # 58 : :ed_insert, # 59 ; diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index 1b61d9abe7..69ce7f574c 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -973,6 +973,7 @@ class Reline::LineEditor @drop_terminate_spaces = false end + ARGUMENT_DIGIT_METHODS = %i[ed_digit vi_zero ed_argument_digit] VI_WAITING_ACCEPT_METHODS = %i[vi_change_meta vi_delete_meta vi_yank ed_insert ed_argument_digit] private def process_key(key, method_symbol) @@ -1004,7 +1005,7 @@ class Reline::LineEditor method_obj = method(method_symbol) end if @vi_arg - if key.match?(/\A\d\z/) + if ARGUMENT_DIGIT_METHODS.include?(method_symbol) ed_argument_digit(key) else if argumentable?(method_obj) @@ -1015,9 +1016,7 @@ class Reline::LineEditor wrap_method_call(method_symbol, method_obj, key) end @kill_ring.process - if @vi_arg - @vi_arg = nil - end + @vi_arg = nil end elsif method_obj if method_symbol == :ed_argument_digit @@ -1227,7 +1226,6 @@ class Reline::LineEditor end def insert_multiline_text(text) - save_old_buffer pre = @buffer_of_lines[@line_index].byteslice(0, @byte_pointer) post = @buffer_of_lines[@line_index].byteslice(@byte_pointer..) lines = (pre + Reline::Unicode.safe_encode(text, encoding).gsub(/\r\n?/, "\n") + post).split("\n", -1) @@ -1235,7 +1233,6 @@ class Reline::LineEditor @buffer_of_lines[@line_index, 1] = lines @line_index += lines.size - 1 @byte_pointer = @buffer_of_lines[@line_index].bytesize - post.bytesize - push_input_lines end def insert_text(text) @@ -1419,20 +1416,16 @@ class Reline::LineEditor 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" or key == "\C-m" - key_newline(key) - elsif key != "\0" - # Ignore NUL. - ed_insert(key) - end + private def insert_raw_char(str, arg: 1) + arg.times do + if str == "\C-j" or str == "\C-m" + key_newline(str) + elsif str != "\0" + # Ignore NUL. + ed_insert(str) end - @waiting_proc = nil - } + end end - alias_method :quoted_insert, :ed_quoted_insert private def ed_next_char(key, arg: 1) byte_size = Reline::Unicode.get_next_mbchar_size(current_line, @byte_pointer) |