summaryrefslogtreecommitdiff
path: root/lib/reline
diff options
context:
space:
mode:
authortomoya ishida <[email protected]>2024-12-16 22:53:30 +0900
committergit <[email protected]>2024-12-16 13:53:34 +0000
commit4428c51f01638c1ce6ba8a9eb8ffea00a4c78318 (patch)
tree80b517cb30d6b578c6e9a6d3042f71814f0ad340 /lib/reline
parent3c9f3c3e9b135653be9b790207c3b04a244e3db9 (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/reline')
-rw-r--r--lib/reline/io.rb14
-rw-r--r--lib/reline/key_actor/vi_insert.rb20
-rw-r--r--lib/reline/line_editor.rb29
3 files changed, 35 insertions, 28 deletions
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)