Skip to content

Commit 90155fd

Browse files
authored
Fix pasting tab-indented code crash (#630)
1 parent 38e9cb2 commit 90155fd

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

lib/reline/line_editor.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,7 +1313,7 @@ def editing_mode
13131313
end
13141314
if not just_show_list and target < completed
13151315
@line = (preposing + completed + completion_append_character.to_s + postposing).split("\n")[@line_index] || String.new(encoding: @encoding)
1316-
line_to_pointer = (preposing + completed + completion_append_character.to_s).split("\n").last || String.new(encoding: @encoding)
1316+
line_to_pointer = (preposing + completed + completion_append_character.to_s).split("\n")[@line_index] || String.new(encoding: @encoding)
13171317
@cursor_max = calculate_width(@line)
13181318
@cursor = calculate_width(line_to_pointer)
13191319
@byte_pointer = line_to_pointer.bytesize
@@ -1360,7 +1360,7 @@ def editing_mode
13601360
completed = @completion_journey_data.list[@completion_journey_data.pointer]
13611361
new_line = (@completion_journey_data.preposing + completed + @completion_journey_data.postposing).split("\n")[@line_index]
13621362
@line = new_line.nil? ? String.new(encoding: @encoding) : new_line
1363-
line_to_pointer = (@completion_journey_data.preposing + completed).split("\n").last
1363+
line_to_pointer = (@completion_journey_data.preposing + completed).split("\n")[@line_index]
13641364
line_to_pointer = String.new(encoding: @encoding) if line_to_pointer.nil?
13651365
@cursor_max = calculate_width(@line)
13661366
@cursor = calculate_width(line_to_pointer)

test/reline/yamatanooroti/multiline_repl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ opt.on('--autocomplete') {
153153
%w{String Struct Symbol ScriptError SyntaxError Signal}.select{ |c| c.start_with?(target) }
154154
}
155155
}
156+
opt.on('--autocomplete-empty') {
157+
Reline.autocompletion = true
158+
Reline.completion_proc = lambda { |target, preposing = nil, postposing = nil| [] }
159+
}
156160
opt.on('--autocomplete-long') {
157161
Reline.autocompletion = true
158162
Reline.completion_proc = lambda { |target, preposing = nil, postposing = nil|

test/reline/yamatanooroti/test_rendering.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,6 +1213,32 @@ def test_autocomplete
12131213
EOC
12141214
end
12151215

1216+
def test_autocomplete_empty_string
1217+
start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.')
1218+
write("\C-i")
1219+
close
1220+
assert_screen(<<~'EOC')
1221+
Multiline REPL.
1222+
prompt> String
1223+
String █
1224+
Struct ▀
1225+
Symbol
1226+
EOC
1227+
end
1228+
1229+
def test_paste_code_with_tab_indent_does_not_fail
1230+
start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete-empty}, startup_message: 'Multiline REPL.')
1231+
write("2.times do\n\tputs\n\tputs\nend")
1232+
close
1233+
assert_screen(<<~'EOC')
1234+
Multiline REPL.
1235+
prompt> 2.times do
1236+
prompt> puts
1237+
prompt> puts
1238+
prompt> end
1239+
EOC
1240+
end
1241+
12161242
def test_autocomplete_after_2nd_line
12171243
start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --autocomplete}, startup_message: 'Multiline REPL.')
12181244
write("def hoge\n Str")

0 commit comments

Comments
 (0)