reline 0.5.4 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/reline/ansi.rb +22 -31
- data/lib/reline/config.rb +7 -29
- data/lib/reline/key_actor/base.rb +0 -4
- data/lib/reline/key_actor/emacs.rb +1 -1
- data/lib/reline/key_actor/vi_insert.rb +3 -3
- data/lib/reline/line_editor.rb +51 -38
- data/lib/reline/unicode.rb +6 -4
- data/lib/reline/version.rb +1 -1
- data/lib/reline.rb +21 -12
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: a87d2a8f8718292be59386f13b873af0fa94cb20f6837761332174c413dc7755
         | 
| 4 | 
            +
              data.tar.gz: 342c0dfbcf1e99af3c31ac4370f576e6a447728b2942328db1fc2a8a5b458b9e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 0031f7bd3660b7adda54149c1e15da1d1d2f9ef5c7e240828c9a1f3337d0c7bf2e1796c5ba6f61f1352c18819225697e4dd7c32149ff3297f65ddf0fd8f06e82
         | 
| 7 | 
            +
              data.tar.gz: ea8bfe21ce43dbd3f1f6fa23d1d1a1948005cdda278485bba9010060f1ad1e3900c749e1a2966caf39f892c4c38692bc4abe8283425e3c3138e273f65b170ca9
         | 
    
        data/lib/reline/ansi.rb
    CHANGED
    
    | @@ -45,6 +45,7 @@ class Reline::ANSI | |
| 45 45 | 
             
              end
         | 
| 46 46 |  | 
| 47 47 | 
             
              def self.set_default_key_bindings(config, allow_terminfo: true)
         | 
| 48 | 
            +
                set_bracketed_paste_key_bindings(config)
         | 
| 48 49 | 
             
                set_default_key_bindings_ansi_cursor(config)
         | 
| 49 50 | 
             
                if allow_terminfo && Reline::Terminfo.enabled?
         | 
| 50 51 | 
             
                  set_default_key_bindings_terminfo(config)
         | 
| @@ -66,6 +67,12 @@ class Reline::ANSI | |
| 66 67 | 
             
                end
         | 
| 67 68 | 
             
              end
         | 
| 68 69 |  | 
| 70 | 
            +
              def self.set_bracketed_paste_key_bindings(config)
         | 
| 71 | 
            +
                [:emacs, :vi_insert, :vi_command].each do |keymap|
         | 
| 72 | 
            +
                  config.add_default_key_binding_by_keymap(keymap, START_BRACKETED_PASTE.bytes, :bracketed_paste_start)
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 69 76 | 
             
              def self.set_default_key_bindings_ansi_cursor(config)
         | 
| 70 77 | 
             
                ANSI_CURSOR_KEY_BINDINGS.each do |char, (default_func, modifiers)|
         | 
| 71 78 | 
             
                  bindings = [["\e[#{char}", default_func]] # CSI + char
         | 
| @@ -178,46 +185,26 @@ class Reline::ANSI | |
| 178 185 | 
             
                nil
         | 
| 179 186 | 
             
              end
         | 
| 180 187 |  | 
| 181 | 
            -
               | 
| 182 | 
            -
               | 
| 183 | 
            -
               | 
| 184 | 
            -
              def self.getc_with_bracketed_paste(timeout_second)
         | 
| 188 | 
            +
              START_BRACKETED_PASTE = String.new("\e[200~", encoding: Encoding::ASCII_8BIT)
         | 
| 189 | 
            +
              END_BRACKETED_PASTE = String.new("\e[201~", encoding: Encoding::ASCII_8BIT)
         | 
| 190 | 
            +
              def self.read_bracketed_paste
         | 
| 185 191 | 
             
                buffer = String.new(encoding: Encoding::ASCII_8BIT)
         | 
| 186 | 
            -
                buffer | 
| 187 | 
            -
             | 
| 188 | 
            -
                   | 
| 189 | 
            -
             | 
| 190 | 
            -
                    return inner_getc(timeout_second)
         | 
| 191 | 
            -
                  elsif END_BRACKETED_PASTE == buffer
         | 
| 192 | 
            -
                    @@in_bracketed_paste_mode = false
         | 
| 193 | 
            -
                    ungetc(-1)
         | 
| 194 | 
            -
                    return inner_getc(timeout_second)
         | 
| 195 | 
            -
                  end
         | 
| 196 | 
            -
                  succ_c = inner_getc(Reline.core.config.keyseq_timeout)
         | 
| 197 | 
            -
             | 
| 198 | 
            -
                  if succ_c
         | 
| 199 | 
            -
                    buffer << succ_c
         | 
| 200 | 
            -
                  else
         | 
| 201 | 
            -
                    break
         | 
| 202 | 
            -
                  end
         | 
| 192 | 
            +
                until buffer.end_with?(END_BRACKETED_PASTE)
         | 
| 193 | 
            +
                  c = inner_getc(Float::INFINITY)
         | 
| 194 | 
            +
                  break unless c
         | 
| 195 | 
            +
                  buffer << c
         | 
| 203 196 | 
             
                end
         | 
| 204 | 
            -
                buffer. | 
| 205 | 
            -
             | 
| 206 | 
            -
                end
         | 
| 207 | 
            -
                inner_getc(timeout_second)
         | 
| 197 | 
            +
                string = buffer.delete_suffix(END_BRACKETED_PASTE).force_encoding(encoding)
         | 
| 198 | 
            +
                string.valid_encoding? ? string : ''
         | 
| 208 199 | 
             
              end
         | 
| 209 200 |  | 
| 210 201 | 
             
              # if the usage expects to wait indefinitely, use Float::INFINITY for timeout_second
         | 
| 211 202 | 
             
              def self.getc(timeout_second)
         | 
| 212 | 
            -
                 | 
| 213 | 
            -
                  getc_with_bracketed_paste(timeout_second)
         | 
| 214 | 
            -
                else
         | 
| 215 | 
            -
                  inner_getc(timeout_second)
         | 
| 216 | 
            -
                end
         | 
| 203 | 
            +
                inner_getc(timeout_second)
         | 
| 217 204 | 
             
              end
         | 
| 218 205 |  | 
| 219 206 | 
             
              def self.in_pasting?
         | 
| 220 | 
            -
                 | 
| 207 | 
            +
                not empty_buffer?
         | 
| 221 208 | 
             
              end
         | 
| 222 209 |  | 
| 223 210 | 
             
              def self.empty_buffer?
         | 
| @@ -361,11 +348,15 @@ class Reline::ANSI | |
| 361 348 | 
             
              end
         | 
| 362 349 |  | 
| 363 350 | 
             
              def self.prep
         | 
| 351 | 
            +
                # Enable bracketed paste
         | 
| 352 | 
            +
                @@output.write "\e[?2004h" if Reline.core.config.enable_bracketed_paste
         | 
| 364 353 | 
             
                retrieve_keybuffer
         | 
| 365 354 | 
             
                nil
         | 
| 366 355 | 
             
              end
         | 
| 367 356 |  | 
| 368 357 | 
             
              def self.deprep(otio)
         | 
| 358 | 
            +
                # Disable bracketed paste
         | 
| 359 | 
            +
                @@output.write "\e[?2004l" if Reline.core.config.enable_bracketed_paste
         | 
| 369 360 | 
             
                Signal.trap('WINCH', @@old_winch_handler) if @@old_winch_handler
         | 
| 370 361 | 
             
              end
         | 
| 371 362 | 
             
            end
         | 
    
        data/lib/reline/config.rb
    CHANGED
    
    | @@ -8,31 +8,12 @@ class Reline::Config | |
| 8 8 | 
             
              end
         | 
| 9 9 |  | 
| 10 10 | 
             
              VARIABLE_NAMES = %w{
         | 
| 11 | 
            -
                bind-tty-special-chars
         | 
| 12 | 
            -
                blink-matching-paren
         | 
| 13 | 
            -
                byte-oriented
         | 
| 14 11 | 
             
                completion-ignore-case
         | 
| 15 12 | 
             
                convert-meta
         | 
| 16 13 | 
             
                disable-completion
         | 
| 17 | 
            -
                enable-keypad
         | 
| 18 | 
            -
                expand-tilde
         | 
| 19 | 
            -
                history-preserve-point
         | 
| 20 14 | 
             
                history-size
         | 
| 21 | 
            -
                horizontal-scroll-mode
         | 
| 22 | 
            -
                input-meta
         | 
| 23 15 | 
             
                keyseq-timeout
         | 
| 24 | 
            -
                mark-directories
         | 
| 25 | 
            -
                mark-modified-lines
         | 
| 26 | 
            -
                mark-symlinked-directories
         | 
| 27 | 
            -
                match-hidden-files
         | 
| 28 | 
            -
                meta-flag
         | 
| 29 | 
            -
                output-meta
         | 
| 30 | 
            -
                page-completions
         | 
| 31 | 
            -
                prefer-visible-bell
         | 
| 32 | 
            -
                print-completions-horizontally
         | 
| 33 16 | 
             
                show-all-if-ambiguous
         | 
| 34 | 
            -
                show-all-if-unmodified
         | 
| 35 | 
            -
                visible-stats
         | 
| 36 17 | 
             
                show-mode-in-prompt
         | 
| 37 18 | 
             
                vi-cmd-mode-string
         | 
| 38 19 | 
             
                vi-ins-mode-string
         | 
| @@ -69,17 +50,15 @@ class Reline::Config | |
| 69 50 | 
             
                @test_mode = false
         | 
| 70 51 | 
             
                @autocompletion = false
         | 
| 71 52 | 
             
                @convert_meta = true if seven_bit_encoding?(Reline::IOGate.encoding)
         | 
| 53 | 
            +
                @loaded = false
         | 
| 54 | 
            +
                @enable_bracketed_paste = true
         | 
| 72 55 | 
             
              end
         | 
| 73 56 |  | 
| 74 57 | 
             
              def reset
         | 
| 75 58 | 
             
                if editing_mode_is?(:vi_command)
         | 
| 76 59 | 
             
                  @editing_mode_label = :vi_insert
         | 
| 77 60 | 
             
                end
         | 
| 78 | 
            -
                @additional_key_bindings.keys.each do |key|
         | 
| 79 | 
            -
                  @additional_key_bindings[key].clear
         | 
| 80 | 
            -
                end
         | 
| 81 61 | 
             
                @oneshot_key_bindings.clear
         | 
| 82 | 
            -
                reset_default_key_bindings
         | 
| 83 62 | 
             
              end
         | 
| 84 63 |  | 
| 85 64 | 
             
              def editing_mode
         | 
| @@ -98,6 +77,10 @@ class Reline::Config | |
| 98 77 | 
             
                @key_actors[@keymap_label]
         | 
| 99 78 | 
             
              end
         | 
| 100 79 |  | 
| 80 | 
            +
              def loaded?
         | 
| 81 | 
            +
                @loaded
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
             | 
| 101 84 | 
             
              def inputrc_path
         | 
| 102 85 | 
             
                case ENV['INPUTRC']
         | 
| 103 86 | 
             
                when nil, ''
         | 
| @@ -129,6 +112,7 @@ class Reline::Config | |
| 129 112 | 
             
              end
         | 
| 130 113 |  | 
| 131 114 | 
             
              def read(file = nil)
         | 
| 115 | 
            +
                @loaded = true
         | 
| 132 116 | 
             
                file ||= default_inputrc_path
         | 
| 133 117 | 
             
                begin
         | 
| 134 118 | 
             
                  if file.respond_to?(:readlines)
         | 
| @@ -171,12 +155,6 @@ class Reline::Config | |
| 171 155 | 
             
                @key_actors[@keymap_label].default_key_bindings[keystroke] = target
         | 
| 172 156 | 
             
              end
         | 
| 173 157 |  | 
| 174 | 
            -
              def reset_default_key_bindings
         | 
| 175 | 
            -
                @key_actors.values.each do |ka|
         | 
| 176 | 
            -
                  ka.reset_default_key_bindings
         | 
| 177 | 
            -
                end
         | 
| 178 | 
            -
              end
         | 
| 179 | 
            -
             | 
| 180 158 | 
             
              def read_lines(lines, file = nil)
         | 
| 181 159 | 
             
                if not lines.empty? and lines.first.encoding != Reline.encoding_system_needs
         | 
| 182 160 | 
             
                  begin
         | 
| @@ -19,7 +19,7 @@ class Reline::KeyActor::ViInsert < Reline::KeyActor::Base | |
| 19 19 | 
             
                #   8 ^H
         | 
| 20 20 | 
             
                :vi_delete_prev_char,
         | 
| 21 21 | 
             
                #   9 ^I
         | 
| 22 | 
            -
                : | 
| 22 | 
            +
                :complete,
         | 
| 23 23 | 
             
                #  10 ^J
         | 
| 24 24 | 
             
                :ed_newline,
         | 
| 25 25 | 
             
                #  11 ^K
         | 
| @@ -29,11 +29,11 @@ class Reline::KeyActor::ViInsert < Reline::KeyActor::Base | |
| 29 29 | 
             
                #  13 ^M
         | 
| 30 30 | 
             
                :ed_newline,
         | 
| 31 31 | 
             
                #  14 ^N
         | 
| 32 | 
            -
                : | 
| 32 | 
            +
                :menu_complete,
         | 
| 33 33 | 
             
                #  15 ^O
         | 
| 34 34 | 
             
                :ed_insert,
         | 
| 35 35 | 
             
                #  16 ^P
         | 
| 36 | 
            -
                : | 
| 36 | 
            +
                :menu_complete_backward,
         | 
| 37 37 | 
             
                #  17 ^Q
         | 
| 38 38 | 
             
                :ed_ignore,
         | 
| 39 39 | 
             
                #  18 ^R
         | 
    
        data/lib/reline/line_editor.rb
    CHANGED
    
    | @@ -235,7 +235,6 @@ class Reline::LineEditor | |
| 235 235 | 
             
                @vi_waiting_operator_arg = nil
         | 
| 236 236 | 
             
                @completion_journey_state = nil
         | 
| 237 237 | 
             
                @completion_state = CompletionState::NORMAL
         | 
| 238 | 
            -
                @completion_occurs = false
         | 
| 239 238 | 
             
                @perfect_matched = nil
         | 
| 240 239 | 
             
                @menu_info = nil
         | 
| 241 240 | 
             
                @searching_prompt = nil
         | 
| @@ -284,7 +283,7 @@ class Reline::LineEditor | |
| 284 283 | 
             
                      indent1 = @auto_indent_proc.(@buffer_of_lines.take(@line_index - 1).push(''), @line_index - 1, 0, true)
         | 
| 285 284 | 
             
                      indent2 = @auto_indent_proc.(@buffer_of_lines.take(@line_index), @line_index - 1, @buffer_of_lines[@line_index - 1].bytesize, false)
         | 
| 286 285 | 
             
                      indent = indent2 || indent1
         | 
| 287 | 
            -
                      @buffer_of_lines[@line_index - 1] = ' ' * indent + @buffer_of_lines[@line_index - 1].gsub(/\A | 
| 286 | 
            +
                      @buffer_of_lines[@line_index - 1] = ' ' * indent + @buffer_of_lines[@line_index - 1].gsub(/\A\s*/, '')
         | 
| 288 287 | 
             
                    )
         | 
| 289 288 | 
             
                    process_auto_indent @line_index, add_newline: true
         | 
| 290 289 | 
             
                  else
         | 
| @@ -387,7 +386,7 @@ class Reline::LineEditor | |
| 387 386 | 
             
                      next cached
         | 
| 388 387 | 
             
                    end
         | 
| 389 388 | 
             
                    *wrapped_prompts, code_line_prompt = split_by_width(prompt, width).first.compact
         | 
| 390 | 
            -
                    wrapped_lines = split_by_width(line, width, offset: calculate_width(code_line_prompt)).first.compact
         | 
| 389 | 
            +
                    wrapped_lines = split_by_width(line, width, offset: calculate_width(code_line_prompt, true)).first.compact
         | 
| 391 390 | 
             
                    wrapped_prompts.map { |p| [p, ''] } + [[code_line_prompt, wrapped_lines.first]] + wrapped_lines.drop(1).map { |c| ['', c] }
         | 
| 392 391 | 
             
                  end
         | 
| 393 392 | 
             
                end
         | 
| @@ -856,7 +855,7 @@ class Reline::LineEditor | |
| 856 855 | 
             
                [target, preposing, completed, postposing]
         | 
| 857 856 | 
             
              end
         | 
| 858 857 |  | 
| 859 | 
            -
              private def  | 
| 858 | 
            +
              private def perform_completion(list, just_show_list)
         | 
| 860 859 | 
             
                case @completion_state
         | 
| 861 860 | 
             
                when CompletionState::NORMAL
         | 
| 862 861 | 
             
                  @completion_state = CompletionState::COMPLETION
         | 
| @@ -885,12 +884,12 @@ class Reline::LineEditor | |
| 885 884 | 
             
                      @completion_state = CompletionState::PERFECT_MATCH
         | 
| 886 885 | 
             
                    else
         | 
| 887 886 | 
             
                      @completion_state = CompletionState::MENU_WITH_PERFECT_MATCH
         | 
| 888 | 
            -
                       | 
| 887 | 
            +
                      perform_completion(list, true) if @config.show_all_if_ambiguous
         | 
| 889 888 | 
             
                    end
         | 
| 890 889 | 
             
                    @perfect_matched = completed
         | 
| 891 890 | 
             
                  else
         | 
| 892 891 | 
             
                    @completion_state = CompletionState::MENU
         | 
| 893 | 
            -
                     | 
| 892 | 
            +
                    perform_completion(list, true) if @config.show_all_if_ambiguous
         | 
| 894 893 | 
             
                  end
         | 
| 895 894 | 
             
                  if not just_show_list and target < completed
         | 
| 896 895 | 
             
                    @buffer_of_lines[@line_index] = (preposing + completed + completion_append_character.to_s + postposing).split("\n")[@line_index] || String.new(encoding: @encoding)
         | 
| @@ -1065,10 +1064,6 @@ class Reline::LineEditor | |
| 1065 1064 | 
             
              end
         | 
| 1066 1065 |  | 
| 1067 1066 | 
             
              private def normal_char(key)
         | 
| 1068 | 
            -
                if key.combined_char.is_a?(Symbol)
         | 
| 1069 | 
            -
                  process_key(key.combined_char, key.combined_char)
         | 
| 1070 | 
            -
                  return
         | 
| 1071 | 
            -
                end
         | 
| 1072 1067 | 
             
                @multibyte_buffer << key.combined_char
         | 
| 1073 1068 | 
             
                if @multibyte_buffer.size > 1
         | 
| 1074 1069 | 
             
                  if @multibyte_buffer.dup.force_encoding(@encoding).valid_encoding?
         | 
| @@ -1128,29 +1123,8 @@ class Reline::LineEditor | |
| 1128 1123 | 
             
                old_lines = @buffer_of_lines.dup
         | 
| 1129 1124 | 
             
                @first_char = false
         | 
| 1130 1125 | 
             
                @completion_occurs = false
         | 
| 1131 | 
            -
             | 
| 1132 | 
            -
             | 
| 1133 | 
            -
                    process_insert(force: true)
         | 
| 1134 | 
            -
                    if @config.autocompletion
         | 
| 1135 | 
            -
                      @completion_state = CompletionState::NORMAL
         | 
| 1136 | 
            -
                      @completion_occurs = move_completed_list(:down)
         | 
| 1137 | 
            -
                    else
         | 
| 1138 | 
            -
                      @completion_journey_state = nil
         | 
| 1139 | 
            -
                      result = call_completion_proc
         | 
| 1140 | 
            -
                      if result.is_a?(Array)
         | 
| 1141 | 
            -
                        @completion_occurs = true
         | 
| 1142 | 
            -
                        complete(result, false)
         | 
| 1143 | 
            -
                      end
         | 
| 1144 | 
            -
                    end
         | 
| 1145 | 
            -
                  end
         | 
| 1146 | 
            -
                elsif @config.editing_mode_is?(:vi_insert) and ["\C-p".ord, "\C-n".ord].include?(key.char)
         | 
| 1147 | 
            -
                  # In vi mode, move completed list even if autocompletion is off
         | 
| 1148 | 
            -
                  if not @config.disable_completion
         | 
| 1149 | 
            -
                    process_insert(force: true)
         | 
| 1150 | 
            -
                    @completion_state = CompletionState::NORMAL
         | 
| 1151 | 
            -
                    @completion_occurs = move_completed_list("\C-p".ord == key.char ? :up : :down)
         | 
| 1152 | 
            -
                  end
         | 
| 1153 | 
            -
                elsif Symbol === key.char and respond_to?(key.char, true)
         | 
| 1126 | 
            +
             | 
| 1127 | 
            +
                if key.char.is_a?(Symbol)
         | 
| 1154 1128 | 
             
                  process_key(key.char, key.char)
         | 
| 1155 1129 | 
             
                else
         | 
| 1156 1130 | 
             
                  normal_char(key)
         | 
| @@ -1331,6 +1305,16 @@ class Reline::LineEditor | |
| 1331 1305 | 
             
                @confirm_multiline_termination_proc.(temp_buffer.join("\n") + "\n")
         | 
| 1332 1306 | 
             
              end
         | 
| 1333 1307 |  | 
| 1308 | 
            +
              def insert_pasted_text(text)
         | 
| 1309 | 
            +
                pre = @buffer_of_lines[@line_index].byteslice(0, @byte_pointer)
         | 
| 1310 | 
            +
                post = @buffer_of_lines[@line_index].byteslice(@byte_pointer..)
         | 
| 1311 | 
            +
                lines = (pre + text.gsub(/\r\n?/, "\n") + post).split("\n", -1)
         | 
| 1312 | 
            +
                lines << '' if lines.empty?
         | 
| 1313 | 
            +
                @buffer_of_lines[@line_index, 1] = lines
         | 
| 1314 | 
            +
                @line_index += lines.size - 1
         | 
| 1315 | 
            +
                @byte_pointer = @buffer_of_lines[@line_index].bytesize - post.bytesize
         | 
| 1316 | 
            +
              end
         | 
| 1317 | 
            +
             | 
| 1334 1318 | 
             
              def insert_text(text)
         | 
| 1335 1319 | 
             
                if @buffer_of_lines[@line_index].bytesize == @byte_pointer
         | 
| 1336 1320 | 
             
                  @buffer_of_lines[@line_index] += text
         | 
| @@ -1429,13 +1413,42 @@ class Reline::LineEditor | |
| 1429 1413 | 
             
                end
         | 
| 1430 1414 | 
             
              end
         | 
| 1431 1415 |  | 
| 1432 | 
            -
              private def  | 
| 1433 | 
            -
                if  | 
| 1416 | 
            +
              private def complete(_key)
         | 
| 1417 | 
            +
                return if @config.disable_completion
         | 
| 1418 | 
            +
             | 
| 1419 | 
            +
                process_insert(force: true)
         | 
| 1420 | 
            +
                if @config.autocompletion
         | 
| 1434 1421 | 
             
                  @completion_state = CompletionState::NORMAL
         | 
| 1435 | 
            -
                  @completion_occurs = move_completed_list(: | 
| 1422 | 
            +
                  @completion_occurs = move_completed_list(:down)
         | 
| 1423 | 
            +
                else
         | 
| 1424 | 
            +
                  @completion_journey_state = nil
         | 
| 1425 | 
            +
                  result = call_completion_proc
         | 
| 1426 | 
            +
                  if result.is_a?(Array)
         | 
| 1427 | 
            +
                    @completion_occurs = true
         | 
| 1428 | 
            +
                    perform_completion(result, false)
         | 
| 1429 | 
            +
                  end
         | 
| 1436 1430 | 
             
                end
         | 
| 1437 1431 | 
             
              end
         | 
| 1438 | 
            -
             | 
| 1432 | 
            +
             | 
| 1433 | 
            +
              private def completion_journey_move(direction)
         | 
| 1434 | 
            +
                return if @config.disable_completion
         | 
| 1435 | 
            +
             | 
| 1436 | 
            +
                process_insert(force: true)
         | 
| 1437 | 
            +
                @completion_state = CompletionState::NORMAL
         | 
| 1438 | 
            +
                @completion_occurs = move_completed_list(direction)
         | 
| 1439 | 
            +
              end
         | 
| 1440 | 
            +
             | 
| 1441 | 
            +
              private def menu_complete(_key)
         | 
| 1442 | 
            +
                completion_journey_move(:down)
         | 
| 1443 | 
            +
              end
         | 
| 1444 | 
            +
             | 
| 1445 | 
            +
              private def menu_complete_backward(_key)
         | 
| 1446 | 
            +
                completion_journey_move(:up)
         | 
| 1447 | 
            +
              end
         | 
| 1448 | 
            +
             | 
| 1449 | 
            +
              private def completion_journey_up(_key)
         | 
| 1450 | 
            +
                completion_journey_move(:up) if @config.autocompletion
         | 
| 1451 | 
            +
              end
         | 
| 1439 1452 |  | 
| 1440 1453 | 
             
              # Editline:: +ed-unassigned+ This  editor command always results in an error.
         | 
| 1441 1454 | 
             
              # GNU Readline:: There is no corresponding macro.
         | 
| @@ -1904,7 +1917,7 @@ class Reline::LineEditor | |
| 1904 1917 | 
             
                elsif !@config.autocompletion # show completed list
         | 
| 1905 1918 | 
             
                  result = call_completion_proc
         | 
| 1906 1919 | 
             
                  if result.is_a?(Array)
         | 
| 1907 | 
            -
                     | 
| 1920 | 
            +
                    perform_completion(result, true)
         | 
| 1908 1921 | 
             
                  end
         | 
| 1909 1922 | 
             
                end
         | 
| 1910 1923 | 
             
              end
         | 
    
        data/lib/reline/unicode.rb
    CHANGED
    
    | @@ -43,11 +43,13 @@ class Reline::Unicode | |
| 43 43 |  | 
| 44 44 | 
             
              def self.escape_for_print(str)
         | 
| 45 45 | 
             
                str.chars.map! { |gr|
         | 
| 46 | 
            -
                   | 
| 47 | 
            -
                   | 
| 48 | 
            -
                    escaped
         | 
| 49 | 
            -
                  else
         | 
| 46 | 
            +
                  case gr
         | 
| 47 | 
            +
                  when -"\n"
         | 
| 50 48 | 
             
                    gr
         | 
| 49 | 
            +
                  when -"\t"
         | 
| 50 | 
            +
                    -'  '
         | 
| 51 | 
            +
                  else
         | 
| 52 | 
            +
                    EscapedPairs[gr.ord] || gr
         | 
| 51 53 | 
             
                  end
         | 
| 52 54 | 
             
                }.join
         | 
| 53 55 | 
             
              end
         | 
    
        data/lib/reline/version.rb
    CHANGED
    
    
    
        data/lib/reline.rb
    CHANGED
    
    | @@ -225,17 +225,20 @@ module Reline | |
| 225 225 | 
             
                  journey_data = completion_journey_data
         | 
| 226 226 | 
             
                  return unless journey_data
         | 
| 227 227 |  | 
| 228 | 
            -
                  target = journey_data.list | 
| 228 | 
            +
                  target = journey_data.list.first
         | 
| 229 | 
            +
                  completed = journey_data.list[journey_data.pointer]
         | 
| 229 230 | 
             
                  result = journey_data.list.drop(1)
         | 
| 230 231 | 
             
                  pointer = journey_data.pointer - 1
         | 
| 231 | 
            -
                  return if  | 
| 232 | 
            +
                  return if completed.empty? || (result == [completed] && pointer < 0)
         | 
| 232 233 |  | 
| 233 234 | 
             
                  target_width = Reline::Unicode.calculate_width(target)
         | 
| 234 | 
            -
                   | 
| 235 | 
            -
                  if x  | 
| 236 | 
            -
                     | 
| 235 | 
            +
                  completed_width = Reline::Unicode.calculate_width(completed)
         | 
| 236 | 
            +
                  if cursor_pos.x <= completed_width - target_width
         | 
| 237 | 
            +
                    # When target is rendered on the line above cursor position
         | 
| 238 | 
            +
                    x = screen_width - completed_width
         | 
| 237 239 | 
             
                    y = -1
         | 
| 238 240 | 
             
                  else
         | 
| 241 | 
            +
                    x = [cursor_pos.x - completed_width, 0].max
         | 
| 239 242 | 
             
                    y = 0
         | 
| 240 243 | 
             
                  end
         | 
| 241 244 | 
             
                  cursor_pos_to_render = Reline::CursorPos.new(x, y)
         | 
| @@ -309,6 +312,10 @@ module Reline | |
| 309 312 | 
             
                    $stderr.sync = true
         | 
| 310 313 | 
             
                    $stderr.puts "Reline is used by #{Process.pid}"
         | 
| 311 314 | 
             
                  end
         | 
| 315 | 
            +
                  unless config.test_mode or config.loaded?
         | 
| 316 | 
            +
                    config.read
         | 
| 317 | 
            +
                    io_gate.set_default_key_bindings(config)
         | 
| 318 | 
            +
                  end
         | 
| 312 319 | 
             
                  otio = io_gate.prep
         | 
| 313 320 |  | 
| 314 321 | 
             
                  may_req_ambiguous_char_width
         | 
| @@ -335,12 +342,6 @@ module Reline | |
| 335 342 | 
             
                    end
         | 
| 336 343 | 
             
                  end
         | 
| 337 344 |  | 
| 338 | 
            -
                  unless config.test_mode
         | 
| 339 | 
            -
                    config.read
         | 
| 340 | 
            -
                    config.reset_default_key_bindings
         | 
| 341 | 
            -
                    io_gate.set_default_key_bindings(config)
         | 
| 342 | 
            -
                  end
         | 
| 343 | 
            -
             | 
| 344 345 | 
             
                  line_editor.print_nomultiline_prompt(prompt)
         | 
| 345 346 | 
             
                  line_editor.update_dialogs
         | 
| 346 347 | 
             
                  line_editor.rerender
         | 
| @@ -350,7 +351,15 @@ module Reline | |
| 350 351 | 
             
                    loop do
         | 
| 351 352 | 
             
                      read_io(config.keyseq_timeout) { |inputs|
         | 
| 352 353 | 
             
                        line_editor.set_pasting_state(io_gate.in_pasting?)
         | 
| 353 | 
            -
                        inputs.each  | 
| 354 | 
            +
                        inputs.each do |key|
         | 
| 355 | 
            +
                          if key.char == :bracketed_paste_start
         | 
| 356 | 
            +
                            text = io_gate.read_bracketed_paste
         | 
| 357 | 
            +
                            line_editor.insert_pasted_text(text)
         | 
| 358 | 
            +
                            line_editor.scroll_into_view
         | 
| 359 | 
            +
                          else
         | 
| 360 | 
            +
                            line_editor.update(key)
         | 
| 361 | 
            +
                          end
         | 
| 362 | 
            +
                        end
         | 
| 354 363 | 
             
                      }
         | 
| 355 364 | 
             
                      if line_editor.finished?
         | 
| 356 365 | 
             
                        line_editor.render_finished
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: reline
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.5. | 
| 4 | 
            +
              version: 0.5.6
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - aycabta
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024- | 
| 11 | 
            +
            date: 2024-05-09 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: io-console
         | 
| @@ -76,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 76 76 | 
             
                - !ruby/object:Gem::Version
         | 
| 77 77 | 
             
                  version: '0'
         | 
| 78 78 | 
             
            requirements: []
         | 
| 79 | 
            -
            rubygems_version: 3.5. | 
| 79 | 
            +
            rubygems_version: 3.5.9
         | 
| 80 80 | 
             
            signing_key:
         | 
| 81 81 | 
             
            specification_version: 4
         | 
| 82 82 | 
             
            summary: Alternative GNU Readline or Editline implementation by pure Ruby.
         |