]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
dircolors: consider COLORTERM as well as TERM env vars
authorPádraig Brady <P@draigBrady.com>
Sat, 12 Feb 2022 21:54:07 +0000 (22:54 +0100)
committerPádraig Brady <P@draigBrady.com>
Tue, 15 Feb 2022 17:01:19 +0000 (17:01 +0000)
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.

NEWS
src/dircolors.c
src/dircolors.hin
tests/misc/dircolors.pl

diff --git a/NEWS b/NEWS
index e14501e7786ff7248aa4ea25d638114933167088..ef65b4ab86f0d4d907f40673b600346e1bfa2e98 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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.
index 8bb4abfc4ef10456b0e18a2b6237ceca478db526..5c92299621f6a1c79ca81f6bda97bda62ef554ca 100644 (file)
@@ -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.  */
@@ -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;
@@ -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)
             {
index 0258cc06728694439aaad2d24cfc4a81dd4df50a..6738352013111ce5f46490c5d2609f0571a90f44 100644 (file)
@@ -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*
@@ -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.
index 27fa2c5b6863bb58b312ff7df253d8e58b2b664f..6bb8b7463f960e0ff528cbd06cf823cc8128bd17 100755 (executable)
@@ -42,6 +42,14 @@ my @Tests =
      ['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" .