Skip to content

Commit

Permalink
dircolors: consider COLORTERM as well as TERM env vars
Browse files Browse the repository at this point in the history
COLORTERM is an environment used usually to expose truecolor support in
terminal emulators.  Therefore support matches on that in addition
to TERM.  Also set the default COLORTERM match pattern so that
we apply colors if COLORTERM is any value.

This implicitly supports a terminal like "foot"
without a need for an explicit TERM entry.

* NEWS: Mention the new feature.
* src/dircolors.c (main): Match COLORTERM like we do for TERM.
* src/dircolors.hin: Add default config to match any COLORTERM.
* tests/misc/dircolors.pl: Add test cases.
  • Loading branch information
pixelb committed Feb 15, 2022
1 parent 0b0f196 commit 75c9fc6
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 3 deletions.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ GNU coreutils NEWS -*- outline -*-
dircolors takes a new --print-ls-colors option to display LS_COLORS
entries, on separate lines, colored according to the entry color code.

dircolors will now also match COLORTERM in addition to TERM environment
variables. The default config will apply colors with any COLORTERM set.

** Improvements

cp, mv, and install now use openat-like syscalls when copying to a directory.
Expand Down
15 changes: 14 additions & 1 deletion src/dircolors.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ dc_parse_stream (FILE *fp, char const *filename)
size_t input_line_size = 0;
char const *line;
char const *term;
char const *colorterm;
bool ok = true;

/* State for the parser. */
Expand All @@ -281,6 +282,11 @@ dc_parse_stream (FILE *fp, char const *filename)
if (term == NULL || *term == '\0')
term = "none";

/* Also match $COLORTERM. */
colorterm = getenv ("COLORTERM");
if (colorterm == NULL)
colorterm = ""; /* Doesn't match default "?*" */

while (true)
{
char *keywd, *arg;
Expand Down Expand Up @@ -327,10 +333,17 @@ dc_parse_stream (FILE *fp, char const *filename)
else if (state != ST_TERMSURE)
state = ST_TERMNO;
}
else if (c_strcasecmp (keywd, "COLORTERM") == 0)
{
if (fnmatch (arg, colorterm, 0) == 0)
state = ST_TERMSURE;
else if (state != ST_TERMSURE)
state = ST_TERMNO;
}
else
{
if (state == ST_TERMSURE)
state = ST_TERMYES; /* Another TERM can cancel */
state = ST_TERMYES; /* Another {COLOR,}TERM can cancel. */

if (state != ST_TERMNO)
{
Expand Down
10 changes: 8 additions & 2 deletions src/dircolors.hin
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@
# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
# slackware version of dircolors) are recognized but ignored.

# Below are TERM entries, which can be a glob patterns, to match
# against the TERM environment variable to determine if it is colorable.
# Global config options can be specified before TERM or COLORTERM entries

# Below are TERM or COLORTERM entries, which can be glob patterns, which
# restrict following config to systems with matching environment variables.
COLORTERM ?*
TERM Eterm
TERM ansi
TERM *color*
Expand Down Expand Up @@ -207,3 +210,6 @@ EXEC 01;32
.opus 00;36
.spx 00;36
.xspf 00;36

# Subsequent TERM or COLORTERM entries, can be used to add / override
# config specific to those matching environment variables.
8 changes: 8 additions & 0 deletions tests/misc/dircolors.pl
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@
['term-4', '-b', {IN => "TERM N*match\nowt 40;33\n"},
{OUT => "LS_COLORS='';\nexport LS_COLORS\n"}],

['colorterm-1', '-b', {ENV => 'COLORTERM=any'},
{IN => "COLORTERM ?*\nowt 40;33\n"},
{OUT => "LS_COLORS='tw=40;33:';\nexport LS_COLORS\n"}],

['colorterm-2', '-b', {ENV => 'COLORTERM='},
{IN => "COLORTERM ?*\nowt 40;33\n"},
{OUT => "LS_COLORS='';\nexport LS_COLORS\n"}],

['print-clash1', '-p', '--print-ls',
{ERR => "dircolors: options --print-database and --print-ls-colors " .
"are mutually exclusive\n" .
Expand Down

0 comments on commit 75c9fc6

Please sign in to comment.