Comments-by: Jeff King <peff@xxxxxxxx>
Signed-off-by: Felipe Contreras <felipe.contreras@xxxxxxxxx>
---
I returned back to the LESS_TERMCAP variables because -D options only
exists for non-dos systems since 2021.
I tested this with a version of less that is 10 years old, and everything
works as expected.
Also, I noticed less already chooses nice colors for standout with
--use-color, and the prompt color is cyan, which is the fist one
visible, so I changed standout to cyan.
Range-diff against v5:
1: 64c93d501f ! 1: 3a3e2837ad help: colorize man pages
@@ Commit message
moreover, many people have groff SGR disabled, so they don't see any
colors with man pages.
- We can set the LESS variable to render bold, underlined, and standout
- text with colors in the less pager.
+ We can set LESS_TERMCAP variables to render bold and underlined text
+ with colors in the pager; a common trick[1].
Bold is rendered as red, underlined as blue, and standout (prompt and
- highlighted search) as inverse magenta.
+ highlighted search) as inverse cyan.
Obviously this only works when the less pager is used.
- If the user has already set the LESS variable in his/her environment,
- that is respected, and nothing changes. The same if any LESS_TERMCAP_*
- variables are set.
+ If the user already has LESS_TERMCAP variables set in his/her
+ environment, those are respected and nothing changes.
A new color configuration is added: `color.man` for the people that want
to turn this feature off, otherwise `color.ui` is respected.
@@ Commit message
So, in order for this change to have any effect:
1. The user must use less
- 2. Not have the LESS variable set
+ 2. Not have the same LESS_TERMCAP variables set
3. Have color.ui enabled
4. Not have color.pager disabled
5. Not have color.man disabled
@@ Commit message
anybody who doesn't would not be affected negatively (plus very likely
comprises a very tiny minority).
+ [1] https://unix.stackexchange.com/questions/119/colors-in-man-pages/147
+
Suggested-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx>
Phillip Wood <phillip.wood123@xxxxxxxxx>
Comments-by: Jeff King <peff@xxxxxxxx>
@@ builtin/help.c: static void exec_man_konqueror(const char *path, const char *pag
+ if (!man_color || !want_color(GIT_COLOR_UNKNOWN) || !pager_use_color)
+ return;
+
-+ /* User already has configured less colors */
-+ if (getenv("LESS_TERMCAP_md") ||
-+ getenv("LESS_TERMCAP_us") ||
-+ getenv("LESS_TERMCAP_so")) {
-+ return;
-+ }
-+
+ /* Disable groff colors */
+ setenv("GROFF_NO_SGR", "1", 0);
+
-+ /* Add red to bold, blue to underline, and magenta to standout */
-+ /* No visual information is lost */
-+ setenv("LESS", "Dd+r$Du+b$Ds+m", 0);
++ /* Bold */
++ setenv("LESS_TERMCAP_md", GIT_COLOR_BOLD_RED, 0);
++ setenv("LESS_TERMCAP_me", GIT_COLOR_RESET, 0);
++
++ /* Underline */
++ setenv("LESS_TERMCAP_us", GIT_COLOR_BLUE GIT_COLOR_UNDERLINE, 0);
++ setenv("LESS_TERMCAP_ue", GIT_COLOR_RESET, 0);
++
++ /* Standout */
++ setenv("LESS_TERMCAP_so", GIT_COLOR_CYAN GIT_COLOR_REVERSE, 0);
++ setenv("LESS_TERMCAP_se", GIT_COLOR_RESET, 0);
+}
+
static void exec_man_man(const char *path, const char *page)
@@ builtin/help.c: static int git_help_config(const char *var, const char *value, v
}
static struct cmdnames main_cmds, other_cmds;
+
+ ## color.h ##
+@@ color.h: struct strbuf;
+ #define GIT_COLOR_FAINT "\033[2m"
+ #define GIT_COLOR_FAINT_ITALIC "\033[2;3m"
+ #define GIT_COLOR_REVERSE "\033[7m"
++#define GIT_COLOR_UNDERLINE "\033[4m"
+
+ /* A special value meaning "no color selected" */
+ #define GIT_COLOR_NIL "NIL"
Documentation/config/color.txt | 5 +++++
builtin/help.c | 32 +++++++++++++++++++++++++++++++-
color.h | 1 +
3 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/Documentation/config/color.txt b/Documentation/config/color.txt
index d5daacb13a..11278b7f72 100644
--- a/Documentation/config/color.txt
+++ b/Documentation/config/color.txt
@@ -126,6 +126,11 @@ color.interactive.<slot>::
or `error`, for four distinct types of normal output from
interactive commands.
+color.man::
+ This flag can be used to disable the automatic colorizaton of man
+ pages when using the less pager. It's activated only when color.ui
+ allows it, and also when color.pager is on. (`true` by default).
+
color.pager::
A boolean to enable/disable colored output when the pager is in
use (default is true).
diff --git a/builtin/help.c b/builtin/help.c
index bb339f0fc8..b6331afc2e 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -11,6 +11,7 @@
#include "config-list.h"
#include "help.h"
#include "alias.h"
+#include "color.h"
#ifndef DEFAULT_HELP_FORMAT
#define DEFAULT_HELP_FORMAT "man"
@@ -43,6 +44,7 @@ static int verbose = 1;
static unsigned int colopts;
static enum help_format help_format = HELP_FORMAT_NONE;
static int exclude_guides;
+static int man_color = 1;
static struct option builtin_help_options[] = {
OPT_BOOL('a', "all", &show_all, N_("print all available commands")),
OPT_HIDDEN_BOOL(0, "exclude-guides", &exclude_guides, N_("exclude guides")),
@@ -253,10 +255,33 @@ static void exec_man_konqueror(const char *path, const char *page)
}
}
+static void colorize_man(void)
+{
+ if (!man_color || !want_color(GIT_COLOR_UNKNOWN) || !pager_use_color)
+ return;
+
+ /* Disable groff colors */
+ setenv("GROFF_NO_SGR", "1", 0);
+
+ /* Bold */
+ setenv("LESS_TERMCAP_md", GIT_COLOR_BOLD_RED, 0);
+ setenv("LESS_TERMCAP_me", GIT_COLOR_RESET, 0);
+
+ /* Underline */
+ setenv("LESS_TERMCAP_us", GIT_COLOR_BLUE GIT_COLOR_UNDERLINE, 0);
+ setenv("LESS_TERMCAP_ue", GIT_COLOR_RESET, 0);
+
+ /* Standout */
+ setenv("LESS_TERMCAP_so", GIT_COLOR_CYAN GIT_COLOR_REVERSE, 0);
+ setenv("LESS_TERMCAP_se", GIT_COLOR_RESET, 0);
+}
+
static void exec_man_man(const char *path, const char *page)
{
if (!path)
path = "man";
+
+ colorize_man();
execlp(path, "man", page, (char *)NULL);
warning_errno(_("failed to exec '%s'"), path);
}
@@ -264,6 +289,7 @@ static void exec_man_man(const char *path, const char *page)
static void exec_man_cmd(const char *cmd, const char *page)
{
struct strbuf shell_cmd = STRBUF_INIT;
+ colorize_man();
strbuf_addf(&shell_cmd, "%s %s", cmd, page);
execl(SHELL_PATH, SHELL_PATH, "-c", shell_cmd.buf, (char *)NULL);
warning(_("failed to exec '%s'"), cmd);
@@ -371,8 +397,12 @@ static int git_help_config(const char *var, const char *value, void *cb)
}
if (starts_with(var, "man."))
return add_man_viewer_info(var, value);
+ if (!strcmp(var, "color.man")) {
+ man_color = git_config_bool(var, value);
+ return 0;
+ }
- return git_default_config(var, value, cb);
+ return git_color_default_config(var, value, cb);
}
static struct cmdnames main_cmds, other_cmds;
diff --git a/color.h b/color.h
index 98894d6a17..d012add4e8 100644
--- a/color.h
+++ b/color.h
@@ -51,6 +51,7 @@ struct strbuf;
#define GIT_COLOR_FAINT "\033[2m"
#define GIT_COLOR_FAINT_ITALIC "\033[2;3m"
#define GIT_COLOR_REVERSE "\033[7m"
+#define GIT_COLOR_UNDERLINE "\033[4m"
/* A special value meaning "no color selected" */
#define GIT_COLOR_NIL "NIL"