ruby-changes:67623
From: aycabta <ko1@a...>
Date: Mon, 6 Sep 2021 05:24:27 +0900 (JST)
Subject: [ruby-changes:67623] 348bb62331 (master): [ruby/reline] Cut out read_2nd_character_of_key_sequence
https://git.ruby-lang.org/ruby.git/commit/?id=348bb62331 From 348bb623314c7ed87cfd7ed22f321f89e1093a8d Mon Sep 17 00:00:00 2001 From: aycabta <aycabta@g...> Date: Mon, 6 Sep 2021 04:48:10 +0900 Subject: [ruby/reline] Cut out read_2nd_character_of_key_sequence https://github.com/ruby/reline/commit/92518d1dee --- lib/reline.rb | 62 +++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/lib/reline.rb b/lib/reline.rb index 82337c1..57a21b6 100644 --- a/lib/reline.rb +++ b/lib/reline.rb @@ -381,33 +381,9 @@ module Reline https://github.com/ruby/ruby/blob/trunk/lib/reline.rb#L381 break when :matching if buffer.size == 1 - begin - succ_c = nil - Timeout.timeout(keyseq_timeout / 1000.0) { - succ_c = Reline::IOGate.getc - } - rescue Timeout::Error # cancel matching only when first byte - block.([Reline::Key.new(c, c, false)]) - 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 - break - when :matching - Reline::IOGate.ungetc(succ_c) - when :matched - buffer << succ_c - expanded = key_stroke.expand(buffer).map{ |expanded_c| - Reline::Key.new(expanded_c, expanded_c, false) - } - block.(expanded) - break - end + case read_2nd_character_of_key_sequence(keyseq_timeout, buffer, c, block) + when :break then break + when :next then next end end when :unmatched @@ -424,6 +400,38 @@ module Reline https://github.com/ruby/ruby/blob/trunk/lib/reline.rb#L400 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 = Reline::IOGate.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 + Reline::IOGate.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 -- cgit v1.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/