[Lldb-commits] [lldb] [lldb] Make the statusline separator configurable (PR #136611)
Adrian Prantl via lldb-commits
lldb-commits at lists.llvm.org
Mon Apr 21 16:15:57 PDT 2025
https://github.com/adrian-prantl updated https://github.com/llvm/llvm-project/pull/136611
>From 5783bec58f5074399edc2d528cbde454f44dd12b Mon Sep 17 00:00:00 2001
From: Adrian Prantl <aprantl at apple.com>
Date: Mon, 21 Apr 2025 13:56:28 -0700
Subject: [PATCH] [lldb] Make the statusline separator configurable
And use this functionality to replace the ASCII "|" with the same
full-geight line-drawing character used in diagnostics rendering on a
color terminal.
---
lldb/include/lldb/Core/Debugger.h | 3 +++
lldb/include/lldb/Core/FormatEntity.h | 1 +
lldb/source/Core/CoreProperties.td | 17 ++++++++++----
lldb/source/Core/Debugger.cpp | 22 +++++++++++++++++--
lldb/source/Core/FormatEntity.cpp | 11 ++++++++++
.../statusline/TestStatusline.py | 9 +++++---
6 files changed, 54 insertions(+), 9 deletions(-)
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h
index 00b86f6c133b6..ffa1b37338398 100644
--- a/lldb/include/lldb/Core/Debugger.h
+++ b/lldb/include/lldb/Core/Debugger.h
@@ -303,6 +303,9 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
const FormatEntity::Entry *GetStatuslineFormat() const;
bool SetStatuslineFormat(const FormatEntity::Entry &format);
+ llvm::StringRef GetStatuslineSeparator() const;
+ bool SetStatuslineSeparator(llvm::StringRef s);
+
llvm::StringRef GetShowProgressAnsiPrefix() const;
llvm::StringRef GetShowProgressAnsiSuffix() const;
diff --git a/lldb/include/lldb/Core/FormatEntity.h b/lldb/include/lldb/Core/FormatEntity.h
index c3f147ea3a7a2..f6c3bd981e03a 100644
--- a/lldb/include/lldb/Core/FormatEntity.h
+++ b/lldb/include/lldb/Core/FormatEntity.h
@@ -103,6 +103,7 @@ struct Entry {
CurrentPCArrow,
ProgressCount,
ProgressMessage,
+ Separator,
};
struct Definition {
diff --git a/lldb/source/Core/CoreProperties.td b/lldb/source/Core/CoreProperties.td
index af9eb139f0921..b471d2f1d5952 100644
--- a/lldb/source/Core/CoreProperties.td
+++ b/lldb/source/Core/CoreProperties.td
@@ -176,10 +176,19 @@ let Definition = "debugger" in {
Global,
DefaultTrue,
Desc<"Whether to show a statusline at the bottom of the terminal.">;
- def StatuslineFormat: Property<"statusline-format", "FormatEntity">,
- Global,
- DefaultStringValue<"${ansi.negative}{${target.file.basename}}{ | ${line.file.basename}:${line.number}:${line.column}}{ | ${thread.stop-reason}}{ | {${progress.count} }${progress.message}}">,
- Desc<"The default statusline format string.">;
+ def StatuslineSeparator : Property<"statusline-separator", "String">,
+ Global,
+ DefaultStringValue<"│ ">,
+ Desc<"The default statusline separator.">;
+ def StatuslineFormat
+ : Property<"statusline-format", "FormatEntity">,
+ Global,
+ DefaultStringValue<
+ "${ansi.negative}{${target.file.basename}}{ "
+ "${separator}${line.file.basename}:${line.number}:${line.column}}{ "
+ "${separator}${thread.stop-reason}}{ "
+ "${separator}{${progress.count} }${progress.message}}">,
+ Desc<"The default statusline format string.">;
def UseSourceCache: Property<"use-source-cache", "Boolean">,
Global,
DefaultTrue,
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index 8fe80b3841883..f317dcd483c2b 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -500,6 +500,19 @@ bool Debugger::SetStatuslineFormat(const FormatEntity::Entry &format) {
return ret;
}
+llvm::StringRef Debugger::GetStatuslineSeparator() const {
+ constexpr uint32_t idx = ePropertyStatuslineSeparator;
+ return GetPropertyAtIndexAs<llvm::StringRef>(
+ idx, g_debugger_properties[idx].default_cstr_value);
+}
+
+bool Debugger::SetStatuslineSeparator(llvm::StringRef s) {
+ constexpr uint32_t idx = ePropertyStatuslineSeparator;
+ bool ret = SetPropertyAtIndex(idx, s);
+ RedrawStatusline();
+ return ret;
+}
+
bool Debugger::GetUseAutosuggestion() const {
const uint32_t idx = ePropertyShowAutosuggestion;
return GetPropertyAtIndexAs<bool>(
@@ -999,11 +1012,16 @@ Debugger::Debugger(lldb::LogOutputCallback log_callback, void *baton)
// Turn off use-color if this is a dumb terminal.
const char *term = getenv("TERM");
- if (term && !strcmp(term, "dumb"))
+ auto disable_color = [&]() {
SetUseColor(false);
+ SetStatuslineSeparator("| ");
+ };
+
+ if (term && !strcmp(term, "dumb"))
+ disable_color();
// Turn off use-color if we don't write to a terminal with color support.
if (!GetOutputFileSP()->GetIsTerminalWithColors())
- SetUseColor(false);
+ disable_color();
if (Diagnostics::Enabled()) {
m_diagnostics_callback_id = Diagnostics::Instance().AddCallback(
diff --git a/lldb/source/Core/FormatEntity.cpp b/lldb/source/Core/FormatEntity.cpp
index fc4359d7d310a..4ce889acd4d8b 100644
--- a/lldb/source/Core/FormatEntity.cpp
+++ b/lldb/source/Core/FormatEntity.cpp
@@ -266,6 +266,7 @@ constexpr Definition g_top_level_entries[] = {
g_var_child_entries, true),
Entry::DefinitionWithChildren("progress", EntryType::Invalid,
g_progress_child_entries),
+ Definition("separator", EntryType::Separator),
};
constexpr Definition g_root = Entry::DefinitionWithChildren(
@@ -367,6 +368,7 @@ const char *FormatEntity::Entry::TypeToCString(Type t) {
ENUM_TO_CSTR(CurrentPCArrow);
ENUM_TO_CSTR(ProgressCount);
ENUM_TO_CSTR(ProgressMessage);
+ ENUM_TO_CSTR(Separator);
}
return "???";
}
@@ -1901,6 +1903,15 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
}
}
return false;
+
+ case Entry::Type::Separator:
+ if (Target *target = Target::GetTargetFromContexts(exe_ctx, sc)) {
+ llvm::StringRef sep = target->GetDebugger().GetStatuslineSeparator();
+ if (!sep.empty())
+ s << sep;
+ return true;
+ }
+ return false;
}
return false;
diff --git a/lldb/test/API/functionalities/statusline/TestStatusline.py b/lldb/test/API/functionalities/statusline/TestStatusline.py
index 489c0371b11d8..95174e42914e8 100644
--- a/lldb/test/API/functionalities/statusline/TestStatusline.py
+++ b/lldb/test/API/functionalities/statusline/TestStatusline.py
@@ -32,6 +32,7 @@ def test(self):
# Enable the statusline and check for the control character and that we
# can see the target, the location and the stop reason.
+ self.expect('set set statusline-separator "| "')
self.expect(
"set set show-statusline true",
[
@@ -46,11 +47,13 @@ def test(self):
self.child.setwinsize(terminal_height, terminal_width)
# Change the format.
+ self.expect('set set statusline-separator "S"')
self.expect(
- 'set set statusline-format "target = {${target.file.basename}}"',
- ["target = a.out"],
+ 'set set statusline-format "target = {${target.file.basename}} ${separator}"',
+ ["target = a.out S"],
)
-
+ self.expect('set set statusline-separator "| "')
+
# Hide the statusline and check or the control character.
self.expect(
"set set show-statusline false", ["\x1b[0;{}r".format(terminal_height)]
More information about the lldb-commits
mailing list