From dfeb32f6e21cac123f4995bbcbe7e4b4ec81ddb5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?=
Date: Tue, 20 Jan 2026 20:25:26 +0000
Subject: [PATCH] ls: --hyperlink: switch to more standard delimiters
* 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 | 3 +++
src/ls.c | 4 ++--
tests/ls/hyperlink.sh | 4 ++--
3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/NEWS b/NEWS
index 3eb51380e5..b74c19f1ff 100644
--- 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.,
diff --git a/src/ls.c b/src/ls.c
index 102ef4a3f7..75215141fe 100644
--- 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));
}
diff --git a/tests/ls/hyperlink.sh b/tests/ls/hyperlink.sh
index 3fd6c4f240..dc83ea34ab 100755
--- a/tests/ls/hyperlink.sh
+++ b/tests/ls/hyperlink.sh
@@ -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