================ @@ -927,12 +927,87 @@ unsigned char Editline::BufferEndCommand(int ch) { static void PrintCompletion(FILE *output_file, llvm::ArrayRef<CompletionResult::Completion> results, - size_t max_len) { + size_t max_completion_length, size_t max_length) { + constexpr size_t ellipsis_length = 3; + constexpr size_t padding_length = 8; + constexpr size_t separator_length = 4; + + const size_t description_col = + std::min(max_completion_length + padding_length, max_length); + for (const CompletionResult::Completion &c : results) { - fprintf(output_file, "\t%-*s", (int)max_len, c.GetCompletion().c_str()); - if (!c.GetDescription().empty()) - fprintf(output_file, " -- %s", c.GetDescription().c_str()); - fprintf(output_file, "\n"); + if (c.GetCompletion().empty()) + continue; + ; + + // Print the leading padding. + fprintf(output_file, " "); + + // Print the completion with trailing padding to the description column if + // that fits on the screen. Otherwise print whatever fits on the screen + // followed by ellipsis. + const size_t completion_length = c.GetCompletion().size(); + if (padding_length + completion_length < max_length) { + fprintf(output_file, "%-*s", + static_cast<int>(description_col - padding_length), + c.GetCompletion().c_str()); + } else { + // If the completion doesn't fit on the screen, print ellipsis and don't + // bother with the description. + fprintf(output_file, "%.*s...\n\n", + static_cast<int>(max_length - padding_length - ellipsis_length), + c.GetCompletion().c_str()); + continue; + } + + // If we don't have a description, or we don't have enough space left to + // print the separator followed by the ellipsis, we're done. + if (c.GetDescription().empty() || + description_col + separator_length + ellipsis_length >= max_length) { + fprintf(output_file, "\n"); + continue; + } + + // Print the separator. + fprintf(output_file, " -- "); + + // Descriptions can contain newlines. We want to print them below each + // other, aligned after the separator. For example, foo has a + // two-line description: + // + // foo -- Something that fits on the line. + // More information below. + // + // However, as soon as a line exceed the available screen width and + // print ellipsis, we don't print the next line. For example, foo has a + // three-line description: + // + // foo -- Something that fits on the line. + // Something much longer that doesn't fit... + // + // Because we had to print ellipsis on line two, we don't print the + // third line. + bool first = true; + for (llvm::StringRef line : llvm::split(c.GetDescription(), '\n')) { + if (line.empty()) + break; + if (!first) + fprintf(output_file, "%*s", + static_cast<int>(description_col + separator_length), ""); + + first = false; + const size_t position = description_col + separator_length; + const size_t description_lenth = line.size(); ---------------- labath wrote:
len**g**th https://github.com/llvm/llvm-project/pull/116456 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits