]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
ls: --hyperlink: switch to more standard delimiters
authorPádraig Brady <P@draigBrady.com>
Tue, 20 Jan 2026 20:25:26 +0000 (20:25 +0000)
committerPádraig Brady <P@draigBrady.com>
Wed, 21 Jan 2026 14:05:48 +0000 (14:05 +0000)
* src/ls.c (quote_name): Use ST (ESC \) rather than BEL,
as that's the only terminator mentioned in at least
ECMA-48, DEC STD 070, and EK-VT520-RM.
* NEWS: Mention the change in behavior.
* tests/ls/hyperlink.sh: Adjust accordingly.

Suggested by Egmont Koblinger.

NEWS
src/ls.c
tests/ls/hyperlink.sh

diff --git a/NEWS b/NEWS
index 3eb51380e5c0d618c90ae3241aeb681e2d07075e..b74c19f1ff9f8b5351afed12e1555469fdb84706 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -71,6 +71,9 @@ GNU coreutils NEWS                                    -*- outline -*-
   'fmt' -w,--width no longer includes '\n' in the width of a line.
   I.e., the specified width is interpreted to be an _inclusive_ maximum.
 
+  'ls --hyperlink' now uses more standard format hyperlinks.
+  'ESC\' (ST) is now used as a delimiter, instead of '\a' (BEL).
+
   'ptx' -t is no longer a no-op, and now sets the default width to 100 columns.
 
   'timeout' now honors ignored signals and will not propagate them.  E.g.,
index 102ef4a3f7702343ac915b34d996d993324881a0..75215141fe610b6b48c97d853abc5e8e8cd31cf0 100644 (file)
--- a/src/ls.c
+++ b/src/ls.c
@@ -4723,7 +4723,7 @@ quote_name (char const *name, struct quoting_options const *options,
          For example since ls is outputting a dense block of URIs
          it would be best to not underline by default, and only
          do so upon hover etc.  */
-      printf ("\033]8;;file://%s%s%s\a", h, *n == '/' ? "" : "/", n);
+      printf ("\033]8;;file://%s%s%s\033\\", h, *n == '/' ? "" : "/", n);
       free (h);
       free (n);
     }
@@ -4740,7 +4740,7 @@ quote_name (char const *name, struct quoting_options const *options,
 
   if (absolute_name)
     {
-      fputs ("\033]8;;\a", stdout);
+      fputs ("\033]8;;\033\\", stdout);
       if (skip_quotes)
         putchar (*(buf + len - 1));
     }
index 3fd6c4f240c1bea920ea6461e5bb39106b7f5331..dc83ea34ab47470c0385fba5bd8a9bb95a35dd10 100755 (executable)
@@ -31,7 +31,7 @@ encode() {
 ls_encoded() {
   ef=$(encode "$1")
   echo "$ef" | grep 'dir$' >/dev/null && dir=: || dir=''
-  printf '\033]8;;file:///%s\a%s\033]8;;\a%s\n' \
+  printf '\033]8;;file:///%s\033\\%s\033]8;;\033\\%s\n' \
     "$ef" "$1" "$dir"
 }
 
@@ -51,7 +51,7 @@ for f in 'an#chor' 'back\slash' 'col:on' 'encoded%3Fquestion' \
 done
 )
 ln -s testdir testdirl || framework_failure_
-(cat exp.t && printf '\n' && sed 's/[^\/]testdir/&l/' exp.t) > exp \
+(cat exp.t && printf '\n' && sed 's|[^/]testdir|&l|' exp.t) > exp \
   || framework_failure_
 ls --hyper testdir testdirl >out.t || fail=1
 strip_host_and_path <out.t >out || framework_failure_