summaryrefslogtreecommitdiff
path: root/lib/reline.rb
diff options
context:
space:
mode:
authoraycabta <aycabta@gmail.com>2021-08-27 03:45:27 +0900
committeraycabta <aycabta@gmail.com>2021-08-29 20:30:33 +0900
commitacffb0b0683decd2e99ab7414f9c73fb3e135d2c (patch)
tree697c1d3967b99655d895582c7153abad3dbba07b /lib/reline.rb
parent164e48622509cb6947c453360417b1486685f3d1 (diff)
[ruby/reline] Cut out the autocomplete callback
https://github.com/ruby/reline/commit/46aa2694da
Diffstat (limited to 'lib/reline.rb')
-rw-r--r--lib/reline.rb64
1 files changed, 33 insertions, 31 deletions
diff --git a/lib/reline.rb b/lib/reline.rb
index eb99bd5931..8c72d69b7e 100644
--- a/lib/reline.rb
+++ b/lib/reline.rb
@@ -177,41 +177,43 @@ module Reline
Reline::IOGate.get_screen_size
end
+ DEFAULT_DIALOG_PROC_AUTOCOMPLETE = ->() {
+ # autocomplete
+ if just_cursor_moving and completion_journey_data.nil?
+ # Auto complete starts only when edited
+ return nil
+ end
+ pre, target, post= retrieve_completion_block(true)
+ if target.nil? or target.empty?# or target.size <= 3
+ return nil
+ end
+ if completion_journey_data and completion_journey_data.list
+ result = completion_journey_data.list.dup
+ result.shift
+ pointer = completion_journey_data.pointer - 1
+ else
+ result = call_completion_proc_with_checking_args(pre, target, post)
+ pointer = nil
+ end
+ if result and result.size == 1 and result[0] == target
+ result = nil
+ end
+ target_width = Reline::Unicode.calculate_width(target)
+ x = cursor_pos.x - target_width
+ if x < 0
+ x = screen_width + x
+ y = -1
+ else
+ y = 0
+ end
+ [Reline::CursorPos.new(x, y), result, pointer]
+ }
+
def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination)
unless confirm_multiline_termination
raise ArgumentError.new('#readmultiline needs block to confirm multiline termination')
end
- @dialog_proc = ->() {
- # autocomplete
- if just_cursor_moving and completion_journey_data.nil?
- # Auto complete starts only when edited
- return nil
- end
- pre, target, post= retrieve_completion_block(true)
- if target.nil? or target.empty?
- return nil
- end
- if completion_journey_data and completion_journey_data.list
- result = completion_journey_data.list.dup
- result.shift
- pointer = completion_journey_data.pointer - 1
- else
- result = call_completion_proc_with_checking_args(pre, target, post)
- pointer = nil
- end
- if result and result.size == 1 and result[0] == target
- result = nil
- end
- target_width = Reline::Unicode.calculate_width(target)
- x = cursor_pos.x - target_width
- if x < 0
- x = screen_width + x
- y = -1
- else
- y = 0
- end
- [Reline::CursorPos.new(x, y), result, pointer]
- }
+ @dialog_proc = DEFAULT_DIALOG_PROC_AUTOCOMPLETE
inner_readline(prompt, add_hist, true, &confirm_multiline_termination)
whole_buffer = line_editor.whole_buffer.dup