unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#67393: 29.1; Slow to open file if autosave exists
@ 2023-11-23  0:28 materus213
  2023-11-23  6:51 ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: materus213 @ 2023-11-23  0:28 UTC (permalink / raw)
  To: 67393



As in topic, emacs normally open files in instant, but when autosave 
(#filename#) exists, it takes about 1 sec to open file.
It doesn't seem to be config problem since same happens with -Q flag.

In GNU Emacs 29.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.38,
cairo version 1.18.0)
Windowing system distributor 'The X.Org Foundation', version 11.0.12302002
System Description: NixOS 23.11 (Tapir)

Configured using:
'configure
--prefix=/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1
--disable-build-details --with-modules --with-x-toolkit=gtk3 --with-xft
--with-cairo --with-native-compilation --with-imagemagick
--with-tree-sitter --with-xinput2 --with-xwidgets'

Configured features:
CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ
IMAGEMAGICK JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2
M17N_FLT MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP
SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XDBE
XIM XINPUT2 XPM XWIDGETS GTK3 ZLIB

Important settings:
value of $EMACSLOADPATH:
value of $EMACSNATIVELOADPATH:
value of $LANG: pl_PL.UTF-8
value of $XMODIFIERS: @im=fcitx
locale-coding-system: utf-8-unix

Major mode: Dashboard

Minor modes in effect:
delete-selection-mode: t
pixel-scroll-precision-mode: t
cua-mode: t
minions-mode: t
recentf-mode: t
elcord-mode: t
telephone-line-mode: t
tooltip-mode: t
global-eldoc-mode: t
show-paren-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
buffer-read-only: t
line-number-mode: t
indent-tabs-mode: t
transient-mark-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t

Load-path shadows:
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/site-start 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/site-lisp/site-start
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/transient-20231121.1154/transient 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/transient
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/use-package-20230426.2324/use-package-core 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/use-package/use-package-core
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/bind-key-20230203.2004/bind-key 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/use-package/bind-key
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/use-package-20230426.2324/use-package-ensure 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/use-package/use-package-ensure
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/use-package-20230426.2324/use-package 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/use-package/use-package
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/use-package-20230426.2324/use-package-bind-key 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/use-package/use-package-bind-key
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/use-package-20230426.2324/use-package-lint 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/use-package/use-package-lint
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/use-package-20230426.2324/use-package-jump 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/use-package/use-package-jump
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/use-package-20230426.2324/use-package-delight 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/use-package/use-package-delight
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/use-package-20230426.2324/use-package-diminish 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/use-package/use-package-diminish
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-agenda 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-agenda
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-table 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-table
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-odt 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-odt
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-latex 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-latex
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-html 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-html
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-clock 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-clock
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-ascii 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-ascii
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-list 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-list
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-publish 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-publish
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-icalendar 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-icalendar
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-lint 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-lint
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-man 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-man
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-md 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-md
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-beamer 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-beamer
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-org 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-org
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-persist 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-persist
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-koma-letter 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-koma-letter
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-core 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-core
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-mobile 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-mobile
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-fold-core 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-fold-core
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-colview 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-colview
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-plot 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-plot
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-src 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-src
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-capture 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-capture
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-refile 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-refile
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-mouse 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-mouse
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-macs 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-macs
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-timer 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-timer
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-protocol 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-protocol
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-num 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-num
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-tempo 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-tempo
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-pcomplete 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-pcomplete
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-id 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-id
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-habit 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-habit
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-indent 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-indent
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-footnote 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-footnote
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-inlinetask 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-inlinetask
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-feed 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-feed
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-compat 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-compat
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-fortran 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-fortran
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-datetree 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-datetree
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-attach 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-attach
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-goto 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-goto
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-C 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-C
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-archive 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-archive
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-fold 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-fold
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-cycle 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-cycle
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-keys 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-keys
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-ctags 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-ctags
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-loaddefs 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-loaddefs
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-attach-git 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-attach-git
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-entities 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-entities
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-duration 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-duration
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-gnus 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-gnus
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-faces 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-faces
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-crypt 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-crypt
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-bibtex 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-bibtex
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-tangle 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-tangle
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/oc-basic 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/oc-basic
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-eww 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-eww
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/oc-csl 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/oc-csl
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-sql 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-sql
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-w3m 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-w3m
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-irc 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-irc
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-info 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-info
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-mhe 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-mhe
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-bbdb 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-bbdb
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-rmail 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-rmail
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-man 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-man
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/oc-biblatex 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/oc-biblatex
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-shell 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-shell
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-doi 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-doi
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-eshell 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-eshell
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol-docview 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol-docview
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-python 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-python
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/oc-natbib 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/oc-natbib
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-ruby 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-ruby
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-sqlite 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-sqlite
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-table 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-table
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/oc-bibtex 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/oc-bibtex
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-screen 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-screen
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-scheme 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-scheme
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-sed 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-sed
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-ref 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-ref
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-sass 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-sass
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-processing 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-processing
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-plantuml 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-plantuml
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-lua 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-lua
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-perl 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-perl
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-octave 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-octave
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-julia 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-julia
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-java 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-java
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-haskell 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-haskell
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-lob 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-lob
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-ocaml 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-ocaml
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-gnuplot 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-gnuplot
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-latex 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-latex
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-lilypond 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-lilypond
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-maxima 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-maxima
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-org 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-org
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-js 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-js
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-lisp 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-lisp
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-makefile 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-makefile
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-matlab 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-matlab
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-exp 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-exp
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-groovy 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-groovy
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-R 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-R
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-clojure 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-clojure
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-forth 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-forth
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-eval 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-eval
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-comint 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-comint
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-eshell 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-eshell
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-dot 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-dot
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-emacs-lisp 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-emacs-lisp
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-ditaa 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-ditaa
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-awk 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-awk
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-css 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-css
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ob-calc 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ob-calc
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-element 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-element
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ox-texinfo 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ox-texinfo
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/oc 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/oc
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/ol 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/ol
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-macro 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-macro
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/org-9.6.12/org-version 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/org/org-version
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/cl-generic-0.3/cl-generic 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/emacs-lisp/cl-generic
/nix/store/d8q5qq5h3sc4pykzwmsppd6jfd8g9cfy-emacs-packages-deps/share/emacs/site-lisp/elpa/eldoc-1.14.0/eldoc 
hides 
/nix/store/03gml4425bb8x4nnlhlwrs7pva3a156y-emacs-gtk3-29.1/share/emacs/29.1/lisp/emacs-lisp/eldoc

Features:
(shadow sort mail-extr emacsbug message yank-media puny dired
dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config
gnus-util mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev
gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util
mail-prsvr mail-utils comp comp-cstr warnings finder-inf
centaur-tabs-autoloads clipetty-autoloads cmake-mode-autoloads
company-autoloads corfu-autoloads d-mode-autoloads dashboard-autoloads
doom-themes-autoloads elcord-autoloads helm-autoloads
helm-core-autoloads async-autoloads json-mode-autoloads
json-snatcher-autoloads load-relative-autoloads lsp-haskell-autoloads
haskell-mode-autoloads lsp-java-autoloads dap-mode-autoloads
lsp-docker-autoloads bui-autoloads lsp-jedi-autoloads
lsp-treemacs-autoloads lsp-ui-autoloads lsp-mode-autoloads
eldoc-autoloads f-autoloads markdown-mode-autoloads minimap-autoloads
minions-autoloads moe-theme-autoloads multiple-cursors-autoloads
nerd-icons-completion-autoloads nix-mode-autoloads
org-rainbow-tags-autoloads org-review-autoloads org-roam-ui-autoloads
org-roam-autoloads emacsql-autoloads org-autoloads persp-mode-autoloads
popup-autoloads powerline-autoloads rainbow-delimiters-autoloads
request-autoloads simple-httpd-autoloads spinner-autoloads
telephone-line-autoloads tree-edit-autoloads reazon-autoloads
treemacs-icons-dired-autoloads treemacs-magit-autoloads magit-autoloads
pcase magit-section-autoloads git-commit-autoloads transient-autoloads
treemacs-nerd-icons-autoloads nerd-icons-autoloads
treemacs-perspective-autoloads perspective-autoloads
treemacs-projectile-autoloads treemacs-autoloads cfrs-autoloads
posframe-autoloads ht-autoloads hydra-autoloads lv-autoloads
pfuture-autoloads ace-window-autoloads avy-autoloads s-autoloads
dash-autoloads projectile-autoloads use-package-autoloads
bind-key-autoloads vertico-autoloads vterm-autoloads websocket-autoloads
wfnames-autoloads with-editor-autoloads info compat-autoloads
yaml-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 cl-extra help-mode org-agenda org-element
org-persist xdg org-id avl-tree generator org-refile org ob ob-tangle
ob-ref ob-lob ob-table ob-exp org-macro org-src ob-comint org-pcomplete
pcomplete comint ansi-osc ansi-color org-list org-footnote org-faces
org-entities time-date noutline outline icons ob-emacs-lisp ob-core
ob-eval org-cycle org-table org-keys oc org-loaddefs find-func cal-menu
calendar cal-loaddefs ol rx org-fold org-fold-core org-compat
org-version org-macs format-spec bookmark text-property-search pp time
delsel pixel-scroll cua-base ring doom-horizon-theme minions compat
dashboard dashboard-widgets recentf tree-widget wid-edit ffap thingatpt
url-parse auth-source password-cache url-vars elcord json map bindat
telephone-line telephone-line-segments telephone-line-separators
telephone-line-utils cl-seq subr-x eieio byte-opt bytecomp byte-compile
eieio-core cl-macs gv color doom-themes doom-themes-base cl-loaddefs
cl-lib rmc iso-transl tooltip cconv eldoc paren electric uniquify
ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win
term/common-win x-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 xwidget-internal dbusbind inotify lcms2 dynamic-setting
system-font-setting font-render-setting cairo move-toolbar gtk x-toolkit
xinput2 x multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 280735 281598)
(symbols 48 19971 39)
(strings 32 65361 34738)
(string-bytes 1 2460971)
(vectors 16 35285)
(vector-slots 8 647471 362628)
(floats 8 494 1457)
(intervals 56 445 300)
(buffers 984 14))






^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-11-23  0:28 bug#67393: 29.1; Slow to open file if autosave exists materus213
@ 2023-11-23  6:51 ` Eli Zaretskii
  2023-12-22 14:56   ` Stefan Kangas
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-11-23  6:51 UTC (permalink / raw)
  To: materus213; +Cc: 67393

tags 67393 notabug
thanks

> Date: Thu, 23 Nov 2023 01:28:13 +0100
> From: materus213 <materus213@gmail.com>
> 
> As in topic, emacs normally open files in instant, but when autosave 
> (#filename#) exists, it takes about 1 sec to open file.
> It doesn't seem to be config problem since same happens with -Q flag.

This is a feature: we let the user see the message and wait for 1 sec
after showing it, to make sure this particular message is not
immediately replaced by some others.  From after-find-file:

      (when (and warn msg)
	(message "%s" msg)
	(or not-serious (sit-for 1 t))))
                        ^^^^^^^^^^^^^
(The value of not-serious is nil in this case.)

This is not a bug.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-11-23  6:51 ` Eli Zaretskii
@ 2023-12-22 14:56   ` Stefan Kangas
  2023-12-23 14:34     ` Ihor Radchenko
  0 siblings, 1 reply; 29+ messages in thread
From: Stefan Kangas @ 2023-12-22 14:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, 67393-done

Eli Zaretskii <eliz@gnu.org> writes:

> tags 67393 notabug
> thanks
>
>> Date: Thu, 23 Nov 2023 01:28:13 +0100
>> From: materus213 <materus213@gmail.com>
>>
>> As in topic, emacs normally open files in instant, but when autosave
>> (#filename#) exists, it takes about 1 sec to open file.
>> It doesn't seem to be config problem since same happens with -Q flag.
>
> This is a feature: we let the user see the message and wait for 1 sec
> after showing it, to make sure this particular message is not
> immediately replaced by some others.  From after-find-file:
>
>       (when (and warn msg)
> 	(message "%s" msg)
> 	(or not-serious (sit-for 1 t))))
>                         ^^^^^^^^^^^^^
> (The value of not-serious is nil in this case.)
>
> This is not a bug.

I'm therefore closing this bug report.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-22 14:56   ` Stefan Kangas
@ 2023-12-23 14:34     ` Ihor Radchenko
  2023-12-23 17:23       ` Juri Linkov
  0 siblings, 1 reply; 29+ messages in thread
From: Ihor Radchenko @ 2023-12-23 14:34 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: materus213, Eli Zaretskii, 67393-done

Stefan Kangas <stefankangas@gmail.com> writes:

>> This is a feature: we let the user see the message and wait for 1 sec
>> after showing it, to make sure this particular message is not
>> immediately replaced by some others.  From after-find-file:
>>
>>       (when (and warn msg)
>> 	(message "%s" msg)
>> 	(or not-serious (sit-for 1 t))))
>>                         ^^^^^^^^^^^^^
>> (The value of not-serious is nil in this case.)
>>
>> This is not a bug.
>
> I'm therefore closing this bug report.

This is indeed not a bug, but I am wondering if it would be better to
utilize `set-multi-message' somehow. We are certainly able to display
multiple recent messages in the echo area. Then, why not allow to keep
more important ones visible for a time period without blocking?

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-23 14:34     ` Ihor Radchenko
@ 2023-12-23 17:23       ` Juri Linkov
  2023-12-23 18:05         ` Ihor Radchenko
  0 siblings, 1 reply; 29+ messages in thread
From: Juri Linkov @ 2023-12-23 17:23 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: materus213, Eli Zaretskii, 67393, Stefan Kangas

>>> This is a feature: we let the user see the message and wait for 1 sec
>>> after showing it, to make sure this particular message is not
>>> immediately replaced by some others.  From after-find-file:
>>>
>>>       (when (and warn msg)
>>> 	(message "%s" msg)
>>> 	(or not-serious (sit-for 1 t))))
>>>                         ^^^^^^^^^^^^^
>>> (The value of not-serious is nil in this case.)
>>>
>>> This is not a bug.
>>
>> I'm therefore closing this bug report.
>
> This is indeed not a bug, but I am wondering if it would be better to
> utilize `set-multi-message' somehow. We are certainly able to display
> multiple recent messages in the echo area. Then, why not allow to keep
> more important ones visible for a time period without blocking?

It's not easy to temporarily enable `set-multi-message',
since it's not clear at what moment to disable it afterwards.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-23 17:23       ` Juri Linkov
@ 2023-12-23 18:05         ` Ihor Radchenko
  2023-12-24 17:34           ` Juri Linkov
  0 siblings, 1 reply; 29+ messages in thread
From: Ihor Radchenko @ 2023-12-23 18:05 UTC (permalink / raw)
  To: Juri Linkov; +Cc: materus213, Eli Zaretskii, 67393, Stefan Kangas

Juri Linkov <juri@linkov.net> writes:

>> This is indeed not a bug, but I am wondering if it would be better to
>> utilize `set-multi-message' somehow. We are certainly able to display
>> multiple recent messages in the echo area. Then, why not allow to keep
>> more important ones visible for a time period without blocking?
>
> It's not easy to temporarily enable `set-multi-message',
> since it's not clear at what moment to disable it afterwards.

What I meant is to change the default `set-message-function' in such a
way that it displays "important" messages for a custom time period, in
addition to the last message.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-23 18:05         ` Ihor Radchenko
@ 2023-12-24 17:34           ` Juri Linkov
  2023-12-24 18:39             ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Juri Linkov @ 2023-12-24 17:34 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: materus213, Eli Zaretskii, 67393, Stefan Kangas

>>> This is indeed not a bug, but I am wondering if it would be better to
>>> utilize `set-multi-message' somehow. We are certainly able to display
>>> multiple recent messages in the echo area. Then, why not allow to keep
>>> more important ones visible for a time period without blocking?
>>
>> It's not easy to temporarily enable `set-multi-message',
>> since it's not clear at what moment to disable it afterwards.
>
> What I meant is to change the default `set-message-function' in such a
> way that it displays "important" messages for a custom time period, in
> addition to the last message.

I agree.  The most annoying delay is in 'ispell-parse-output':

    (ding) ; error message from ispell!
    (message "Ispell error: %s" output)
    (sit-for 5)

So I need to waste 5 seconds several times during spell-checking.

It would be nicer to prepend this error message to any last displayed
message during these 5 seconds.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-24 17:34           ` Juri Linkov
@ 2023-12-24 18:39             ` Eli Zaretskii
  2023-12-24 19:03               ` Ihor Radchenko
  2023-12-27 17:20               ` Juri Linkov
  0 siblings, 2 replies; 29+ messages in thread
From: Eli Zaretskii @ 2023-12-24 18:39 UTC (permalink / raw)
  To: Juri Linkov; +Cc: materus213, yantar92, 67393, stefankangas

> From: Juri Linkov <juri@linkov.net>
> Cc: Stefan Kangas <stefankangas@gmail.com>,  materus213
>  <materus213@gmail.com>,  Eli Zaretskii <eliz@gnu.org>,
>   67393@debbugs.gnu.org
> Date: Sun, 24 Dec 2023 19:34:53 +0200
> 
> >>> This is indeed not a bug, but I am wondering if it would be better to
> >>> utilize `set-multi-message' somehow. We are certainly able to display
> >>> multiple recent messages in the echo area. Then, why not allow to keep
> >>> more important ones visible for a time period without blocking?
> >>
> >> It's not easy to temporarily enable `set-multi-message',
> >> since it's not clear at what moment to disable it afterwards.
> >
> > What I meant is to change the default `set-message-function' in such a
> > way that it displays "important" messages for a custom time period, in
> > addition to the last message.
> 
> I agree.  The most annoying delay is in 'ispell-parse-output':
> 
>     (ding) ; error message from ispell!
>     (message "Ispell error: %s" output)
>     (sit-for 5)
> 
> So I need to waste 5 seconds several times during spell-checking.

Only when there's an error, right?

> It would be nicer to prepend this error message to any last displayed
> message during these 5 seconds.

We don't really know whether doing that will be effective.  Given N
lines of messages in the echo-area, what are the chances that the user
will see all of them, or even the most important one(s)?

IOW, we don't have any real experience with this kind of UI.  We need
to collect such experience first, before we conclude that this could
be used as an alternative to sit-for.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-24 18:39             ` Eli Zaretskii
@ 2023-12-24 19:03               ` Ihor Radchenko
  2023-12-24 19:28                 ` Eli Zaretskii
  2023-12-27 17:20               ` Juri Linkov
  1 sibling, 1 reply; 29+ messages in thread
From: Ihor Radchenko @ 2023-12-24 19:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, 67393, stefankangas, Juri Linkov

Eli Zaretskii <eliz@gnu.org> writes:

>> It would be nicer to prepend this error message to any last displayed
>> message during these 5 seconds.
>
> We don't really know whether doing that will be effective.  Given N
> lines of messages in the echo-area, what are the chances that the user
> will see all of them, or even the most important one(s)?

AFAIU, the only difference is that `sit-for' will block Emacs, while the
proposed multiline echo will not. Is absence of blocking what you are
concerned about?

As an alternative idea, important messages may have an option to be
accumulated forever, until explicitly dismissed. Just like
(notifications-notify :title "Very important message" :timeout 0)

> IOW, we don't have any real experience with this kind of UI.  We need
> to collect such experience first, before we conclude that this could
> be used as an alternative to sit-for.

May we use the known experience with OS notifications?
If not, do you have something specific in mind about collecting the
experience?

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-24 19:03               ` Ihor Radchenko
@ 2023-12-24 19:28                 ` Eli Zaretskii
  2023-12-24 19:49                   ` Ihor Radchenko
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-12-24 19:28 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: materus213, 67393, stefankangas, juri

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: Juri Linkov <juri@linkov.net>, stefankangas@gmail.com,
>  materus213@gmail.com, 67393@debbugs.gnu.org
> Date: Sun, 24 Dec 2023 19:03:00 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> It would be nicer to prepend this error message to any last displayed
> >> message during these 5 seconds.
> >
> > We don't really know whether doing that will be effective.  Given N
> > lines of messages in the echo-area, what are the chances that the user
> > will see all of them, or even the most important one(s)?
> 
> AFAIU, the only difference is that `sit-for' will block Emacs, while the
> proposed multiline echo will not. Is absence of blocking what you are
> concerned about?

No, I'm concerned with the span of user's attention when presented
with multiple unrelated messages in several lines.

> As an alternative idea, important messages may have an option to be
> accumulated forever, until explicitly dismissed. Just like
> (notifications-notify :title "Very important message" :timeout 0)

How is this better than waiting for a second?

> do you have something specific in mind about collecting the
> experience?

Use them for some unimportant messages until we have enough experience
and can make intelligent decisions.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-24 19:28                 ` Eli Zaretskii
@ 2023-12-24 19:49                   ` Ihor Radchenko
  2023-12-24 20:19                     ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Ihor Radchenko @ 2023-12-24 19:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, 67393, stefankangas, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> AFAIU, the only difference is that `sit-for' will block Emacs, while the
>> proposed multiline echo will not. Is absence of blocking what you are
>> concerned about?
>
> No, I'm concerned with the span of user's attention when presented
> with multiple unrelated messages in several lines.

Then, the "important" messages should be written in such a way that they
can be understood later, away from the immediate context of the message
trigger.

>> As an alternative idea, important messages may have an option to be
>> accumulated forever, until explicitly dismissed. Just like
>> (notifications-notify :title "Very important message" :timeout 0)
>
> How is this better than waiting for a second?

1. Waiting for a second creates a temptation to press C-g without
   thinking and get the original message replaced with "Quit".

2. The message can be read later (not just within one second). For
   example after a distraction in RL and being away from Emacs or a
   short moment.

>> do you have something specific in mind about collecting the
>> experience?
>
> Use them for some unimportant messages until we have enough experience
> and can make intelligent decisions.

Any specific messages in mind?
If not, we may ask the users of set-multi-message.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-24 19:49                   ` Ihor Radchenko
@ 2023-12-24 20:19                     ` Eli Zaretskii
  2023-12-25 16:50                       ` Ihor Radchenko
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-12-24 20:19 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: materus213, 67393, stefankangas, juri

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: juri@linkov.net, stefankangas@gmail.com, materus213@gmail.com,
>  67393@debbugs.gnu.org
> Date: Sun, 24 Dec 2023 19:49:26 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> AFAIU, the only difference is that `sit-for' will block Emacs, while the
> >> proposed multiline echo will not. Is absence of blocking what you are
> >> concerned about?
> >
> > No, I'm concerned with the span of user's attention when presented
> > with multiple unrelated messages in several lines.
> 
> Then, the "important" messages should be written in such a way that they
> can be understood later, away from the immediate context of the message
> trigger.

I don't think I understand what this means in practice.  Can you show
what will be displayed in the mini-window in this case, and how to
make the "important" message stand out?

> >> As an alternative idea, important messages may have an option to be
> >> accumulated forever, until explicitly dismissed. Just like
> >> (notifications-notify :title "Very important message" :timeout 0)
> >
> > How is this better than waiting for a second?
> 
> 1. Waiting for a second creates a temptation to press C-g without
>    thinking and get the original message replaced with "Quit".
> 
> 2. The message can be read later (not just within one second). For
>    example after a distraction in RL and being away from Emacs or a
>    short moment.

Again: how will this look in practice, including the dismissal action?

> >> do you have something specific in mind about collecting the
> >> experience?
> >
> > Use them for some unimportant messages until we have enough experience
> > and can make intelligent decisions.
> 
> Any specific messages in mind?
> If not, we may ask the users of set-multi-message.

No specific messages in mind (and I don't think this aspect is
important).





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-24 20:19                     ` Eli Zaretskii
@ 2023-12-25 16:50                       ` Ihor Radchenko
  2023-12-25 16:58                         ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Ihor Radchenko @ 2023-12-25 16:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, 67393, stefankangas, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> Then, the "important" messages should be written in such a way that they
>> can be understood later, away from the immediate context of the message
>> trigger.
>
> I don't think I understand what this means in practice.  Can you show
> what will be displayed in the mini-window in this case, and how to
> make the "important" message stand out?

For example, the message "File exists, but cannot be read" from
`after-find-file' may be written as

"Opening file: <filename> exists, but cannot be read"

>> > How is this better than waiting for a second?
>> 
>> 1. Waiting for a second creates a temptation to press C-g without
>>    thinking and get the original message replaced with "Quit".
>> 
>> 2. The message can be read later (not just within one second). For
>>    example after a distraction in RL and being away from Emacs or a
>>    short moment.
>
> Again: how will this look in practice, including the dismissal action?

Try the following proof-of-concept code:

(defvar important-message-list nil)
(defun set-important-message (message)
  "Return the last message and previous important messages as one string.
Individual messages will be separated by a newline and the last message will be
separated by \"--\".
The previous messages will be displayed no longer than 'message-timeout property
seconds (if 0 - forever). The previous messages may be dismissed via
`remove-previous-message' command.
Note that this feature works best only when `resize-mini-windows'
is at its default value `grow-only'."
  (catch :continue
    (let ((last-message (car important-message-list))
	  (tail (cdr important-message-list)))
      (while last-message
	(let ((timeout (aref last-message 2)))
	  (cond
           ((= timeout 0) (throw :continue t))
	   ((> (float-time) (+ (aref last-message 0) timeout))
            (setq important-message-list (delete last-message important-message-list)))))
        (setq last-message (car tail)
              tail (cdr tail)))))
  (prog1
      (if important-message-list
	  (format "%s\n%s\n%s"
		  (mapconcat (lambda (m) (aref m 1))
			     (reverse important-message-list)
			     "\n")
		  (make-string (frame-width) ?─)
		  message)
	message)
    (when (get-text-property 0 'message-timeout message)
      (push (vector (float-time)
		    (substring-no-properties (copy-sequence message))
                    (get-text-property 0 'message-timeout message))
            important-message-list))))

(defun remove-previous-message (&optional n)
  "Remove the oldest important message displayed.
With numeric prefix argument N, remove N's message."
  (interactive "p")
  (unless important-message-list (user-error "No important messages are displayed."))
  (let ((target (nth (or (and n (1+ n)) 0))))
    (setq important-message-list (delete target important-message-list))))

(setq set-message-function #'set-important-message)

(message (propertize "This is a test!" 'message-timeout 0))
(message (propertize "This will disappear in 3 seconds" 'message-timeout 3))
(message "foo")
;; M-x remove-previous-message to remove the displayed message.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-25 16:50                       ` Ihor Radchenko
@ 2023-12-25 16:58                         ` Eli Zaretskii
  2023-12-25 17:18                           ` Ihor Radchenko
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-12-25 16:58 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: materus213, 67393, stefankangas, juri

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: juri@linkov.net, stefankangas@gmail.com, materus213@gmail.com,
>  67393@debbugs.gnu.org
> Date: Mon, 25 Dec 2023 16:50:33 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> Then, the "important" messages should be written in such a way that they
> >> can be understood later, away from the immediate context of the message
> >> trigger.
> >
> > I don't think I understand what this means in practice.  Can you show
> > what will be displayed in the mini-window in this case, and how to
> > make the "important" message stand out?
> 
> For example, the message "File exists, but cannot be read" from
> `after-find-file' may be written as
> 
> "Opening file: <filename> exists, but cannot be read"

Sorry, but I don't see how this would help.  "Opening file" could
allude to anything; Emacs opens a lot of files all the time.  A
delayed message will run a high risk of missing its point, unless it
presents a lot of relevant context, as a minimum the command which
caused it with that command's arguments.

And having said that, I'm not sure this is a good idea even if we
present enough context.  For starters, many messages must be acted
upon immediately.

> >> > How is this better than waiting for a second?
> >> 
> >> 1. Waiting for a second creates a temptation to press C-g without
> >>    thinking and get the original message replaced with "Quit".
> >> 
> >> 2. The message can be read later (not just within one second). For
> >>    example after a distraction in RL and being away from Emacs or a
> >>    short moment.
> >
> > Again: how will this look in practice, including the dismissal action?
> 
> Try the following proof-of-concept code:

Thanks, but this would mean a complete redesign of the Emacs messaging
UI.  This kind of display no longer fits the mini-window paradigm we
are using, it will need a separate large enough window for showing
series of messages (in which case we don't need to much wizardry to
scroll through them and selectively delete them).  Do we really want
to make such drastic changes in our UI?





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-25 16:58                         ` Eli Zaretskii
@ 2023-12-25 17:18                           ` Ihor Radchenko
  2023-12-25 17:34                             ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Ihor Radchenko @ 2023-12-25 17:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, 67393, stefankangas, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> For example, the message "File exists, but cannot be read" from
>> `after-find-file' may be written as
>> 
>> "Opening file: <filename> exists, but cannot be read"
>
> Sorry, but I don't see how this would help.  "Opening file" could
> allude to anything; Emacs opens a lot of files all the time.  A
> delayed message will run a high risk of missing its point, unless it
> presents a lot of relevant context, as a minimum the command which
> caused it with that command's arguments.

Do note that I am not proposing to delay the message. It will be
displayed immediately; just will not block.

As for missing the point, the point is either current command opening a
file - then, the context is clear; or a complex command doing many
things, including opening a file - then, I doubt that blocking is very
helpful.

> And having said that, I'm not sure this is a good idea even if we
> present enough context.  For starters, many messages must be acted
> upon immediately.

I'd argue that messages that _must_ be acted, should not be messages.
They should query user for action instead of blocking Emacs and not
allowing to do anything other than C-g.

>> > Again: how will this look in practice, including the dismissal action?
>> 
>> Try the following proof-of-concept code:
>
> Thanks, but this would mean a complete redesign of the Emacs messaging
> UI.  This kind of display no longer fits the mini-window paradigm we
> are using, it will need a separate large enough window for showing
> series of messages (in which case we don't need to much wizardry to
> scroll through them and selectively delete them).  Do we really want
> to make such drastic changes in our UI?

I believe that such changes would be helpful.
Apart from addressing the problem here, they might be useful to address
the concerns about messages displayed by Elisp threads, timers, and
async process callbacks. Also, if we ever get true multithreading, some
way to display and separate messages coming simultaneously would be
a good thing to have.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-25 17:18                           ` Ihor Radchenko
@ 2023-12-25 17:34                             ` Eli Zaretskii
  2023-12-25 18:40                               ` Ihor Radchenko
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-12-25 17:34 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: materus213, 67393, stefankangas, juri

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: juri@linkov.net, stefankangas@gmail.com, materus213@gmail.com,
>  67393@debbugs.gnu.org
> Date: Mon, 25 Dec 2023 17:18:42 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > And having said that, I'm not sure this is a good idea even if we
> > present enough context.  For starters, many messages must be acted
> > upon immediately.
> 
> I'd argue that messages that _must_ be acted, should not be messages.
> They should query user for action instead of blocking Emacs and not
> allowing to do anything other than C-g.

You do realize that this is contrary to everything we currently do in
Emacs, right?  We should the messages that must be acted upon
immediately, and use sit-for to make sure the user sees the message
and has an opportunity to act upon it.  The message which started this
discussion was just like that: it informed the user that an autosave
file exists, so the user should consider using it.

> > Thanks, but this would mean a complete redesign of the Emacs messaging
> > UI.  This kind of display no longer fits the mini-window paradigm we
> > are using, it will need a separate large enough window for showing
> > series of messages (in which case we don't need to much wizardry to
> > scroll through them and selectively delete them).  Do we really want
> > to make such drastic changes in our UI?
> 
> I believe that such changes would be helpful.

Maybe so, but this will be an entirely different UX, and probably an
entirely different Emacs.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-25 17:34                             ` Eli Zaretskii
@ 2023-12-25 18:40                               ` Ihor Radchenko
  2023-12-25 19:08                                 ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Ihor Radchenko @ 2023-12-25 18:40 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, 67393, stefankangas, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> I'd argue that messages that _must_ be acted, should not be messages.
>> They should query user for action instead of blocking Emacs and not
>> allowing to do anything other than C-g.
>
> You do realize that this is contrary to everything we currently do in
> Emacs, right?  We should the messages that must be acted upon
> immediately, and use sit-for to make sure the user sees the message
> and has an opportunity to act upon it.  The message which started this
> discussion was just like that: it informed the user that an autosave
> file exists, so the user should consider using it.

I disagree that sit-for gives an opportunity to act upon the message
discussed in the bug report: "%s has auto save data; consider \\`M-x
recover-this-file'".

Consider that some command opens files one by one in sequence and one of
these files has auto save data. `after-find-file' will pause that
command, display the message, block Emacs (not allowing user to do
anything), and then continue running the command. User has no chance to
do anything about the auto save recovery until the command is finished
and also has to wait extra few seconds while Emacs is blocked.
(This is a real case I encountered with M-x org-agenda)

In contrast, what I propose would make sure that the message is
displayed for at least some period of time after the command finishes.
Moreover, if multiple files have auto save data, messages about all
these files will be displayed together without a need to dig into
*Messages* buffer.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-25 18:40                               ` Ihor Radchenko
@ 2023-12-25 19:08                                 ` Eli Zaretskii
  2023-12-25 20:17                                   ` Ihor Radchenko
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-12-25 19:08 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: materus213, 67393, stefankangas, juri

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: juri@linkov.net, stefankangas@gmail.com, materus213@gmail.com,
>  67393@debbugs.gnu.org
> Date: Mon, 25 Dec 2023 18:40:08 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > You do realize that this is contrary to everything we currently do in
> > Emacs, right?  We should the messages that must be acted upon
> > immediately, and use sit-for to make sure the user sees the message
> > and has an opportunity to act upon it.  The message which started this
> > discussion was just like that: it informed the user that an autosave
> > file exists, so the user should consider using it.
> 
> I disagree that sit-for gives an opportunity to act upon the message
> discussed in the bug report: "%s has auto save data; consider \\`M-x
> recover-this-file'".
> 
> Consider that some command opens files one by one in sequence and one of
> these files has auto save data. `after-find-file' will pause that
> command, display the message, block Emacs (not allowing user to do
> anything), and then continue running the command. User has no chance to
> do anything about the auto save recovery until the command is finished
> and also has to wait extra few seconds while Emacs is blocked.
> (This is a real case I encountered with M-x org-agenda)

Such a command, if it existed, should perhaps provide a better
opportunity for the users, like prompt them for whether to recover
from each autosave file before continuing to the next one.

But I was talking about "C-x C-f", the subject of this bug report,
where such a problem doesn't exist.  By talking about a different
command you simply change the subject, which doesn't help to make the
discussion constructive.

> In contrast, what I propose would make sure that the message is
> displayed for at least some period of time after the command finishes.

Imagine a command that needs the user to respond within a short time
interval, after which the message becomes irrelevant, because the
situation changed in a way that the information there is not longer
pertinent.  Like in those mythical Mission Impossible movies: this
message will auto-destruct in 5 seconds.  How will leaving all of
those message on display help in that case?

> Moreover, if multiple files have auto save data, messages about all
> these files will be displayed together without a need to dig into
> *Messages* buffer.

"Dig into *Messages*" is a strange phrase to hear from a veteran Emacs
user.  I'd expect looking in *Messages* to be your second nature.
Some users even have the habit of leaving *Messages* constantly on
display -- there's your "leave messages on display" proposal already
available if someone wants that.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-25 19:08                                 ` Eli Zaretskii
@ 2023-12-25 20:17                                   ` Ihor Radchenko
  2023-12-27 12:34                                     ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Ihor Radchenko @ 2023-12-25 20:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, 67393, stefankangas, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> Consider that some command opens files one by one in sequence and one of
>> these files has auto save data. `after-find-file' will pause that
>> command, display the message, block Emacs (not allowing user to do
>> anything), and then continue running the command. User has no chance to
>> do anything about the auto save recovery until the command is finished
>> and also has to wait extra few seconds while Emacs is blocked.
>> (This is a real case I encountered with M-x org-agenda)
>
> Such a command, if it existed, should perhaps provide a better
> opportunity for the users, like prompt them for whether to recover
> from each autosave file before continuing to the next one.

May you please elaborate how a command calling of `find-file' or similar
can provide such prompt?

> But I was talking about "C-x C-f", the subject of this bug report,
> where such a problem doesn't exist.  By talking about a different
> command you simply change the subject, which doesn't help to make the
> discussion constructive.

Fair. My reply was more to

      (when (and warn msg)
	(message "%s" msg)
	(or not-serious (sit-for 1 t))))
			^^^^^^^^^^^^^

rather than to the original bug report.

But I am not sure if it is worth it to open a brand-new bug report about
`find-file' used from complex commands. 

>> In contrast, what I propose would make sure that the message is
>> displayed for at least some period of time after the command finishes.
>
> Imagine a command that needs the user to respond within a short time
> interval, after which the message becomes irrelevant, because the
> situation changed in a way that the information there is not longer
> pertinent.  Like in those mythical Mission Impossible movies: this
> message will auto-destruct in 5 seconds.  How will leaving all of
> those message on display help in that case?

I consider such situation worth a full interactive prompt, not limited
to 5 seconds.

For example, C-x C-f could prompt about recovering from backup file, if
such file is detected.

>> Moreover, if multiple files have auto save data, messages about all
>> these files will be displayed together without a need to dig into
>> *Messages* buffer.
>
> "Dig into *Messages*" is a strange phrase to hear from a veteran Emacs
> user.  I'd expect looking in *Messages* to be your second nature.

It is not.

> Some users even have the habit of leaving *Messages* constantly on
> display -- there's your "leave messages on display" proposal already
> available if someone wants that.

After `set-multi-message' became a thing, I no longer need to consult
*Messages* often. `set-multi-message' was really an eye-opener on how
much useful information I miss when messages are coming in quick
succession.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-25 20:17                                   ` Ihor Radchenko
@ 2023-12-27 12:34                                     ` Eli Zaretskii
  2023-12-28 13:59                                       ` Ihor Radchenko
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-12-27 12:34 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: materus213, 67393, stefankangas, juri

> From: Ihor Radchenko <yantar92@posteo.net>
> Cc: juri@linkov.net, stefankangas@gmail.com, materus213@gmail.com,
>  67393@debbugs.gnu.org
> Date: Mon, 25 Dec 2023 20:17:28 +0000
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> Consider that some command opens files one by one in sequence and one of
> >> these files has auto save data. `after-find-file' will pause that
> >> command, display the message, block Emacs (not allowing user to do
> >> anything), and then continue running the command. User has no chance to
> >> do anything about the auto save recovery until the command is finished
> >> and also has to wait extra few seconds while Emacs is blocked.
> >> (This is a real case I encountered with M-x org-agenda)
> >
> > Such a command, if it existed, should perhaps provide a better
> > opportunity for the users, like prompt them for whether to recover
> > from each autosave file before continuing to the next one.
> 
> May you please elaborate how a command calling of `find-file' or similar
> can provide such prompt?

I'm not sure I understand what you mean, because the answer seems too
obvious: just prompt after opening each file that has autosave data.
But that's probably not what you had in mind.

> >> In contrast, what I propose would make sure that the message is
> >> displayed for at least some period of time after the command finishes.
> >
> > Imagine a command that needs the user to respond within a short time
> > interval, after which the message becomes irrelevant, because the
> > situation changed in a way that the information there is not longer
> > pertinent.  Like in those mythical Mission Impossible movies: this
> > message will auto-destruct in 5 seconds.  How will leaving all of
> > those message on display help in that case?
> 
> I consider such situation worth a full interactive prompt, not limited
> to 5 seconds.
> 
> For example, C-x C-f could prompt about recovering from backup file, if
> such file is detected.

Yes.  My point being that just a fire-and-forget message is not good
in these cases anyway, so the issue we are discussing doesn't have to
cater to such cases.

> >> Moreover, if multiple files have auto save data, messages about all
> >> these files will be displayed together without a need to dig into
> >> *Messages* buffer.
> >
> > "Dig into *Messages*" is a strange phrase to hear from a veteran Emacs
> > user.  I'd expect looking in *Messages* to be your second nature.
> 
> It is not.
> 
> > Some users even have the habit of leaving *Messages* constantly on
> > display -- there's your "leave messages on display" proposal already
> > available if someone wants that.
> 
> After `set-multi-message' became a thing, I no longer need to consult
> *Messages* often. `set-multi-message' was really an eye-opener on how
> much useful information I miss when messages are coming in quick
> succession.

To each their own.  I think set-multi-message has its uses, but I
don't think it can solve all of the cases, in particular those where
we need to attract the users' attention to a particularly important
message.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-24 18:39             ` Eli Zaretskii
  2023-12-24 19:03               ` Ihor Radchenko
@ 2023-12-27 17:20               ` Juri Linkov
  2023-12-27 17:33                 ` Eli Zaretskii
  1 sibling, 1 reply; 29+ messages in thread
From: Juri Linkov @ 2023-12-27 17:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, yantar92, 67393, stefankangas

>> > What I meant is to change the default `set-message-function' in such a
>> > way that it displays "important" messages for a custom time period, in
>> > addition to the last message.
>>
>> I agree.  The most annoying delay is in 'ispell-parse-output':
>>
>>     (ding) ; error message from ispell!
>>     (message "Ispell error: %s" output)
>>     (sit-for 5)
>>
>> So I need to waste 5 seconds several times during spell-checking.
>
> Only when there's an error, right?

Often during spell-checking it's really not an error, but a warning
that text in some unsupported encoding can't be spell-checked.

>> It would be nicer to prepend this error message to any last displayed
>> message during these 5 seconds.
>
> We don't really know whether doing that will be effective.  Given N
> lines of messages in the echo-area, what are the chances that the user
> will see all of them, or even the most important one(s)?
>
> IOW, we don't have any real experience with this kind of UI.  We need
> to collect such experience first, before we conclude that this could
> be used as an alternative to sit-for.

I propose to refactor such code

  (message "Ispell error: %s" output)
  (sit-for 5)

to a new separate function, e.g.

  (important-message 5 "Ispell error: %s" output)

with a simple implementation

  (defun important-message (seconds format-string &rest args)
    (apply #'message format-string args)
    (sit-for seconds))

Then users could easily override such annoying delay.
Or maybe even the default implementation can check
if set-message-functions already contains set-multi-message
that ensures that the important message will not be missed,
and not to use sit-for in this case.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-27 17:20               ` Juri Linkov
@ 2023-12-27 17:33                 ` Eli Zaretskii
  2023-12-28  7:57                   ` Juri Linkov
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2023-12-27 17:33 UTC (permalink / raw)
  To: Juri Linkov; +Cc: materus213, yantar92, 67393, stefankangas

> From: Juri Linkov <juri@linkov.net>
> Cc: yantar92@posteo.net,  stefankangas@gmail.com,  materus213@gmail.com,
>   67393@debbugs.gnu.org
> Date: Wed, 27 Dec 2023 19:20:07 +0200
> 
> >>     (ding) ; error message from ispell!
> >>     (message "Ispell error: %s" output)
> >>     (sit-for 5)
> >>
> >> So I need to waste 5 seconds several times during spell-checking.
> >
> > Only when there's an error, right?
> 
> Often during spell-checking it's really not an error, but a warning
> that text in some unsupported encoding can't be spell-checked.

"Unsupported encoding"?  Last time I saw this was when I was using
ispell as the speller.  Since I switched to Hunspell years ago, these
problems are gone for good, since Hunspell uses UTF-8.  How come you
still see this?

> I propose to refactor such code
> 
>   (message "Ispell error: %s" output)
>   (sit-for 5)
> 
> to a new separate function, e.g.
> 
>   (important-message 5 "Ispell error: %s" output)
> 
> with a simple implementation
> 
>   (defun important-message (seconds format-string &rest args)
>     (apply #'message format-string args)
>     (sit-for seconds))
> 
> Then users could easily override such annoying delay.
> Or maybe even the default implementation can check
> if set-message-functions already contains set-multi-message
> that ensures that the important message will not be missed,
> and not to use sit-for in this case.

I don't mind much, but is this really the best we can do?  Asking
users to customize Emacs by overriding functions is not very friendly,
and in this case we certainly could do better, for example by making 5
be a defcustom.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-27 17:33                 ` Eli Zaretskii
@ 2023-12-28  7:57                   ` Juri Linkov
  2024-01-16 16:36                     ` Juri Linkov
  0 siblings, 1 reply; 29+ messages in thread
From: Juri Linkov @ 2023-12-28  7:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, yantar92, 67393, stefankangas

>> >>     (ding) ; error message from ispell!
>> >>     (message "Ispell error: %s" output)
>> >>     (sit-for 5)
>> >>
>> >> So I need to waste 5 seconds several times during spell-checking.
>> >
>> > Only when there's an error, right?
>> 
>> Often during spell-checking it's really not an error, but a warning
>> that text in some unsupported encoding can't be spell-checked.
>
> "Unsupported encoding"?  Last time I saw this was when I was using
> ispell as the speller.  Since I switched to Hunspell years ago, these
> problems are gone for good, since Hunspell uses UTF-8.  How come you
> still see this?

This happens occasionally with Hunspell, but I can't explain why,
maybe due to misconfiguration.  I could debug this later.

>> I propose to refactor such code
>> 
>>   (message "Ispell error: %s" output)
>>   (sit-for 5)
>> 
>> to a new separate function, e.g.
>> 
>>   (important-message 5 "Ispell error: %s" output)
>> 
>> with a simple implementation
>> 
>>   (defun important-message (seconds format-string &rest args)
>>     (apply #'message format-string args)
>>     (sit-for seconds))
>> 
>> Then users could easily override such annoying delay.
>> Or maybe even the default implementation can check
>> if set-message-functions already contains set-multi-message
>> that ensures that the important message will not be missed,
>> and not to use sit-for in this case.
>
> I don't mind much, but is this really the best we can do?

This is just the first thing that we could do.
So the first task is to find all such places,
and replace them with the single function call.

> Asking users to customize Emacs by overriding functions is not very
> friendly, and in this case we certainly could do better, for example
> by making 5 be a defcustom.

A defcustom would be one option.  'set-important-message' like
implemented by Ihor would be another option.  All this could be
added after creating the new function 'important-message'.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-27 12:34                                     ` Eli Zaretskii
@ 2023-12-28 13:59                                       ` Ihor Radchenko
  0 siblings, 0 replies; 29+ messages in thread
From: Ihor Radchenko @ 2023-12-28 13:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, 67393, stefankangas, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> > Such a command, if it existed, should perhaps provide a better
>> > opportunity for the users, like prompt them for whether to recover
>> > from each autosave file before continuing to the next one.
>> 
>> May you please elaborate how a command calling of `find-file' or similar
>> can provide such prompt?
>
> I'm not sure I understand what you mean, because the answer seems too
> obvious: just prompt after opening each file that has autosave data.
> But that's probably not what you had in mind.

It is actually what I had in mind, but I am concerned about several
possible caveats:

1. Introducing a query where there was none previously may break
   noninteractive Emacs and existing code that makes an assumption about
   `find-file' not querying user in most cases.

2. autosave data is just one of several cases when `after-find-file'
   uses `sit-for':
   - "File exists, but cannot be read"
   - "Symbolic link that points to nonexistent file"
   - "%s has auto save data; consider \\`M-x recover-this-file'"
   - "File not found and directory write-protected"
   - "Use M-x make-directory RET RET to create the directory and its parents"
   It is not clear if all of these cases should ask user immediately and
   wait for an answer or just some of them. And if just some of them,
   whether to leave the `sit-for' delay after displaying message or not.

>> After `set-multi-message' became a thing, I no longer need to consult
>> *Messages* often. `set-multi-message' was really an eye-opener on how
>> much useful information I miss when messages are coming in quick
>> succession.
>
> To each their own.  I think set-multi-message has its uses, but I
> don't think it can solve all of the cases, in particular those where
> we need to attract the users' attention to a particularly important
> message.

We are in agreement here. I also do not think that set-multi-message
should be used everywhere.

However, I do think that using `sit-for' to attract attention is not a
good idea and such approach should be replaced either with explicit user
prompt or, when the message is not as important, with something that
does not block Emacs (like my proposal or something else we can come up
with).

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2023-12-28  7:57                   ` Juri Linkov
@ 2024-01-16 16:36                     ` Juri Linkov
  2024-01-16 17:10                       ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Juri Linkov @ 2024-01-16 16:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, yantar92, 67393, stefankangas

[-- Attachment #1: Type: text/plain, Size: 1640 bytes --]

>>> I propose to refactor such code
>>>
>>>   (message "Ispell error: %s" output)
>>>   (sit-for 5)
>>>
>>> to a new separate function, e.g.
>>>
>>>   (important-message 5 "Ispell error: %s" output)
>>>
>>> with a simple implementation
>>>
>>>   (defun important-message (seconds format-string &rest args)
>>>     (apply #'message format-string args)
>>>     (sit-for seconds))
>>>
>>> Then users could easily override such annoying delay.
>>> Or maybe even the default implementation can check
>>> if set-message-functions already contains set-multi-message
>>> that ensures that the important message will not be missed,
>>> and not to use sit-for in this case.
>>
>> I don't mind much, but is this really the best we can do?
>
> This is just the first thing that we could do.
> So the first task is to find all such places,
> and replace them with the single function call.
>
>> Asking users to customize Emacs by overriding functions is not very
>> friendly, and in this case we certainly could do better, for example
>> by making 5 be a defcustom.
>
> A defcustom would be one option.  'set-important-message' like
> implemented by Ihor would be another option.  All this could be
> added after creating the new function 'important-message'.

So here is the new function 'important-message' and its calls
in two discussed places.

I'm not sure why 'after-find-file' uses non-nil NODISP arg
in (sit-for 1 t).  This means is that the message is not
displayed?  Then why 'message' is called?

I'm asking this because if NODISP is unnecessary then
the signature of 'important-message' without NODISP
will be shorter and more nice to use.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: important-message.patch --]
[-- Type: text/x-diff, Size: 1879 bytes --]

diff --git a/lisp/files.el b/lisp/files.el
index 9c8914bfc50..b22bf4a14c6 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -2781,8 +2781,9 @@ after-find-file
 	      (unless (file-directory-p default-directory)
 		"Use M-x make-directory RET RET to create the directory and its parents")))))
       (when (and warn msg)
-	(message "%s" msg)
-	(or not-serious (sit-for 1 t))))
+	(if not-serious
+            (message "%s" msg)
+          (important-message 1 t "%s" msg))))
     (when (and auto-save-default (not noauto))
       (auto-save-mode 1)))
   ;; Make people do a little extra work (C-x C-q)
diff --git a/lisp/simple.el b/lisp/simple.el
index 692c0dacefc..6fa74bde037 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -4794,6 +4794,12 @@ max-mini-window-lines
 	((integerp max-mini-window-height) max-mini-window-height)
 	(t 1)))
 
+(defun important-message (seconds nodisp format-string &rest args)
+  "Display an important MESSAGE in the echo area.
+Make sure that MESSAGE stays displayed for the specified number of SECONDS."
+  (apply #'message format-string args)
+  (sit-for seconds nodisp))
+
 (defun display-message-or-buffer (message &optional buffer-name action frame)
   "Display MESSAGE in the echo area if possible, otherwise in a pop-up buffer.
 MESSAGE may be either a string or a buffer.
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 17af1f1d926..3c9eda47cbd 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -2768,8 +2768,7 @@ ispell-parse-output
     (substring output 2))		; return root word
    ((equal 0 (string-match "[\ra-zA-Z]" output))
     (ding)				; error message from ispell!
-    (message "Ispell error: %s" output)
-    (sit-for 5)
+    (important-message 5 nil "Ispell error: %s" output)
     nil)
    (t					; need to process &, ?, and #'s
     (let ((type (aref output 0))	; &, ?, or #

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2024-01-16 16:36                     ` Juri Linkov
@ 2024-01-16 17:10                       ` Eli Zaretskii
  2024-01-16 17:43                         ` Juri Linkov
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2024-01-16 17:10 UTC (permalink / raw)
  To: Juri Linkov; +Cc: materus213, yantar92, 67393, stefankangas

> From: Juri Linkov <juri@linkov.net>
> Cc: materus213@gmail.com,  yantar92@posteo.net,  67393@debbugs.gnu.org,
>   stefankangas@gmail.com
> Date: Tue, 16 Jan 2024 18:36:51 +0200
> 
> > A defcustom would be one option.  'set-important-message' like
> > implemented by Ihor would be another option.  All this could be
> > added after creating the new function 'important-message'.
> 
> So here is the new function 'important-message' and its calls
> in two discussed places.

Is this in preparation for some followup?  Because if not, I'm not
sure it is justified to add a short function that has just 2 callers.
What do we gain, as a counter-weight to the need to document the new
function, insist that new code uses it, etc.?

What do others think?

> I'm not sure why 'after-find-file' uses non-nil NODISP arg
> in (sit-for 1 t).  This means is that the message is not
> displayed?  Then why 'message' is called?

I think it means redisplay is not called.  'message' causes redisplay
of the echo-area, but we don't need to redisplay the rest.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2024-01-16 17:10                       ` Eli Zaretskii
@ 2024-01-16 17:43                         ` Juri Linkov
  2024-01-16 18:51                           ` Eli Zaretskii
  0 siblings, 1 reply; 29+ messages in thread
From: Juri Linkov @ 2024-01-16 17:43 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, yantar92, 67393, stefankangas

>> > A defcustom would be one option.  'set-important-message' like
>> > implemented by Ihor would be another option.  All this could be
>> > added after creating the new function 'important-message'.
>> 
>> So here is the new function 'important-message' and its calls
>> in two discussed places.
>
> Is this in preparation for some followup?  Because if not, I'm not
> sure it is justified to add a short function that has just 2 callers.
> What do we gain, as a counter-weight to the need to document the new
> function, insist that new code uses it, etc.?

Indeed, these 2 test cases are for preparation to using it everywhere.

>> I'm not sure why 'after-find-file' uses non-nil NODISP arg
>> in (sit-for 1 t).  This means is that the message is not
>> displayed?  Then why 'message' is called?
>
> I think it means redisplay is not called.  'message' causes redisplay
> of the echo-area, but we don't need to redisplay the rest.

Would it be safe to drop NODISP in the new function?
I see that most calls of 'message' with 'sit-for'
don't use the NODISP arg.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2024-01-16 17:43                         ` Juri Linkov
@ 2024-01-16 18:51                           ` Eli Zaretskii
  2024-01-17 16:48                             ` Juri Linkov
  0 siblings, 1 reply; 29+ messages in thread
From: Eli Zaretskii @ 2024-01-16 18:51 UTC (permalink / raw)
  To: Juri Linkov; +Cc: materus213, yantar92, 67393, stefankangas

> From: Juri Linkov <juri@linkov.net>
> Cc: materus213@gmail.com,  yantar92@posteo.net,  67393@debbugs.gnu.org,
>   stefankangas@gmail.com
> Date: Tue, 16 Jan 2024 19:43:09 +0200
> 
> >> > A defcustom would be one option.  'set-important-message' like
> >> > implemented by Ihor would be another option.  All this could be
> >> > added after creating the new function 'important-message'.
> >> 
> >> So here is the new function 'important-message' and its calls
> >> in two discussed places.
> >
> > Is this in preparation for some followup?  Because if not, I'm not
> > sure it is justified to add a short function that has just 2 callers.
> > What do we gain, as a counter-weight to the need to document the new
> > function, insist that new code uses it, etc.?
> 
> Indeed, these 2 test cases are for preparation to using it everywhere.

Then I think we should consider all of those changes together.

> >> I'm not sure why 'after-find-file' uses non-nil NODISP arg
> >> in (sit-for 1 t).  This means is that the message is not
> >> displayed?  Then why 'message' is called?
> >
> > I think it means redisplay is not called.  'message' causes redisplay
> > of the echo-area, but we don't need to redisplay the rest.
> 
> Would it be safe to drop NODISP in the new function?
> I see that most calls of 'message' with 'sit-for'
> don't use the NODISP arg.

I don't see a need to remove it, as one caller that uses it is enough
to justify it, and the price is hardly significant.





^ permalink raw reply	[flat|nested] 29+ messages in thread

* bug#67393: 29.1; Slow to open file if autosave exists
  2024-01-16 18:51                           ` Eli Zaretskii
@ 2024-01-17 16:48                             ` Juri Linkov
  0 siblings, 0 replies; 29+ messages in thread
From: Juri Linkov @ 2024-01-17 16:48 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: materus213, yantar92, 67393, stefankangas

[-- Attachment #1: Type: text/plain, Size: 427 bytes --]

> Then I think we should consider all of those changes together.

Ok, here is a complete patch.

>> Would it be safe to drop NODISP in the new function?
>> I see that most calls of 'message' with 'sit-for'
>> don't use the NODISP arg.
>
> I don't see a need to remove it, as one caller that uses it is enough
> to justify it, and the price is hardly significant.

The problem is that in most calls the argument NODISP is nil.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: important-message.patch --]
[-- Type: text/x-diff, Size: 25390 bytes --]

diff --git a/etc/NEWS b/etc/NEWS
index 939caed14f6..0754645bdc8 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1777,6 +1777,8 @@ The declaration '(important-return-value t)' sets the
 'important-return-value' property which indicates that the function
 return value should probably not be thrown away implicitly.
 
+** New function 'important-message' to display messages with a delay.
+
 +++
 ** New functions 'file-user-uid' and 'file-group-gid'.
 These functions are like 'user-uid' and 'group-gid', respectively, but
diff --git a/lisp/allout.el b/lisp/allout.el
index 95b73c54934..b00e256aaf1 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -1519,7 +1519,7 @@ allout-write-contents-hook-handler
                                          " %s")
                                  (buffer-name (current-buffer))
                                  failure)))
-               (message text)(sit-for 2)
+               (important-message 2 nil text)
                text)))))
     ))
 ;;;_   > allout-after-saves-handler ()
@@ -1957,8 +1957,7 @@ allout-mode
                          (buffer-name)))
             ;; Problem applying exposure -- notify user, but don't
             ;; interrupt, eg, file visit:
-            (error (message "%s" (car (cdr err)))
-                   (sit-for 1))))
+            (error (important-message 1 nil "%s" (car (cdr err))))))
         )                               ; when allout-layout
       )					; if (allout-mode-p)
     )                                   ; let (())
diff --git a/lisp/desktop.el b/lisp/desktop.el
index ff113c85e12..3587636271a 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -1373,8 +1373,8 @@ desktop-read
 	    (unless (eq (emacs-pid) owner)
 	      (condition-case nil
 		  (desktop-claim-lock)
-		(file-error (message "Couldn't record use of desktop file")
-			    (sit-for 1))))
+		(file-error (important-message
+                             1 nil "Couldn't record use of desktop file"))))
 
 	    (unless (desktop-restoring-frameset-p)
 	      ;; `desktop-create-buffer' puts buffers at end of the buffer list.
@@ -1736,8 +1736,7 @@ desktop-idle-create-buffers
     (unless desktop-buffer-args-list
       (cancel-timer desktop-lazy-timer)
       (setq desktop-lazy-timer nil)
-      (message "Lazy desktop load complete")
-      (sit-for 3)
+      (important-message 3 nil "Lazy desktop load complete")
       (message "")))))
 
 (defun desktop-lazy-complete ()
diff --git a/lisp/ebuff-menu.el b/lisp/ebuff-menu.el
index 743b92578eb..86b5ce9367f 100644
--- a/lisp/ebuff-menu.el
+++ b/lisp/ebuff-menu.el
@@ -256,8 +256,7 @@ Electric-buffer-menu-mode-view-buffer
     (if bufnam
 	(view-buffer bufnam)
       (ding)
-      (message "Buffer %s does not exist!" bufnam)
-      (sit-for 4))))
+      (important-message 4 nil "Buffer %s does not exist!" bufnam))))
 
 (defvar electric-buffer-overlay nil)
 
diff --git a/lisp/electric.el b/lisp/electric.el
index fee0bf36d7f..20327ed48f6 100644
--- a/lisp/electric.el
+++ b/lisp/electric.el
@@ -105,26 +105,22 @@ Electric-command-loop
 	    (buffer-read-only (if loop-function
 				  (setq err conditions)
 				(ding)
-				(message "Buffer is read-only")
-				(sit-for 2)))
+				(important-message 2 nil "Buffer is read-only")))
 	    (beginning-of-buffer (if loop-function
 				     (setq err conditions)
 				   (ding)
-				   (message "Beginning of Buffer")
-				   (sit-for 2)))
+				   (important-message 2 nil "Beginning of Buffer")))
 	    (end-of-buffer (if loop-function
 			       (setq err conditions)
 			     (ding)
-			     (message "End of Buffer")
-			     (sit-for 2)))
+			     (important-message 2 nil "End of Buffer")))
 	    (error (if loop-function
 		       (setq err conditions)
 		     (ding)
-		     (message "Error: %s"
+		     (important-message 2 nil "Error: %s"
 			      (if (eq (car conditions) 'error)
 				  (car (cdr conditions))
-				(prin1-to-string conditions)))
-		     (sit-for 2))))
+				(prin1-to-string conditions))))))
 	(ding))
       (if loop-function (funcall loop-function loop-state err))))
   (ding)
diff --git a/lisp/files.el b/lisp/files.el
index 9c8914bfc50..f402dddf1c6 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -2781,8 +2781,9 @@ after-find-file
 	      (unless (file-directory-p default-directory)
 		"Use M-x make-directory RET RET to create the directory and its parents")))))
       (when (and warn msg)
-	(message "%s" msg)
-	(or not-serious (sit-for 1 t))))
+	(if not-serious
+            (message "%s" msg)
+          (important-message 1 t "%s" msg))))
     (when (and auto-save-default (not noauto))
       (auto-save-mode 1)))
   ;; Make people do a little extra work (C-x C-q)
diff --git a/lisp/ido.el b/lisp/ido.el
index 6e51dc67196..0e7934da59d 100644
--- a/lisp/ido.el
+++ b/lisp/ido.el
@@ -2015,8 +2015,7 @@ ido-read-internal
 			(condition-case nil
 			    (progn (make-directory d t) t)
 			  (error
-			   (message "Could not create directory")
-			   (sit-for 1)
+			   (important-message 1 nil "Could not create directory")
 			   nil))))
 		  (progn
 		    (ido-set-current-directory d nil (eq ido-exit 'chdir))
diff --git a/lisp/info-look.el b/lisp/info-look.el
index da7beafe500..8d79837fa2e 100644
--- a/lisp/info-look.el
+++ b/lisp/info-look.el
@@ -457,8 +457,7 @@ info-lookup
 		      (Info-goto-node node)
 		      (setq doc-found t)))
 		(error
-		 (message "Cannot access Info node %s" node)
-		 (sit-for 1)
+		 (important-message 1 nil "Cannot access Info node %s" node)
 		 nil))
 	  (condition-case nil
 	      (progn
@@ -569,8 +568,7 @@ info-lookup-make-completions
 		    (Info-goto-node node)
 		    (setq doc-found t))
 		(error
-		 (message "Cannot access Info node `%s'" node)
-		 (sit-for 1)
+		 (important-message 1 nil "Cannot access Info node `%s'" node)
 		 nil))
 	  (condition-case nil
 	      (progn
diff --git a/lisp/info.el b/lisp/info.el
index e56344825b9..b35e4edcaa3 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -3742,9 +3742,9 @@ Info-apropos-matches
                           (setq nodes (cdr nodes) node (car nodes)))
                       (Info-goto-node node))))
 	    (error
-	     (message "%s" (if (eq (car-safe err) 'error)
-			       (nth 1 err) err))
-	     (sit-for 1 t)))))
+	     (important-message
+              1 t "%s" (if (eq (car-safe err) 'error)
+			   (nth 1 err) err))))))
       (Info-find-node current-file current-node)
       (setq Info-history ohist
 	    Info-history-list ohist-list)
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 4cac79a3f4a..b7c774f08f4 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -2138,12 +2138,12 @@ isearch--momentary-message
   "Print STRING at the end of the isearch prompt for 1 second.
 The optional argument SECONDS overrides the number of seconds."
   (let ((message-log-max nil))
-    (message "%s%s%s"
-             (isearch-message-prefix nil isearch-nonincremental)
-             isearch-message
-             (apply #'propertize (format " [%s]" string)
-                    isearch-message-properties)))
-  (sit-for (or seconds 1)))
+    (important-message
+     (or seconds 1) nil "%s%s%s"
+     (isearch-message-prefix nil isearch-nonincremental)
+     isearch-message
+     (apply #'propertize (format " [%s]" string)
+            isearch-message-properties))))
 
 (isearch-define-mode-toggle lax-whitespace " " nil
   "In ordinary search, toggles the value of the variable
@@ -2777,8 +2777,7 @@ isearch-yank-until-char
                       (search-forward (char-to-string char) nil nil arg)
                       (forward-char -1))
                   (search-failed
-                   (message "`%c' not found" char)
-                   (sit-for 2)))
+                   (important-message 2 nil "`%c' not found" char)))
                 (point)))))
 
 (defun isearch-yank-line (&optional arg)
diff --git a/lisp/proced.el b/lisp/proced.el
index 3435f1ab8cd..9365df95b71 100644
--- a/lisp/proced.el
+++ b/lisp/proced.el
@@ -2131,8 +2131,7 @@ proced-send-signal
     ;; the command can be used more flexibly in noninteractive ways, too.
     (unless (get 'proced-send-signal 'proced-outdated)
        (put 'proced-send-signal 'proced-outdated t)
-       (message "Outdated usage of `proced-send-signal'")
-       (sit-for 2))
+       (important-message 2 nil "Outdated usage of `proced-send-signal'"))
     (setq process-alist (proced-marked-processes))
     (unless signal
       (let ((pnum (if (= 1 (length process-alist))
diff --git a/lisp/simple.el b/lisp/simple.el
index 692c0dacefc..ece98ec109d 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -4794,6 +4794,14 @@ max-mini-window-lines
 	((integerp max-mini-window-height) max-mini-window-height)
 	(t 1)))
 
+(defun important-message (seconds nodisp format-string &rest args)
+  "Display an important message in the echo area.
+Make sure that message stays displayed for the specified number of SECONDS.
+The arguments SECONDS and NODISP are the same as in `sit-for'.
+The arguments FORMAT-STRING and ARGS are the same as in `message'."
+  (apply #'message format-string args)
+  (sit-for seconds nodisp))
+
 (defun display-message-or-buffer (message &optional buffer-name action frame)
   "Display MESSAGE in the echo area if possible, otherwise in a pop-up buffer.
 MESSAGE may be either a string or a buffer.
@@ -9772,10 +9780,11 @@ set-variable
 				(t "globally"))))
 	  (val (progn
                  (when obsolete
-                   (message (concat "`%S' is obsolete; "
-                                    (if (symbolp obsolete) "use `%S' instead" "%s"))
-                            var obsolete)
-                   (sit-for 3))
+                   (important-message
+                    3 nil
+                    (concat "`%S' is obsolete; "
+                            (if (symbolp obsolete) "use `%S' instead" "%s"))
+                    var obsolete))
                  (if prop
                      ;; Use VAR's `variable-interactive' property
                      ;; as an interactive spec for prompting.
diff --git a/lisp/subr.el b/lisp/subr.el
index df28989b399..d77d3ab25fe 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -3404,8 +3404,8 @@ read-passwd
                   (setq success first))
               (and (arrayp first) (clear-string first))
               (and (arrayp second) (clear-string second))
-              (message "Password not repeated accurately; please start over")
-              (sit-for 1))))
+              (important-message
+               1 nil "Password not repeated accurately; please start over"))))
         success)
     (let (minibuf)
       (minibuffer-with-setup-hook
@@ -3469,8 +3469,7 @@ read-number
 			 ((stringp str) (read str))))
 	      (error nil)))
 	  (unless (numberp n)
-	    (message "Please enter a number.")
-	    (sit-for 1)
+	    (important-message 1 nil "Please enter a number.")
 	    t)))
     n))
 
diff --git a/lisp/tooltip.el b/lisp/tooltip.el
index 4537fdf8087..d03073ec4c2 100644
--- a/lisp/tooltip.el
+++ b/lisp/tooltip.el
@@ -275,8 +275,7 @@ tooltip-show
 		      tooltip-x-offset
 		      tooltip-y-offset))
       (error
-       (message "Error while displaying tooltip: %s" error)
-       (sit-for 1)
+       (important-message 1 nil "Error while displaying tooltip: %s" error)
        (message "%s" text)))))
 
 (declare-function x-hide-tip "xfns.c" ())
diff --git a/lisp/userlock.el b/lisp/userlock.el
index db94bb214e6..72d5595770b 100644
--- a/lisp/userlock.el
+++ b/lisp/userlock.el
@@ -83,9 +83,10 @@ ask-user-about-lock
 	    (cond ((null answer)
 		   (beep)
                    ;; FIXME: Why do we use "?" here and "C-h" below?
-                   (message (substitute-command-keys
-                             "Please type \\`q', \\`s', or \\`p'; or \\`?' for help"))
-		   (sit-for 3))
+                   (important-message
+                    3 nil
+                    (substitute-command-keys
+                     "Please type \\`q', \\`s', or \\`p'; or \\`?' for help")))
 		  ((eq (cdr answer) 'help)
 		   (ask-user-about-lock-help)
 		   (setq answer nil))
diff --git a/lisp/view.el b/lisp/view.el
index 2ac7479739f..6f6bcfce2c3 100644
--- a/lisp/view.el
+++ b/lisp/view.el
@@ -900,9 +900,10 @@ view-search
 	  (overlay-put view-overlay 'face view-highlight-face)
 	  (beginning-of-line)
 	  (view-recenter))
-      (message "Can't find occurrence %d of %s%s"
-	       times (if no "no " "") regexp)
-      (sit-for 4))))
+      (important-message
+       4 nil
+       "Can't find occurrence %d of %s%s"
+       times (if no "no " "") regexp))))
 
 ;; This is the dumb approach, looking at each line.  The original
 ;; version of this function looked like it might have been trying to
diff --git a/lisp/cedet/semantic/bovine/c.el b/lisp/cedet/semantic/bovine/c.el
index cf5ce1761a8..960c39feaf3 100644
--- a/lisp/cedet/semantic/bovine/c.el
+++ b/lisp/cedet/semantic/bovine/c.el
@@ -916,8 +916,7 @@ semantic-c-parse-lexical-token
 		    (format "There was an error initializing %s in buffer \"%s\".  Debug your hooks? "
 			    mode (buffer-name)))
 		   (semantic-c-debug-mode-init mode)
-		 (message "Macro parsing state may be broken...")
-		 (sit-for 1))))
+		 (important-message 1 nil "Macro parsing state may be broken..."))))
 	    )				; save match data
 
 	  ;; Hack in mode-local
diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el
index 82c6c03a592..5871ae16b04 100644
--- a/lisp/emacs-lisp/checkdoc.el
+++ b/lisp/emacs-lisp/checkdoc.el
@@ -694,20 +694,17 @@ checkdoc-interactive-loop
 				       'automatic-then-never)))
 		  (if (not fixed)
 		      (progn
-			(message "A Fix was not available.")
-			(sit-for 2))
+			(important-message 2 nil "A Fix was not available."))
 		    (setq err-list (cdr err-list))))
 		(beginning-of-defun)
 		(let ((ne (funcall findfunc nil)))
 		  (if ne
 		      (setq err-list (cons ne err-list))
 		    (cond ((not err-list)
-			   (message "No More Stylistic Errors.")
-			   (sit-for 2))
+			   (important-message 2 nil "No More Stylistic Errors."))
 			  (t
-			   (message
-			    "No Additional style errors.  Continuing...")
-			   (sit-for 2))))))
+			   (important-message 2 nil
+			    "No Additional style errors.  Continuing..."))))))
 	       ;; Move to the next error (if available)
 	       ((memq c '(?n ?\s))
 		(let ((ne (funcall findfunc nil)))
@@ -716,9 +713,8 @@ checkdoc-interactive-loop
 			  (setq returnme err-list
 				err-list nil)
 			(if (not err-list)
-			    (message "No More Stylistic Errors.")
-			  (message "No Additional style errors.  Continuing..."))
-			(sit-for 2))
+			    (important-message 2 nil "No More Stylistic Errors.")
+			  (important-message 2 nil "No Additional style errors.  Continuing...")))
 		    (setq err-list (cons ne err-list)))))
 	       ;; Go backwards in the list of errors
 	       ((memq c '(?p ?\C-?))
@@ -727,8 +723,7 @@ checkdoc-interactive-loop
 		      (setq err-list (cdr err-list))
 		      (goto-char (cdr (car err-list)))
 		      (beginning-of-defun))
-		  (message "No Previous Errors.")
-		  (sit-for 2)))
+		  (important-message 2 nil "No Previous Errors.")))
 	       ;; Edit the buffer recursively.
 	       ((eq c ?e)
 		(checkdoc-recursive-edit
@@ -741,8 +736,7 @@ checkdoc-interactive-loop
 		      (if showstatus
 			  (setq returnme err-list
 				err-list nil)
-			(message "No More Stylistic Errors.")
-			(sit-for 2))
+			(important-message 2 nil "No More Stylistic Errors."))
 		    (setq err-list (cons ne err-list)))))
 	       ;; Quit checkdoc
 	       ((eq c ?q)
diff --git a/lisp/emacs-lisp/helper.el b/lisp/emacs-lisp/helper.el
index 0446109f5ac..a4c1415e694 100644
--- a/lisp/emacs-lisp/helper.el
+++ b/lisp/emacs-lisp/helper.el
@@ -87,9 +87,9 @@ Helper-help-scroller
 (defun Helper-help-options ()
   "Describe help options."
   (interactive)
-  (message (substitute-command-keys
-            "\\`c' (key briefly), \\`m' (mode), \\`k' (key), \\`b' (bindings)"))
-  (sit-for 4))
+  (important-message
+   4 nil (substitute-command-keys
+          "\\`c' (key briefly), \\`m' (mode), \\`k' (key), \\`b' (bindings)")))
 
 (defun Helper-describe-key-briefly (key)
   "Briefly describe binding of KEY."
diff --git a/lisp/emacs-lisp/map-ynp.el b/lisp/emacs-lisp/map-ynp.el
index b603f2e6d0b..a26764b6e50 100644
--- a/lisp/emacs-lisp/map-ynp.el
+++ b/lisp/emacs-lisp/map-ynp.el
@@ -250,10 +250,10 @@ map-y-or-n-p
 			  (funcall try-again))
 			 (t
 			  ;; Random char.
-			  (message "Type %s for help."
-				   (key-description (vector help-char)))
 			  (beep)
-			  (sit-for 1)
+			  (important-message
+                           1 nil "Type %s for help."
+			   (key-description (vector help-char)))
 			  (funcall try-again))))
 		  (prompt
 		   (funcall actor elt)
@@ -372,8 +372,7 @@ read-answer
                                (interactive)
                                (delete-minibuffer-contents)
                                (beep)
-                               (message message)
-                               (sit-for 2)))
+                               (important-message 2 nil message)))
                            map)
                          read-answer-map--memoize))))
          answer)
@@ -415,8 +414,7 @@ read-answer
                        answers-with-help ",\n")
                       ".\n")))
         (beep)
-        (message message)
-        (sit-for 2)))
+        (important-message 2 nil message)))
     answer))
 
 ;;; map-ynp.el ends here
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 51c81b9d2f6..3afa33c3068 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -3254,13 +3254,13 @@ compilation-find-file
                  (origname name))
             (cond
              ((not (file-exists-p name))
-              (message "Cannot find file `%s'" name)
-              (ding) (sit-for 2))
+              (ding)
+              (important-message 2 nil "Cannot find file `%s'" name))
              ((and (file-directory-p name)
                    (not (file-exists-p
                          (setq name (compilation--expand-fn name filename)))))
-              (message "No `%s' in directory %s" filename origname)
-              (ding) (sit-for 2))
+              (ding)
+              (important-message 2 nil "No `%s' in directory %s" filename origname))
              (t
               (setq buffer (find-file-noselect name))))))))
     ;; Make intangible overlays tangible.
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 17af1f1d926..7c6aee1cbeb 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -2375,9 +2375,9 @@ ispell-command-loop
 		    ;; This may have alignment errors if current line is edited
 		    (if (marker-position ispell-recursive-edit-marker)
 			(progn
-			  (message "Only one recursive edit session supported")
 			  (beep)
-			  (sit-for 2))
+			  (important-message
+                           2 nil "Only one recursive edit session supported"))
 		      (set-marker ispell-recursive-edit-marker start)
 		      ;;(set-marker ispell-region-end reg-end)
 		      (and ispell-highlight-p		; unhighlight
@@ -2768,8 +2768,7 @@ ispell-parse-output
     (substring output 2))		; return root word
    ((equal 0 (string-match "[\ra-zA-Z]" output))
     (ding)				; error message from ispell!
-    (message "Ispell error: %s" output)
-    (sit-for 5)
+    (important-message 5 nil "Ispell error: %s" output)
     nil)
    (t					; need to process &, ?, and #'s
     (let ((type (aref output 0))	; &, ?, or #
@@ -3335,9 +3334,8 @@ ispell-tex-arg-end
 	(while (looking-at "[ \t\n]*\\[") (forward-sexp))
 	(forward-sexp (or arg 1)))
     (error
-     (message "Error skipping s-expressions at point %d." (point))
      (beep)
-     (sit-for 2))))
+     (important-message 2 nil "Error skipping s-expressions at point %d." (point)))))
 
 
 (defun ispell-ignore-fcc (start end)
@@ -3413,10 +3411,10 @@ ispell-skip-region
 	  (setq alist (cdr alist))))))
     (if (and (= start (point)) (null null-skip))
 	(progn
-	  (message "Matching region end for `%s' point %d not found"
-		   key (point))
 	  (beep)
-	  (sit-for 2)))))
+	  (important-message
+           2 nil "Matching region end for `%s' point %d not found"
+	   key (point))))))
 
 
 (defun ispell-get-line (start end in-comment)
@@ -4168,8 +4166,7 @@ ispell-buffer-local-parsing
 		   (ispell-send-string "-\n~nroff\n"))
 		  ((string-search "~" string) ; Set extended character mode.
 		   (ispell-send-string (concat string "\n")))
-		  (t (message "Invalid Ispell Parsing argument!")
-		     (sit-for 2))))))))
+		  (t (important-message 2 nil "Invalid Ispell Parsing argument!"))))))))
 
 
 ;; Can kill the current ispell process
diff --git a/lisp/vc/ediff-diff.el b/lisp/vc/ediff-diff.el
index 83bd7cde12f..381d24f1c77 100644
--- a/lisp/vc/ediff-diff.el
+++ b/lisp/vc/ediff-diff.el
@@ -222,15 +222,15 @@ ediff-make-diff2-buffer
   (let ((file1-size (ediff-file-size file1))
 	(file2-size (ediff-file-size file2)))
     (cond ((not (numberp file1-size))
-	   (message "Can't find file: %s"
-		    (ediff-abbreviate-file-name file1))
-	   (sit-for 2)
+	   (important-message
+            2 nil "Can't find file: %s"
+	    (ediff-abbreviate-file-name file1))
 	   ;; 1 is an error exit code
 	   1)
 	  ((not (numberp file2-size))
-	   (message "Can't find file: %s"
-		    (ediff-abbreviate-file-name file2))
-	   (sit-for 2)
+	   (important-message
+            2 nil "Can't find file: %s"
+	    (ediff-abbreviate-file-name file2))
 	   ;; 1 is an error exit code
 	   1)
 	  (t ;; this erases the diff buffer automatically
diff --git a/lisp/vc/ediff-ptch.el b/lisp/vc/ediff-ptch.el
index f8d4c1c1c4b..431f6becc10 100644
--- a/lisp/vc/ediff-ptch.el
+++ b/lisp/vc/ediff-ptch.el
@@ -364,8 +364,7 @@ ediff-fixup-patch-map
 			    (setq directory nil)
 			  (setq directory t)
 			  (beep)
-			  (message "%s is a directory" user-file)
-			  (sit-for 2)))
+			  (important-message 2 nil "%s is a directory" user-file)))
 		      (setcar (ediff-get-session-objA session-info)
 			      (cons user-file user-file))))
 		(setcar proposed-file-names
@@ -478,8 +477,7 @@ ediff-fixup-patch-map
 		      (if (not (file-directory-p target))
 			  (setq directory nil)
 			(beep)
-			(message "%s is a directory" target)
-			(sit-for 2)))
+			(important-message 2 nil "%s is a directory" target)))
 		    (setcar session-file-object target))))))
 	    ediff-patch-map)
     ))
diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el
index 597d8a5e643..425b1c60e5a 100644
--- a/lisp/vc/ediff-util.el
+++ b/lisp/vc/ediff-util.el
@@ -1047,9 +1047,9 @@ ediff-toggle-read-only
 		  (t
 		   (setq toggle-ro-cmd 'read-only-mode)
 		   (beep 1) (beep 1)
-		   (message
-		    "Boy, this is risky! Don't modify this file...")
-		   (sit-for 3)))) ; let the user see the warning
+		   (important-message
+                    3 nil ; let the user see the warning
+		    "Boy, this is risky! Don't modify this file..."))))
 	(if (and toggle-ro-cmd
 		 (string-match "read-only-mode" (symbol-name toggle-ro-cmd)))
 	    (save-excursion
@@ -2001,11 +2001,12 @@ ediff-copy-diff
 		    (setq
 		     messg
 		     (ediff-save-diff-region n to-buf-type reg-to-delete))))
-	    (error (message "ediff-copy-diff: %s %s"
-			    (car conds)
-			    (mapconcat #'prin1-to-string (cdr conds) " "))
-		   (beep 1)
-		   (sit-for 2) ; let the user see the error msg
+	    (error (beep 1)
+		   (important-message
+                    2 nil ; let the user see the error msg
+                    "ediff-copy-diff: %s %s"
+		    (car conds)
+		    (mapconcat #'prin1-to-string (cdr conds) " "))
 		   (setq saved-p nil)
 		   )))
       )
@@ -2692,9 +2693,8 @@ ediff-write-merge-buffer-and-maybe-kill
 	      (save-buffer))
 	    (if show-file
 		(progn
-		  (message "Merge buffer saved in: %s" file)
 		  (set-buffer-modified-p nil)
-		  (sit-for 3)))
+		  (important-message 3 nil "Merge buffer saved in: %s" file)))
 	    (if (and
 		 (not save-and-continue)
 		 (y-or-n-p "Merge buffer saved.  Now kill the buffer? "))
@@ -3231,8 +3231,9 @@ ediff-save-buffer
 	     (ediff-get-buffer
 	      (ediff-char-to-buftype last-command-event)))
 	    ((eq last-command-event ?d)
-	     (message "Saving diff output ...")
-	     (sit-for 1) ; let the user see the message
+	     (important-message
+              1 nil ; let the user see the message
+              "Saving diff output ...")
 	     (cond ((and arg (ediff-buffer-live-p ediff-diff-buffer))
 		    ediff-diff-buffer)
 		   ((ediff-buffer-live-p ediff-custom-diff-buffer)
@@ -3442,10 +3443,10 @@ ediff-inferior-compare-regions
 			 nil)
 			((equal answer ""))
 			(t (beep 1)
-			   (message
+			   (important-message
+                            2 nil
 			    "Valid values are %s"
 			    (mapconcat #'char-to-string possibilities " or "))
-			   (sit-for 2)
 			   t))
 	     (let ((cursor-in-echo-area t))
 	       (message "Enter the 1st buffer you want to compare (%s): "
@@ -3461,10 +3462,10 @@ ediff-inferior-compare-regions
 			 nil)
 			((equal answer ""))
 			(t (beep 1)
-			   (message
+			   (important-message
+                            2 nil
 			    "Valid values are %s"
 			    (mapconcat #'char-to-string possibilities " or "))
-			   (sit-for 2)
 			   t))
 	     (let ((cursor-in-echo-area t))
 	       (message "Enter the 2nd buffer you want to compare (%s): "

^ permalink raw reply related	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2024-01-17 16:48 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-23  0:28 bug#67393: 29.1; Slow to open file if autosave exists materus213
2023-11-23  6:51 ` Eli Zaretskii
2023-12-22 14:56   ` Stefan Kangas
2023-12-23 14:34     ` Ihor Radchenko
2023-12-23 17:23       ` Juri Linkov
2023-12-23 18:05         ` Ihor Radchenko
2023-12-24 17:34           ` Juri Linkov
2023-12-24 18:39             ` Eli Zaretskii
2023-12-24 19:03               ` Ihor Radchenko
2023-12-24 19:28                 ` Eli Zaretskii
2023-12-24 19:49                   ` Ihor Radchenko
2023-12-24 20:19                     ` Eli Zaretskii
2023-12-25 16:50                       ` Ihor Radchenko
2023-12-25 16:58                         ` Eli Zaretskii
2023-12-25 17:18                           ` Ihor Radchenko
2023-12-25 17:34                             ` Eli Zaretskii
2023-12-25 18:40                               ` Ihor Radchenko
2023-12-25 19:08                                 ` Eli Zaretskii
2023-12-25 20:17                                   ` Ihor Radchenko
2023-12-27 12:34                                     ` Eli Zaretskii
2023-12-28 13:59                                       ` Ihor Radchenko
2023-12-27 17:20               ` Juri Linkov
2023-12-27 17:33                 ` Eli Zaretskii
2023-12-28  7:57                   ` Juri Linkov
2024-01-16 16:36                     ` Juri Linkov
2024-01-16 17:10                       ` Eli Zaretskii
2024-01-16 17:43                         ` Juri Linkov
2024-01-16 18:51                           ` Eli Zaretskii
2024-01-17 16:48                             ` Juri Linkov

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).