ruby / reline

The compatible library with the API of Ruby's stdlib 'readline'
Other
260 stars 83 forks source link

Unexpected completion_append_character when tab-completing #754

Closed sjanusz-r7 closed 1 week ago

sjanusz-r7 commented 1 month ago

Description

The completion_append_character seems to be appended when there are still more autocomplete values available

This is my current code:

require 'reline'
COMPLETION_VALUES = ['my_dir/http/linux/apache', 'my_dir/http/linux/ngnix', 'my_dir/windows/chrome', 'my_dir/linux/enum'].freeze

tab_complete_lambda = proc do |_str, _preposing = nil, _postposing = nil|
  COMPLETION_VALUES
end

begin
  prompt = 'Prompt > '
  use_history = false
  getting_input = true

  Reline.completion_append_character = ' '
  Reline.completion_proc = tab_complete_lambda

  while getting_input
    text = Reline.readmultiline(prompt, use_history) do |multiline_input|
      # Accept the input until 'end' is entered
      multiline_input.split.last == 'end'
    end

    getting_input = false
    puts 'You entered:'
    puts text
  end
  # If you want to exit, type Ctrl-C
rescue Interrupt
  puts '^C'
end

Current Behaviour

  1. Type in my_<TAB>
  2. I receive my_dir/<SPACE>

The space is unexpected as I can still auto-complete more things.

Expected behaviour

  1. Type in my_<TAB>
  2. I receive my_dir/ (No space)
  3. I can continue to tab the remaining completions my_dir/<tab> and receive my_dir/http/linux as a completion

The space is should not be appended - as there's still more values to be tab-completed, such as my_dir/http/linux etc

Potential fix

It looks like we might not want to append completion_append_character if there are still more items available in the completion_proc list:

https://github.com/ruby/reline/blob/7534f7f92ad6ec5e38d7b404942cd7f30e3c1327/lib/reline/line_editor.rb#L880-L884

Terminal Emulator

MacOS Terminal

Reline Version

0.5.10