Use emoji to indicate errors and warnings

This patch adds, at long last, some emoji output to gdb.  In
particular, warnings are indicated with the U+26A0 (WARNING SIGN), and
errors with U+274C (CROSS MARK).

There is a new setting to control whether emoji output can be used.
It defaults to "auto", which means emoji will be used if the host
charset is UTF-8.  Note that disabling styling will also disable
emoji, handy for traditionalists.

I've refactored mingw console output a little, so that emoji will not
be printed to the console.  Note the previous code here was a bit
strange in that it assumed that the first use of gdb_console_fputs
would be to stdout.

This version lets the user control the prefixes directly, so different
emoji can be chosen if desired.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Reviewed-By: Keith Seitz <keiths@redhat.com>
Reviewed-By: Guinevere Larsen <guinevere@redhat.com>
This commit is contained in:
Tom Tromey
2024-12-20 14:00:39 -07:00
parent 5c87b330e9
commit a048980c4e
10 changed files with 207 additions and 17 deletions

View File

@@ -23,6 +23,7 @@
#include "cli/cli-style.h"
#include "source-cache.h"
#include "observable.h"
#include "charset.h"
/* True if styling is enabled. */
@@ -42,6 +43,10 @@ bool source_styling = true;
bool disassembler_styling = true;
/* User-settable variable controlling emoji output. */
static auto_boolean emoji_styling = AUTO_BOOLEAN_AUTO;
/* Names of intensities; must correspond to
ui_file_style::intensity. */
static const char * const cli_intensities[] = {
@@ -410,6 +415,85 @@ show_style_disassembler (struct ui_file *file, int from_tty,
gdb_printf (file, _("Disassembler output styling is disabled.\n"));
}
/* Implement 'show style emoji'. */
static void
show_emoji_styling (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
if (emoji_styling == AUTO_BOOLEAN_TRUE)
gdb_printf (file, _("CLI emoji styling is enabled.\n"));
else if (emoji_styling == AUTO_BOOLEAN_FALSE)
gdb_printf (file, _("CLI emoji styling is disabled.\n"));
else
gdb_printf (file, _("CLI emoji styling is automatic (currently %s).\n"),
emojis_ok () ? _("enabled") : _("disabled"));
}
/* See cli-style.h. */
bool
emojis_ok ()
{
if (!cli_styling || emoji_styling == AUTO_BOOLEAN_FALSE)
return false;
if (emoji_styling == AUTO_BOOLEAN_TRUE)
return true;
return strcmp (host_charset (), "UTF-8") == 0;
}
/* See cli-style.h. */
void
no_emojis ()
{
emoji_styling = AUTO_BOOLEAN_FALSE;
}
/* Emoji warning prefix. */
static std::string warning_prefix = "⚠️ ";
/* Implement 'show warning-prefix'. */
static void
show_warning_prefix (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
gdb_printf (file, _("Warning prefix is \"%s\".\n"),
warning_prefix.c_str ());
}
/* See cli-style.h. */
void
print_warning_prefix (ui_file *file)
{
if (emojis_ok ())
gdb_puts (warning_prefix.c_str (), file);
}
/* Emoji error prefix. */
static std::string error_prefix = "❌️ ";
/* Implement 'show error-prefix'. */
static void
show_error_prefix (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
gdb_printf (file, _("Error prefix is \"%s\".\n"),
error_prefix.c_str ());
}
/* See cli-style.h. */
void
print_error_prefix (ui_file *file)
{
if (emojis_ok ())
gdb_puts (error_prefix.c_str (), file);
}
void _initialize_cli_style ();
void
_initialize_cli_style ()
@@ -431,6 +515,13 @@ If enabled, output to the terminal is styled."),
set_style_enabled, show_style_enabled,
&style_set_list, &style_show_list);
add_setshow_auto_boolean_cmd ("emoji", no_class, &emoji_styling, _("\
Set whether emoji output is enabled."), _("\
Show whether emoji output is enabled."), _("\
If enabled, emojis may be displayed."),
nullptr, show_emoji_styling,
&style_set_list, &style_show_list);
add_setshow_boolean_cmd ("sources", no_class, &source_styling, _("\
Set whether source code styling is enabled."), _("\
Show whether source code styling is enabled."), _("\
@@ -627,4 +718,23 @@ coming from your source code."),
&style_disasm_set_list);
add_alias_cmd ("symbol", function_prefix_cmds.show, no_class, 0,
&style_disasm_show_list);
add_setshow_string_cmd ("warning-prefix", no_class,
&warning_prefix,
_("Set the warning prefix text."),
_("Show the warning prefix text."),
_("\
The warning prefix text is displayed before any warning, when\n\
emoji output is enabled."),
nullptr, show_warning_prefix,
&style_set_list, &style_show_list);
add_setshow_string_cmd ("error-prefix", no_class,
&error_prefix,
_("Set the error prefix text."),
_("Show the error prefix text."),
_("\
The error prefix text is displayed before any error, when\n\
emoji output is enabled."),
nullptr, show_error_prefix,
&style_set_list, &style_show_list);
}