Subject: bug#79282: 30.1; scheme-mode docstrings not highlighting with font-lock-doc-face

From: Joe <[email-masked]>
Date: Wed, 20 Aug 2025 23:54:37 +0200

---

Dear Emacs Maintainers,

I am writing to report an issue I've observed in scheme-mode,
specifically concerning the highlighting of docstrings. In scheme-mode
(which inherits from lisp-mode), docstrings are currently being
displayed as regular strings, using `font-lock-string-face', instead
of being highlighted with `font-lock-doc-face'.

I expected docstrings in Scheme code, similar to those in Elisp or
Common Lisp modes, should be highlighted distinctly using
`font-lock-doc-face' for better readability and semantic distinction.
I noticed in Elisp and Common Lisp this works perfectly, for all forms
and variants (variables, defmethods, defun, etc.)

The problem is, when defining functions or macros in scheme-mode with
a docstring, the docstring string literal is treated identically to
any other string literal in terms of font locking.

I am a bit of a newbie when it comes to the lower levels of Emacs, and
its modes, but I have looked into the source code of scheme-mode and
it appears to contain the necessary functionality to correctly
identify and highlight docstrings. For instance, I found lines such as
:

(put 'define* 'scheme-doc-string-elt 2)

which seems to properly register docstring elements for font locking.
This suggests that the mechanism for identifying docstrings is in
place, but perhaps the application of font-lock-doc-face isn't
occurring as intended, or there's an interaction issue with
lisp-mode's inheritance.

Example (for illustration and clarity purposes):

(define (my-function arg)
  "This is a docstring for my-function."
  (+ arg 1))

In the example above, the string "This is a docstring for
my-function." now appears with the font-lock-string-face , when it
should instead be using font-lock-doc-face.

I run Emacs on Guix btw.

I would appreciate it if you could investigate this issue. Thank you
for your time and dedication to maintaining the allmighty Emacs.

Best regards,

Josep Bigorra

---

In GNU Emacs 30.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.43,
cairo version 1.18.4)
System Description: Guix System

Configured using:
 'configure
 CONFIG_SHELL=/gnu/store/nnx8iifrj6jfih4sivivq17cf65aa968-bash-minimal-5.2.37/bin/bash
 SHELL=/gnu/store/nnx8iifrj6jfih4sivivq17cf65aa968-bash-minimal-5.2.37/bin/bash
 --prefix=/gnu/store/mx2ca3l10v0vwj0izgrs2sqzpfqrshn9-emacs-pgtk-30.1
 --enable-fast-install --with-pgtk --with-cairo --with-modules
 --with-native-compilation=aot 'CFLAGS=-g -O2
 -Wno-error=incompatible-pointer-types' --disable-build-details'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY
INOTIFY PDUMPER PGTK PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM GTK3 ZLIB

Important settings:
  value of $EMACSLOADPATH: /run/current-system/profile/share/emacs/site-lisp:/gnu/store/mx2ca3l10v0vwj0izgrs2sqzpfqrshn9-emacs-pgtk-30.1/share/emacs/30.1/lisp
  value of $LANG: nl_NL.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Scheme

Minor modes in effect:
  display-fill-column-indicator-mode: t
  smartparens-mode: t
  corfu-popupinfo-mode: t
  corfu-history-mode: t
  global-corfu-mode: t
  corfu-mode: t
  super-save-mode: t
  global-git-commit-mode: t
  server-mode: t
  ultra-scroll-mode: t
  pixel-scroll-precision-mode: t
  nerd-icons-completion-mode: t
  marginalia-mode: t
  vertico-mode: t
  keycast-mode: t
  spacious-padding-mode: t
  pulsar-global-mode: t
  pulsar-mode: t
  emms-mode-line-mode: t
  emms-playing-time-display-mode: t
  emms-playing-time-mode: t
  elmacro-mode: t
  diff-hl-margin-local-mode: t
  diff-hl-margin-mode: t
  global-diff-hl-mode: t
  diff-hl-mode: t
  arei-mode: t
  fancy-compilation-mode: t
  sly-symbol-completion-mode: t
  jinx-mode: t
  erc-track-mode: t
  erc-spelling-mode: t
  erc-ring-mode: t
  erc-notifications-mode: t
  erc-netsplit-mode: t
  erc-menu-mode: t
  erc-match-mode: t
  erc-list-mode: t
  erc-irccontrols-mode: t
  erc-move-to-prompt-mode: t
  erc-readonly-mode: t
  erc-imenu-mode: t
  erc-button-mode: t
  erc-fill-mode: t
  erc-stamp-mode: t
  erc-autojoin-mode: t
  erc-services-mode: t
  erc-networks-mode: t
  global-hl-line-mode: t
  recentf-mode: t
  windmove-mode: t
  delete-selection-mode: t
  global-auto-revert-mode: t
  save-place-mode: t
  savehist-mode: t
  which-key-mode: t
  elpaca-use-package-mode: t
  override-global-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  global-prettify-symbols-mode: t
  prettify-symbols-mode: t
  file-name-shadow-mode: t
  context-menu-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  minibuffer-regexp-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/home/joe/.emacs.d/elpaca/builds/compat/compat hides /gnu/store/y118fz0hp27mkyzmgpg4p5jv98n5ibdh-emacs-compat-30.0.2.0/share/emacs/site-lisp/compat-30.0.2.0/compat
/home/joe/.emacs.d/elpaca/builds/compat/compat-macs hides /gnu/store/y118fz0hp27mkyzmgpg4p5jv98n5ibdh-emacs-compat-30.0.2.0/share/emacs/site-lisp/compat-30.0.2.0/compat-macs
/home/joe/.emacs.d/elpaca/builds/compat/compat-autoloads hides /gnu/store/y118fz0hp27mkyzmgpg4p5jv98n5ibdh-emacs-compat-30.0.2.0/share/emacs/site-lisp/compat-30.0.2.0/compat-autoloads
/home/joe/.emacs.d/elpaca/builds/compat/compat-30 hides /gnu/store/y118fz0hp27mkyzmgpg4p5jv98n5ibdh-emacs-compat-30.0.2.0/share/emacs/site-lisp/compat-30.0.2.0/compat-30
/home/joe/.emacs.d/elpaca/builds/compat/compat-29 hides /gnu/store/y118fz0hp27mkyzmgpg4p5jv98n5ibdh-emacs-compat-30.0.2.0/share/emacs/site-lisp/compat-30.0.2.0/compat-29
/home/joe/.emacs.d/elpaca/builds/compat/compat-28 hides /gnu/store/y118fz0hp27mkyzmgpg4p5jv98n5ibdh-emacs-compat-30.0.2.0/share/emacs/site-lisp/compat-30.0.2.0/compat-28
/home/joe/.emacs.d/elpaca/builds/compat/compat-27 hides /gnu/store/y118fz0hp27mkyzmgpg4p5jv98n5ibdh-emacs-compat-30.0.2.0/share/emacs/site-lisp/compat-30.0.2.0/compat-27
/home/joe/.emacs.d/elpaca/builds/compat/compat-26 hides /gnu/store/y118fz0hp27mkyzmgpg4p5jv98n5ibdh-emacs-compat-30.0.2.0/share/emacs/site-lisp/compat-30.0.2.0/compat-26
/home/joe/.emacs.d/elpaca/builds/compat/compat-25 hides /gnu/store/y118fz0hp27mkyzmgpg4p5jv98n5ibdh-emacs-compat-30.0.2.0/share/emacs/site-lisp/compat-30.0.2.0/compat-25
/home/joe/.emacs.d/elpaca/builds/transient/transient hides /gnu/store/mx2ca3l10v0vwj0izgrs2sqzpfqrshn9-emacs-pgtk-30.1/share/emacs/30.1/lisp/transient
/home/joe/.emacs.d/elpaca/builds/ef-themes/theme-loaddefs hides /gnu/store/mx2ca3l10v0vwj0izgrs2sqzpfqrshn9-emacs-pgtk-30.1/share/emacs/30.1/lisp/theme-loaddefs
/home/joe/.emacs.d/elpaca/builds/compat/compat hides /gnu/store/mx2ca3l10v0vwj0izgrs2sqzpfqrshn9-emacs-pgtk-30.1/share/emacs/30.1/lisp/emacs-lisp/compat

Features:
(shadow mail-extr emacsbug tramp-cmds tempel bug-reference magit-extras
cl-print embark-org embark-consult embark dabbrev cape eglot
external-completion jsonrpc ert debug backtrace vertico-sort make-mode
org-indent org-auto-tangle ox-odt rng-loc rng-uri rng-parse rng-match
rng-dt rng-util rng-pttrn nxml-parse nxml-ns nxml-enc xmltok nxml-util
ox-latex ox-icalendar org-agenda ox-html table ox-ascii ox-publish ox
org-attach async 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
gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail
mail-source utf7 nnoo gnus-spec gnus-int gnus-range gnus-win gnus
nnheader range ol-docview doc-view jka-compr image-mode exif ol-bibtex
bibtex ol-bbdb ol-w3m ol-doi org-link-doi geiser-mode geiser-xref
geiser-compile mule-util consult magit-bookmark bookmark descr-text
dired-subtree vc-hg vc-git vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs
nerd-icons-dired disp-table ef-winter-theme ef-tritanopia-dark-theme
ef-trio-dark-theme ef-symbiosis-theme ef-rosa-theme ef-owl-theme
ef-night-theme ef-melissa-dark-theme ef-maris-dark-theme
ef-elea-dark-theme ef-duo-dark-theme ef-dream-theme
ef-deuteranopia-dark-theme ef-dark-theme ef-cherie-theme ef-bio-theme
ef-autumn-theme ef-tritanopia-light-theme ef-trio-light-theme
ef-summer-theme ef-spring-theme ef-reverie-theme ef-melissa-light-theme
ef-maris-light-theme ef-light-theme ef-kassio-theme ef-frost-theme
ef-elea-light-theme ef-eagle-theme ef-duo-light-theme
ef-deuteranopia-light-theme ef-day-theme ef-cyprus-theme
ef-arbutus-theme time welkomscherm aggressive-indent checkdoc flymake
display-fill-column-indicator smartparens-config smartparens-javascript
smartparens-rust smartparens-org smartparens-text smartparens-go
smartparens-c smartparens advice loadhist corfu-popupinfo corfu-history
kind-icon corfu move-text orderless mermaid-mode rainbow-mode super-save
magit-submodule magit-blame magit-stash magit-reflog magit-bisect
magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit
magit-sequence magit-notes magit-worktree magit-tag magit-merge
magit-branch magit-reset magit-files magit-refs magit-status magit
magit-repos magit-apply magit-wip magit-log which-func magit-diff
smerge-mode diff git-commit log-edit message sendmail yank-media rfc822
mml mml-sec epa gnus-util mm-decode mailabbrev gmm-utils add-log
magit-core magit-autorevert magit-margin magit-transient magit-process
with-editor server magit-mode benchmark magit-git magit-base
magit-section cursor-sensor crm llama ultra-scroll pixel-scroll cua-base
nerd-icons-completion marginalia vertico modusregel keycast svg-lib svg
spacious-padding nerd-icons nerd-icons-faces nerd-icons-data
nerd-icons-data-mdicon nerd-icons-data-flicon nerd-icons-data-codicon
nerd-icons-data-devicon nerd-icons-data-sucicon nerd-icons-data-wicon
nerd-icons-data-faicon nerd-icons-data-powerline nerd-icons-data-octicon
nerd-icons-data-pomicon nerd-icons-data-ipsicon tekengrootte olivetti
face-remap pulsar dracula-theme gruvbox-theme gruvbox autothemer
solarized-theme solarized solarized-faces ef-themes ripgrep grep
ob-mermaid ob-http ob-http-mode org-present emms-idapi-browser
emms-idapi emms-idapi-musicbrainz mm-bodies mm-encode
emms-librefm-stream emms-librefm-scrobbler emms-playlist-limit emms-i18n
emms-history emms-score emms-stream-info emms-metaplaylist-mode
emms-bookmarks emms-cue emms-mode-line-icon emms-player-xine
emms-player-mpd emms-lyrics emms-url emms-streams emms-show-all
emms-tag-editor emms-tag-tracktag emms-mark emms-mode-line
emms-info-native emms-info-native-spc emms-info-native-mp3
emms-info-native-ogg emms-info-native-opus emms-info-native-flac
emms-info-native-vorbis bindat emms-info-exiftool emms-info-tinytag
emms-info-metaflac emms-info-opusinfo emms-info-ogginfo
emms-info-mp3info emms-player-vlc emms-player-mplayer emms-mpris
emms-browser emms-filters sort emms-playlist-sort emms-last-played
emms-volume emms-volume-mpv emms-player-mpv emms-playing-time
emms-player-simple emms-volume-sndioctl emms-volume-mixerctl
emms-volume-pulse emms-volume-amixer emms-playlist-mode
emms-source-playlist emms-source-file locate emms-cache emms-info
emms-later-do emms-setup emms emms-compat smudge smudge-connect
smudge-dbus smudge-remote smudge-device-select smudge-playlist
smudge-track smudge-controller smudge-api oauth2 plstore epg rfc6068
epg-config simple-httpd fretboard hi-lock pandoc-mode pandoc-mode-utils
hydra lv guix speed-type dom url-http url-auth mail-parse rfc2231
rfc2047 rfc2045 mm-util ietf-drums mail-prsvr url-gw nsm puny
gptel-gemini gptel gptel-openai git-riddance prodigy elmacro
page-break-lines f go-mode find-file ffap dired-open-with
dired-hacks-utils dired-aux swagg s org ob ob-tangle ob-ref ob-lob
ob-table ob-exp org-macro org-src sh-script smie executable ob-comint
org-pcomplete org-list org-footnote org-faces org-entities noutline
outline org-version ob-emacs-lisp ob-core ob-eval org-cycle org-table ol
org-fold org-fold-core org-keys oc org-loaddefs cal-menu calendar
cal-loaddefs org-compat org-macs yaml dash json-mode json-snatcher js
c-ts-common treesit cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles
cc-align cc-engine cc-vars cc-defs request mailheader mail-utils
diff-hl-margin diff-hl-dired dired dired-loaddefs diff-hl log-view
pcvs-util vc-dir ewoc diff-mode track-changes geiser-guile tramp
trampver tramp-integration files-x tramp-message tramp-compat xdg shell
parse-time iso8601 tramp-loaddefs info-look transient geiser-debug
geiser-repl geiser-image geiser-capf geiser-doc geiser-menu
geiser-autodoc geiser-edit geiser-completion geiser-eval
geiser-connection tq geiser-syntax geiser-impl help-fns radix-tree
geiser-log geiser-popup view geiser-custom geiser-base geiser arei
scheme arei-meta-commands arei-logging arei-macroexpansion arei-module
arei-evaluation arei-debugger arei-stack arei-ui eros pulse color
arei-spinner arei-completion arei-xref arei-eldoc arei-syntax
arei-client sesman vc vc-dispatcher arei-nrepl queue package-lint
let-alist finder finder-inf find-func lisp-mnt package url-handlers
inheritenv rust-utils rust-prog-mode rust-mode rust-playpen rust-cargo
rust-common rust-rustfmt rust-compile fancy-compilation compile
text-property-search cus-start sly info sly-completion derived
sly-buttons sly-messages sly-common apropos etags fileloop generator
xref arc-mode archive-mode hyperspec thingatpt cape-autoloads
helpful-autoloads elisp-refs-autoloads corfu-autoloads
move-text-autoloads orderless-autoloads mermaid-mode-autoloads
rainbow-mode-autoloads super-save-autoloads tempel-autoloads
magit-autoloads pcase with-editor-autoloads embark-consult-autoloads
embark-autoloads ultra-scroll-autoloads marginalia-autoloads
vertico-autoloads keycast-autoloads modusregel-autoloads
kind-icon-autoloads svg-lib-autoloads spacious-padding-autoloads
nerd-icons-completion-autoloads tekengrootte-autoloads
olivetti-autoloads pulsar-autoloads dracula-theme-autoloads
gruvbox-theme-autoloads autothemer-autoloads everforest-autoloads
everforest-theme solarized-theme-autoloads ef-themes-autoloads
deadgrep-autoloads spinner-autoloads ripgrep-autoloads
ob-mermaid-autoloads ob-http-autoloads org-auto-tangle-autoloads
async-autoloads org-present-autoloads org-roam-ui-autoloads
org-roam-autoloads emacsql-autoloads magit-section-autoloads
llama-autoloads websocket-autoloads emms-autoloads smudge-autoloads
simple-httpd-autoloads oauth2-autoloads fretboard-autoloads
pandoc-mode-autoloads hydra-autoloads lv-autoloads guix-autoloads
bui-autoloads edit-indirect-autoloads speed-type-autoloads
gptel-autoloads dagboek-autoloads git-riddance-autoloads
prodigy-autoloads osm-autoloads elmacro-autoloads f-autoloads
go-mode-autoloads nerd-icons-dired-autoloads nerd-icons-autoloads
dired-open-with-autoloads dired-subtree-autoloads
dired-hacks-utils-autoloads swagg-autoloads yaml-autoloads
json-mode-autoloads json-snatcher-autoloads flymake-collection-autoloads
request-autoloads markdown-mode-autoloads diff-hl-autoloads
fancy-compilation-autoloads geiser-guile-autoloads geiser-autoloads
arei-autoloads eros-autoloads sesman-autoloads queue-autoloads
docker-autoloads aio-autoloads s-autoloads tablist-autoloads
transient-autoloads aggressive-indent-autoloads direnv-autoloads
smartparens-autoloads yaml-mode-autoloads toml-mode-autoloads
nix-ts-mode-autoloads typescript-mode-autoloads lua-mode-autoloads
scala-ts-mode-autoloads haskell-mode-autoloads python-black-autoloads
dash-autoloads reformatter-autoloads package-lint-autoloads
inheritenv-autoloads rust-mode-autoloads welkomscherm-autoloads
page-break-lines-autoloads consult-autoloads sly-autoloads sss/ui
sss/theme sss/shell sss/search sss/org sss/music sss/misc jinx sss/maps
sss/mail sss/macros sss/libs sss/go sss/erc erc-track erc-spelling
flyspell ispell erc-ring erc-desktop-notifications notifications dbus
xml erc-netsplit erc-menu erc-match erc-list erc-goodies erc-imenu imenu
erc-pcomplete time-date pcomplete comint ansi-osc ansi-color ring
erc-button browse-url erc-fill erc-stamp erc-join erc-services erc
format-spec erc-backend erc-networks erc-common erc-compat compat
erc-loaddefs sss/emacs-self hl-line recentf tree-widget comp comp-cstr
warnings comp-run comp-common rx windmove delsel autorevert filenotify
saveplace savehist which-key project sss/eglot edmacro kmacro sss/dired
sss/dev sss/dashboard elpaca-menu-elpa cus-edit pp cus-load wid-edit
sss/consult cl-extra help-mode sss/common-lisp elpaca-menu-melpa
elpaca-menu-org sss/sss elpaca-use-package use-package
use-package-ensure use-package-delight use-package-diminish
use-package-bind-key bind-key easy-mmode use-package-core
elpaca-use-package-autoloads elpaca-log elpaca-ui url url-proxy
url-privacy url-expand url-methods url-history url-cookie
generate-lisp-file url-domsuf url-util url-parse auth-source eieio
eieio-core cl-macs icons password-cache json subr-x map byte-opt gv
bytecomp byte-compile url-vars mailcap cl-seq elpaca elpaca-process
cl-loaddefs cl-lib elpaca-autoloads compat-autoloads jinx-autoloads
guix-emacs rmc iso-transl tooltip cconv eldoc paren electric uniquify
ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/pgtk-win
pgtk-win term/common-win touch-screen pgtk-dnd 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 dbusbind inotify
dynamic-setting system-font-setting font-render-setting cairo gtk pgtk
lcms2 multi-tty move-toolbar make-network-process native-compile emacs)

Memory information:
((conses 16 1963766 1295124) (symbols 48 104934 3) (strings 32 500698 60836)
 (string-bytes 1 12512495) (vectors 16 119041) (vector-slots 8 2150724 889033)
 (floats 8 9211 1588) (intervals 56 6836 5804) (buffers 992 42))