@@ -578,8 +578,9 @@ def context
578
578
@context
579
579
end
580
580
581
- def retrieve_completion_block ( set_completion_quote_character = false )
582
- @line_editor . retrieve_completion_block ( set_completion_quote_character )
581
+ def retrieve_completion_block ( _unused = false )
582
+ preposing , target , postposing , _quote = @line_editor . retrieve_completion_block
583
+ [ preposing , target , postposing ]
583
584
end
584
585
585
586
def call_completion_proc_with_checking_args ( pre , target , post )
@@ -826,8 +827,7 @@ def editing_mode
826
827
end . uniq
827
828
end
828
829
829
- private def perform_completion ( list )
830
- preposing , target , postposing = retrieve_completion_block
830
+ private def perform_completion ( preposing , target , postposing , quote , list )
831
831
candidates = filter_normalize_candidates ( target , list )
832
832
833
833
case @completion_state
@@ -851,7 +851,7 @@ def editing_mode
851
851
append_character = ''
852
852
if candidates . include? ( completed )
853
853
if candidates . one?
854
- append_character = completion_append_character . to_s
854
+ append_character = quote || completion_append_character . to_s
855
855
@completion_state = CompletionState ::PERFECT_MATCH
856
856
elsif @config . show_all_if_ambiguous
857
857
menu ( candidates )
@@ -895,8 +895,8 @@ def dialog_proc_scope_completion_journey_data
895
895
end
896
896
897
897
private def retrieve_completion_journey_state
898
- preposing , target , postposing = retrieve_completion_block
899
- list = call_completion_proc
898
+ preposing , target , postposing , quote = retrieve_completion_block
899
+ list = call_completion_proc ( preposing , target , postposing , quote )
900
900
return unless list . is_a? ( Array )
901
901
902
902
candidates = list . select { |item | item . start_with? ( target ) }
@@ -1146,9 +1146,8 @@ def scroll_into_view
1146
1146
end
1147
1147
end
1148
1148
1149
- def call_completion_proc
1150
- result = retrieve_completion_block ( true )
1151
- pre , target , post = result
1149
+ def call_completion_proc ( pre , target , post , quote )
1150
+ Reline . core . instance_variable_set ( :@completion_quote_character , quote )
1152
1151
result = call_completion_proc_with_checking_args ( pre , target , post )
1153
1152
Reline . core . instance_variable_set ( :@completion_quote_character , nil )
1154
1153
result
@@ -1224,11 +1223,12 @@ def set_current_lines(lines, byte_pointer = nil, line_index = 0)
1224
1223
process_auto_indent
1225
1224
end
1226
1225
1227
- def retrieve_completion_block ( set_completion_quote_character = false )
1226
+ def retrieve_completion_block
1228
1227
quote_characters = Reline . completer_quote_characters
1229
1228
before = current_line . byteslice ( 0 , @byte_pointer ) . grapheme_clusters
1230
1229
quote = nil
1231
- unless quote_characters . empty?
1230
+ # Calcualte closing quote when cursor is at the end of the line
1231
+ if current_line . bytesize == @byte_pointer && !quote_characters . empty?
1232
1232
escaped = false
1233
1233
before . each do |c |
1234
1234
if escaped
@@ -1243,26 +1243,20 @@ def retrieve_completion_block(set_completion_quote_character = false)
1243
1243
end
1244
1244
end
1245
1245
end
1246
+
1246
1247
word_break_characters = quote_characters + Reline . completer_word_break_characters
1247
1248
break_index = before . rindex { |c | word_break_characters . include? ( c ) || quote_characters . include? ( c ) } || -1
1248
1249
preposing = before . take ( break_index + 1 ) . join
1249
1250
target = before . drop ( break_index + 1 ) . join
1250
1251
postposing = current_line . byteslice ( @byte_pointer , current_line . bytesize - @byte_pointer )
1251
- if target
1252
- if set_completion_quote_character and quote
1253
- Reline . core . instance_variable_set ( :@completion_quote_character , quote )
1254
- insert_text ( quote ) # FIXME: should not be here
1255
- target += quote
1256
- end
1257
- end
1258
1252
lines = whole_lines
1259
1253
if @line_index > 0
1260
1254
preposing = lines [ 0 ..( @line_index - 1 ) ] . join ( "\n " ) + "\n " + preposing
1261
1255
end
1262
1256
if ( lines . size - 1 ) > @line_index
1263
1257
postposing = postposing + "\n " + lines [ ( @line_index + 1 ) ..-1 ] . join ( "\n " )
1264
1258
end
1265
- [ preposing . encode ( encoding ) , target . encode ( encoding ) , postposing . encode ( encoding ) ]
1259
+ [ preposing . encode ( encoding ) , target . encode ( encoding ) , postposing . encode ( encoding ) , quote &. encode ( encoding ) ]
1266
1260
end
1267
1261
1268
1262
def confirm_multiline_termination
@@ -1393,10 +1387,11 @@ def finish
1393
1387
@completion_occurs = move_completed_list ( :down )
1394
1388
else
1395
1389
@completion_journey_state = nil
1396
- result = call_completion_proc
1390
+ pre , target , post , quote = retrieve_completion_block
1391
+ result = call_completion_proc ( pre , target , post , quote )
1397
1392
if result . is_a? ( Array )
1398
1393
@completion_occurs = true
1399
- perform_completion ( result )
1394
+ perform_completion ( pre , target , post , quote , result )
1400
1395
end
1401
1396
end
1402
1397
end
@@ -1860,9 +1855,9 @@ def finish
1860
1855
if current_line . empty? or @byte_pointer < current_line . bytesize
1861
1856
em_delete ( key )
1862
1857
elsif !@config . autocompletion # show completed list
1863
- result = call_completion_proc
1858
+ pre , target , post , quote = retrieve_completion_block
1859
+ result = call_completion_proc ( pre , target , post , quote )
1864
1860
if result . is_a? ( Array )
1865
- _preposing , target = retrieve_completion_block
1866
1861
candidates = filter_normalize_candidates ( target , result )
1867
1862
menu ( candidates )
1868
1863
end
0 commit comments