gdb/styling: only check TERM environment once, during initialisation

We currently check the TERM environment variable any time we call one
of the ui_file::can_emit_style_escape() functions.  This seems
excessive.

During GDB's startup we also check for the NO_COLOR environment
variable and disable styling if this is set.

I propose that we combine these two checks, and perform them just once
during startup (as the current NO_COLOR check is currently done).  As
with the NO_COLOR check, if the TERM variable is set to "dumb"
indicating that styling is not supported then we should just set
cli_styling to false.

This does mean that the user can then 'set style enabled on', even for
a dumb terminal, which was not possible previously.  Before this
commit the "dumb" terminal check was separate and would prevent
styling even if 'set style enabled on' was in effect.

Of course, trying to turn on styling in a dumb terminal might not give
the results that a user hope for.  And so, I have implemented a check
in `set_style_enabled`, so in a dumb terminal a user will see this:

  (gdb) set style enabled on
  warning: The current terminal doesn't support styling.  Styled output might not appear as expected.

After which GDB will try to emit styling.  We could, potentially,
prevent styling being enabled instead of emitting a warning, but I'm
inclined to let the user turn on styling if they really want to.

Approved-By: Kevin Buettner <kevinb@redhat.com>
Acked-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Andrew Burgess
2025-02-17 10:21:12 +00:00
parent dbfac07a71
commit 431b369e1c
5 changed files with 113 additions and 21 deletions

View File

@@ -644,9 +644,9 @@ captured_main_1 (struct captured_main_args *context)
int save_auto_load;
int ret = 1;
const char *no_color = getenv ("NO_COLOR");
if (no_color != nullptr && *no_color != '\0')
cli_styling = false;
/* Check for environment variables which might cause GDB to start with
styling disabled. */
disable_styling_from_environment ();
#ifdef HAVE_USEFUL_SBRK
/* Set this before constructing scoped_command_stats. */