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 out || framework_failure_ -- 2.47.3