Subject: 30.1; `M-x man` errors on macOS 15 after sed(1) RE syntax change
From: Justin Flude <[email-masked]>
To: "[email-masked]" <[email-masked]>
Date: Tue, 22 Apr 2025 19:04:27 +0000
List-Id: <debbugs-submit.debbugs.gnu.org>

Steps to reproduce:-

1. On a macOS 15 computer run `emacs -Q -nw` in a terminal
2. Type the command `M-x man` then enter `ls`
3. A `*Man ls*` buffer appears with this error:-

  sed: 1: "/^[\o001-\o032][\o001-\ ...": RE error: invalid character
  range

The command works fine for the same version of Emacs (30.1) on my macOS
Catalina Macbook.

The issue also occurs when Emacs is run as a GUI from the Finder.  It
affects to my knowledge the latest Emacs distributed by Homebrew and
MacPorts.

Analysis: it appears that recent versions of macOS have changed the way
quoting works in sed(1) regular expressions.  The problem can be
reproduced without Emacs when just running sed(1) in a Bash shell, and
with no environment variables set other than PATH and TERM.

In GNU Emacs 30.1 (build 2, aarch64-apple-darwin24.3.0, NS
appkit-2575.40 Version 15.3.1 (Build 24D70)) of 2025-03-06 built on
pickwick
Windowing system distributor 'Apple', version 10.3.2575
System Description:  macOS 15.4.1

Configured using:
'configure --prefix=/opt/local --disable-silent-rules --without-dbus
--without-gconf --without-libotf --without-m17n-flt --with-libgmp
--with-gnutls --with-xml2 --with-modules --with-sqlite3 --with-webp
--with-native-compilation=aot --infodir /opt/local/share/info/emacs
--disable-gc-mark-trace --with-ns --with-lcms2 --without-harfbuzz
--without-xaw3d --with-imagemagick --with-rsvg --with-tree-sitter
'CFLAGS=-pipe -Os -Wno-attributes
-isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk -arch
arm64' 'CPPFLAGS=-I/opt/local/include
-isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk'
'LDFLAGS=-L/opt/local/lib -Wl,-headerpad_max_install_names -Wl,-no_pie
-Wl,-rpath /opt/local/lib/gcc14 -Wl,-rpath /opt/local/lib
-Wl,-syslibroot,/Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk
-arch arm64''

Configured features:
ACL GIF GLIB GMP GNUTLS IMAGEMAGICK JPEG LCMS2 LIBXML2 MODULES
NATIVE_COMP NOTIFY KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp

Minor modes in effect:
  sly-stickers-shortcut-mode: t
  sly-stickers-mode: t
  sly-trace-dialog-shortcut-mode: t
  sly-autodoc-mode: t
  sly-editing-mode: t
  sly-mode: t
  sly-symbol-completion-mode: t
  server-mode: t
  auto-dark-mode: t
  global-page-break-lines-mode: t
  page-break-lines-mode: t
  display-battery-mode: t
  display-time-mode: t
  paredit-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  minibuffer-regexp-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  hs-minor-mode: t

Load-path shadows:
/opt/local/share/emacs/site-lisp/cmake-mode hides /Users/justin/.emacs.d/elpa/cmake-mode-20250304.1338/cmake-mode
/Users/justin/.emacs.d/elpa/transient-20250418.2149/transient hides /Applications/MacPorts/Emacs.app/Contents/Resources/lisp/transient

Features:
(shadow sort mail-extr tmm emacsbug tabify imenu man wombat-theme
wgsl-mode wgsl-mode-autoloads loaddefs-gen cus-edit cus-start cus-load
lisp-mnt mm-archive url-cache finder-inf pcmpl-git find-dired oc-basic
org-element org-persist org-id org-refile org-element-ast inline
avl-tree ol-eww eww url-queue mm-url ol-rmail ol-mhe ol-irc ol-info
ol-gnus nnselect gnus-art mm-uu mml2015 mm-view mml-smime smime gnutls
dig gnus-sum shr pixel-fill kinsoku url-file svg dom gnus-group
gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail mail-source utf7
nnoo gnus-spec gnus-int gnus-range message sendmail yank-media rfc822
mml mml-sec epa derived epg rfc6068 epg-config mm-decode mm-bodies
mm-encode mailabbrev gmm-utils mailheader gnus-win gnus nnheader
gnus-util mail-utils range wid-edit ol-docview doc-view filenotify
image-mode exif ol-bibtex bibtex ol-bbdb ol-w3m ol-doi org-link-doi
vc-annotate vc pcmpl-unix pcmpl-gnu tar-mode jka-compr misearch
multi-isearch display-line-numbers sly-asdf grep sly-macrostep macrostep
sly-fancy sly-tramp tramp trampver tramp-integration tramp-message
tramp-compat xdg parse-time iso8601 tramp-loaddefs sly-indentation
sly-cl-indent sly-stickers cl-extra pulse color hi-lock sly-trace-dialog
sly-fontifying-fu sly-package-fu sly-scratch sly-fancy-trace
sly-fancy-inspector sly-mrepl sly-autodoc sly-parse network-stream
dired-aux dired dired-loaddefs vc-git diff-mode track-changes
vc-dispatcher sly easy-mmode sly-completion sly-buttons sly-messages
sly-common apropos arc-mode archive-mode pp hyperspec go-mode find-file
ffap comp-run comp-common hideshow server tango-theme auto-dark
page-break-lines battery dbus xml time ob-sqlite ob-sql ob-shell shell
ob-sed ob-screen ob-scheme geiser-impl help-fns radix-tree geiser-custom
geiser-base geiser ob-rust ob-ruby ob-R ob-python python compat ob-perl
ob-org ob-octave ob-makefile ob-lisp ob-latex ob-js ob-java ob-http
ob-http-mode s ob-haskell ob-go ob-gnuplot ob-forth ob-eshell eshell
esh-cmd esh-ext esh-opt esh-proc esh-io esh-arg esh-module
esh-module-loaddefs esh-util files-x ob-dot ob-css ob-calc calc-store
calc-trail calc-ext calc calc-loaddefs rect calc-macs ob-C cc-mode
cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars
cc-defs ob-awk org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro
org-src sh-script treesit executable ob-comint org-pcomplete pcomplete
org-list org-footnote org-faces org-entities time-date noutline outline
ob-emacs-lisp ob-core ob-eval org-version org-cycle org-table ol
org-fold org-fold-core org-keys oc org-loaddefs find-func cal-menu
calendar cal-loaddefs org-compat org-macs format-spec wolfram-mode
cobol-mode robe help-mode url-http url-auth mail-parse rfc2231 rfc2047
rfc2045 mm-util ietf-drums mail-prsvr url-gw nsm puny etags fileloop
generator xref inf-ruby ruby-mode smie flymake-ruby flymake-easy flymake
project compile text-property-search comint ansi-osc ansi-color ring
warnings thingatpt emmet-mode web-mode advice disp-table paredit edmacro
kmacro exec-path-from-shell auto-dark-autoloads basic-mode-autoloads
chess-autoloads cmake-mode-autoloads cobol-mode-autoloads
company-autoloads csv-mode-autoloads dad-joke-autoloads
dockerfile-mode-autoloads emmet-mode-autoloads
exec-path-from-shell-autoloads fireplace-autoloads flycheck-autoloads
flymake-ruby-autoloads flymake-easy-autoloads forth-mode-autoloads
geiser-chez-autoloads geiser-chibi-autoloads geiser-chicken-autoloads
geiser-gambit-autoloads geiser-guile-autoloads geiser-mit-autoloads
geiser-racket-autoloads geiser-autoloads glsl-mode-autoloads
gnu-elpa-keyring-update-autoloads gnuplot-autoloads go-mode-autoloads
graphviz-dot-mode-autoloads groovy-mode-autoloads
impatient-mode-autoloads htmlize-autoloads json-mode-autoloads rx
json-snatcher-autoloads lsp-ui-autoloads lsp-mode-autoloads ht-autoloads
f-autoloads lv-autoloads magit-autoloads pcase markdown-mode-autoloads
minesweeper-autoloads mustache-mode-autoloads nginx-mode-autoloads
ob-go-autoloads ob-http-autoloads ob-rust-autoloads org-roam-autoloads
magit-section-autoloads llama-autoloads emacsql-autoloads dash-autoloads
page-break-lines-autoloads paredit-autoloads pdf-tools-autoloads
protobuf-mode-autoloads restclient-autoloads robe-autoloads
inf-ruby-autoloads rust-mode-autoloads s-autoloads
simple-httpd-autoloads sly-asdf-autoloads popup-autoloads
sly-macrostep-autoloads macrostep-autoloads sly-autoloads
solidity-mode-autoloads spinner-autoloads tablist-autoloads
transient-autoloads web-mode-autoloads info with-editor-autoloads
wolfram-mode-autoloads yaml-mode-autoloads package browse-url url
url-proxy url-privacy url-expand url-methods url-history url-cookie
generate-lisp-file url-domsuf url-util mailcap url-handlers url-parse
auth-source cl-seq eieio eieio-core cl-macs icons password-cache json
subr-x map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs cl-lib
rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook
vc-hooks lisp-float-type elisp-mode mwheel term/ns-win ns-win
ucs-normalize mule-util term/common-win tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu
timer select scroll-bar mouse jit-lock font-lock syntax font-core
term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads kqueue cocoa ns lcms2
multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 755698 1266831) (symbols 48 46982 0)
(strings 32 233125 47890) (string-bytes 1 11129078)
(vectors 16 74739) (vector-slots 8 1637415 155572)
(floats 8 621 1232) (intervals 56 4815 4306) (buffers 992 26))