From 380c39761443ac4dc1483c982634e575a0584b65 Mon Sep 17 00:00:00 2001 From: Lionel Zoubritzky Date: Wed, 29 Jun 2022 10:09:27 +0200 Subject: [PATCH] Fix layout of REPL completions with newlines --- stdlib/REPL/src/LineEdit.jl | 2 +- stdlib/REPL/test/lineedit.jl | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/stdlib/REPL/src/LineEdit.jl b/stdlib/REPL/src/LineEdit.jl index b30a1d816a83f..a9b05a4b5f593 100644 --- a/stdlib/REPL/src/LineEdit.jl +++ b/stdlib/REPL/src/LineEdit.jl @@ -322,7 +322,7 @@ end # Show available completions function show_completions(s::PromptState, completions::Vector{String}) - colmax = maximum(map(length, completions)) + colmax = any(contains('\n'), completions) ? width(terminal(s))-2 : maximum(map(length, completions)) num_cols = max(div(width(terminal(s)), colmax+2), 1) entries_per_col, r = divrem(length(completions), num_cols) entries_per_col += r != 0 diff --git a/stdlib/REPL/test/lineedit.jl b/stdlib/REPL/test/lineedit.jl index 87028e239d5b8..16c39060e1cc3 100644 --- a/stdlib/REPL/test/lineedit.jl +++ b/stdlib/REPL/test/lineedit.jl @@ -906,3 +906,17 @@ end @test get_last_word("a[b[]]") == "b" @test get_last_word("a[]") == "a[]" end + +@testset "issue #45836" begin + term = FakeTerminal(IOBuffer(), IOBuffer(), IOBuffer()) + promptstate = REPL.LineEdit.init_state(term, REPL.LineEdit.mode(new_state())) + strings = ["abcdef", "123456", "ijklmn"] + REPL.LineEdit.show_completions(promptstate, strings) + completion = String(take!(promptstate.terminal.out_stream)) + @test completion == "\033[0B\n\rabcdef\r\033[8C123456\r\033[16Cijklmn\n" + strings2 = ["abcdef", "123456\nijklmn"] + promptstate = REPL.LineEdit.init_state(term, REPL.LineEdit.mode(new_state())) + REPL.LineEdit.show_completions(promptstate, strings2) + completion2 = String(take!(promptstate.terminal.out_stream)) + @test completion2 == "\033[0B\n\rabcdef\n\r123456\nijklmn\n" +end