bug#81619: 30.1; draggingUpdated callback in nsterm.m invokes redisplay with waiting_for_input set, aborting Emacs

Richard Garner <[email protected]>
Newsgroups gmane.emacs.bugs
Message-ID <[email protected]>
The bug
-------

Dragging a file over an Emacs frame on macOS sometimes causes an instant
Emacs abort, with no error message: Emacs simply disappears.

This appears to be because the NS drag callback runs redisplay in a
fragile state where no Lisp signals are permitted.

The analysis
------------

My macOS crash logs gave me this traceback:

#8   emacs_abort
#9   signal_or_quit
#10  Fsignal
#13  args_out_of_range
#14  Faref
#15  truncate-string-to-width          (mule-util, natively compiled)
#17  mu4e--modeline-quote-and-truncate
#19  mu4e--modeline-string
#23  internal_condition_case_n
#24  dsafe__call
#25  display_mode_element              (x5)
#30  Fformat_mode_line
#40  internal_condition_case_n
#41  dsafe__call
#42  display_mode_element
#43  display_mode_line
#44  display_mode_lines
#45  redisplay_window
#48  redisplay_internal
#49  -[EmacsView draggingUpdated:]
#50  -[NSDragDestination _draggingUpdate]
#52  NSCoreDragTrackingProc

Here you can see -[EmacsView draggingUpdated:] calling redisplay(); this
is nsterm.m:9494. Inside redisplay(), the modelines are updated,
including the elisp inside any :eval forms. In my config, one of these
calls truncate-string-to-width from mule-util.el. This iterates over a
string with aref inside a condition-case, and catches args-out-of-range
as the loop terminator.

This is perfectly blameless (and stock) elisp, but here redisplay is
being called while Emacs is idling in wait_reading_process_output with
waiting_for_input set. In this state, any signal raised causes an
instant abort (eval.c:1961). Even a handled signal is not safe: the
condition-case in truncate-string-to-width is bypassed, as are
redisplay's own guards at frames #23 and #40. signal_or_quit aborts
without consulting any handlers, so Emacs vanishes without trace.

Running Emacs through lldb, I think I can trace the mechanism:

frame #18: Emacs`ns_select_1 + 784
frame #19: Emacs`wait_reading_process_output + 3312
frame #20: Emacs`sit_for + 384
frame #21: Emacs`read_char + 4884

- read_char calls sit_for with reading = 1, from either the
  echo-keystrokes wait or the auto-save idle wait;
- because reading = 1, sit_for passes read_kbd = -1;
- because read_kbd is negative, wait_reading_process_output calls
  set_waiting_for_input.

Nothing in nsterm.m or nsmenu.m clears it around the NS event loop, so
it is still set when AppKit calls into the view.

The fix
-------

This issue has already been worked around elsewhere. dnd.el:155-157
tries to do so from the elisp side with the comment "We avoid errors
here, since on some systems this runs when waiting_for_input is
non-zero, and that aborts on error."

However, nsterm.m:9380-9389, a hundred lines earlier, has a fix that
works on the Objective C side; it says:

"If there is IO going on when redisplay is run here Emacs crashes. I
think it's because this code will always be run within the run loop and
for whatever reason processing input is dangerous. This technique was
stolen wholesale from nsmenu.m and seems to work."

The place it was stolen from is nsmenu.m:201-254; propagating the
wholesale theft further yields the following minimal patch against
master:

--8<---------------cut here---------------start------------->8---
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -9491,7 +9491,19 @@
   safe_calln (Vns_drag_motion_function, frame,
 	      make_fixnum (x), make_fixnum (y));
 
-  redisplay ();
+  /* Since redisplay can call arbitrary Lisp that may signal, we
+     guard against calling it while waiting_for_input is set, in
+     which state any signal causes an immediate abort.  */
+  {
+    bool owfi = waiting_for_input;
+    waiting_for_input = 0;
+    block_input ();
+
+    redisplay ();
+
+    unblock_input ();
+    waiting_for_input = owfi;
+  }
 #endif
 
   unbind_to (count, Qnil);
--8<---------------cut here---------------end--------------->8---

However, a manoeuvre that's good enough to steal twice maybe deserves
its own helper.


In GNU Emacs 30.1 (build 2, aarch64-apple-darwin22.6.0, NS
 appkit-2299.77 Version 13.7.6 (Build 22H625)) of 2026-04-26 built on
 Triptykon
Windowing system distributor 'Apple', version 10.3.2487
System Description:  macOS 14.8.7

Configured using:
 'configure --disable-dependency-tracking --disable-silent-rules
 --enable-locallisppath=/opt/homebrew/share/emacs/site-lisp
 --infodir=/opt/homebrew/Cellar/emacs-plus@30/30.1/share/info/emacs
 --prefix=/opt/homebrew/Cellar/emacs-plus@30/30.1
 --with-native-compilation=aot --with-xml2 --with-gnutls
 --without-compress-install --without-dbus --with-imagemagick
 --with-modules --with-rsvg --with-webp --with-ns
 --disable-ns-self-contained 'CFLAGS=-O2 -DFD_SETSIZE=10000
 -DDARWIN_UNLIMITED_SELECT -I/opt/homebrew/opt/sqlite/include
 -I/opt/homebrew/opt/gcc/include -I/opt/homebrew/opt/libgccjit/include'
 'LDFLAGS=-L/opt/homebrew/opt/sqlite/lib -L/opt/homebrew/lib/gcc/15
 -I/opt/homebrew/opt/gcc/include -I/opt/homebrew/opt/libgccjit/include''

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

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

Major mode: Fundamental

Minor modes in effect:
  pdf-occur-global-minor-mode: t
  csv-field-index-mode: t
  global-git-commit-mode: t
  global-corfu-mode: t
  corfu-mode: t
  global-treesit-auto-mode: t
  vertico-prescient-mode: t
  prescient-persist-mode: t
  vertico-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  smartparens-global-mode: t
  smartparens-mode: t
  whole-line-or-region-global-mode: t
  whole-line-or-region-local-mode: t
  remember-notes-mode: t
  savehist-mode: t
  recentf-mode: t
  override-global-mode: t
  global-so-long-mode: t
  global-auto-revert-mode: t
  global-display-fill-column-indicator-mode: t
  display-fill-column-indicator-mode: t
  display-time-mode: t
  server-mode: t
  straight-use-package-mode: t
  straight-package-neutering-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
  minibuffer-regexp-mode: t
  size-indication-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/Users/rgarner/.emacs.d/straight/build/bind-key/bind-key hides /Users/rgarner/.emacs.d/straight/build/use-package/bind-key
/Users/rgarner/.emacs.d/straight/build/svg/svg hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/svg
/Users/rgarner/.emacs.d/straight/build/transient/transient hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/transient
/Users/rgarner/.emacs.d/straight/build/bind-key/bind-key hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/bind-key
/Users/rgarner/.emacs.d/straight/build/use-package/use-package-jump hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/use-package/use-package-jump
/Users/rgarner/.emacs.d/straight/build/use-package/use-package-ensure-system-package hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/use-package/use-package-ensure-system-package
/Users/rgarner/.emacs.d/straight/build/use-package/use-package-diminish hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/use-package/use-package-diminish
/Users/rgarner/.emacs.d/straight/build/use-package/use-package hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/use-package/use-package
/Users/rgarner/.emacs.d/straight/build/use-package/use-package-delight hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/use-package/use-package-delight
/Users/rgarner/.emacs.d/straight/build/use-package/use-package-lint hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/use-package/use-package-lint
/Users/rgarner/.emacs.d/straight/build/use-package/use-package-core hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/use-package/use-package-core
/Users/rgarner/.emacs.d/straight/build/use-package/use-package-ensure hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/use-package/use-package-ensure
/Users/rgarner/.emacs.d/straight/build/use-package/use-package-bind-key hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/use-package/use-package-bind-key
/Users/rgarner/.emacs.d/straight/build/org/ob-comint hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-comint
/Users/rgarner/.emacs.d/straight/build/org/ob-exp hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-exp
/Users/rgarner/.emacs.d/straight/build/org/org-ctags hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-ctags
/Users/rgarner/.emacs.d/straight/build/org/ob-emacs-lisp hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-emacs-lisp
/Users/rgarner/.emacs.d/straight/build/org/oc hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/oc
/Users/rgarner/.emacs.d/straight/build/org/ox-texinfo hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-texinfo
/Users/rgarner/.emacs.d/straight/build/org/ol-irc hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-irc
/Users/rgarner/.emacs.d/straight/build/org/ol-doi hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-doi
/Users/rgarner/.emacs.d/straight/build/org/ob hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob
/Users/rgarner/.emacs.d/straight/build/org/org-refile hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-refile
/Users/rgarner/.emacs.d/straight/build/org/org-version hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-version
/Users/rgarner/.emacs.d/straight/build/org/org-num hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-num
/Users/rgarner/.emacs.d/straight/build/org/ol-mhe hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-mhe
/Users/rgarner/.emacs.d/straight/build/org/ob-shell hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-shell
/Users/rgarner/.emacs.d/straight/build/org/org-attach hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-attach
/Users/rgarner/.emacs.d/straight/build/org/ob-C hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-C
/Users/rgarner/.emacs.d/straight/build/org/org-macs hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-macs
/Users/rgarner/.emacs.d/straight/build/org/org-entities hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-entities
/Users/rgarner/.emacs.d/straight/build/org/ob-dot hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-dot
/Users/rgarner/.emacs.d/straight/build/org/ob-sql hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-sql
/Users/rgarner/.emacs.d/straight/build/org/ol-eww hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-eww
/Users/rgarner/.emacs.d/straight/build/org/org-datetree hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-datetree
/Users/rgarner/.emacs.d/straight/build/org/org-macro hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-macro
/Users/rgarner/.emacs.d/straight/build/org/ob-eval hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-eval
/Users/rgarner/.emacs.d/straight/build/org/ob-haskell hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-haskell
/Users/rgarner/.emacs.d/straight/build/org/ox-org hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-org
/Users/rgarner/.emacs.d/straight/build/org/ol-rmail hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-rmail
/Users/rgarner/.emacs.d/straight/build/org/ob-awk hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-awk
/Users/rgarner/.emacs.d/straight/build/org/ob-groovy hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-groovy
/Users/rgarner/.emacs.d/straight/build/org/ox-icalendar hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-icalendar
/Users/rgarner/.emacs.d/straight/build/org/ob-octave hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-octave
/Users/rgarner/.emacs.d/straight/build/org/ob-scheme hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-scheme
/Users/rgarner/.emacs.d/straight/build/org/org-mobile hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-mobile
/Users/rgarner/.emacs.d/straight/build/org/ob-processing hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-processing
/Users/rgarner/.emacs.d/straight/build/org/oc-biblatex hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/oc-biblatex
/Users/rgarner/.emacs.d/straight/build/org/oc-csl hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/oc-csl
/Users/rgarner/.emacs.d/straight/build/org/org-colview hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-colview
/Users/rgarner/.emacs.d/straight/build/org/ob-R hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-R
/Users/rgarner/.emacs.d/straight/build/org/org-table hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-table
/Users/rgarner/.emacs.d/straight/build/org/ox-html hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-html
/Users/rgarner/.emacs.d/straight/build/org/ob-fortran hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-fortran
/Users/rgarner/.emacs.d/straight/build/org/ol hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol
/Users/rgarner/.emacs.d/straight/build/org/ob-plantuml hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-plantuml
/Users/rgarner/.emacs.d/straight/build/org/ol-docview hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-docview
/Users/rgarner/.emacs.d/straight/build/org/ob-perl hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-perl
/Users/rgarner/.emacs.d/straight/build/org/ob-sqlite hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-sqlite
/Users/rgarner/.emacs.d/straight/build/org/oc-basic hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/oc-basic
/Users/rgarner/.emacs.d/straight/build/org/ob-sed hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-sed
/Users/rgarner/.emacs.d/straight/build/org/org-fold-core hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-fold-core
/Users/rgarner/.emacs.d/straight/build/org/ob-ditaa hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-ditaa
/Users/rgarner/.emacs.d/straight/build/org/ob-ruby hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-ruby
/Users/rgarner/.emacs.d/straight/build/org/oc-bibtex hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/oc-bibtex
/Users/rgarner/.emacs.d/straight/build/org/org-habit hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-habit
/Users/rgarner/.emacs.d/straight/build/org/org-loaddefs hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-loaddefs
/Users/rgarner/.emacs.d/straight/build/org/ol-gnus hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-gnus
/Users/rgarner/.emacs.d/straight/build/org/ob-screen hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-screen
/Users/rgarner/.emacs.d/straight/build/org/org-mouse hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-mouse
/Users/rgarner/.emacs.d/straight/build/org/ob-css hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-css
/Users/rgarner/.emacs.d/straight/build/org/org-inlinetask hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-inlinetask
/Users/rgarner/.emacs.d/straight/build/org/ob-lisp hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-lisp
/Users/rgarner/.emacs.d/straight/build/org/ol-eshell hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-eshell
/Users/rgarner/.emacs.d/straight/build/org/org-pcomplete hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-pcomplete
/Users/rgarner/.emacs.d/straight/build/org/org-lint hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-lint
/Users/rgarner/.emacs.d/straight/build/org/org-id hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-id
/Users/rgarner/.emacs.d/straight/build/org/org-capture hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-capture
/Users/rgarner/.emacs.d/straight/build/org/ob-sass hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-sass
/Users/rgarner/.emacs.d/straight/build/org/ob-tangle hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-tangle
/Users/rgarner/.emacs.d/straight/build/org/ob-calc hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-calc
/Users/rgarner/.emacs.d/straight/build/org/ob-java hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-java
/Users/rgarner/.emacs.d/straight/build/org/org-compat hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-compat
/Users/rgarner/.emacs.d/straight/build/org/org-attach-git hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-attach-git
/Users/rgarner/.emacs.d/straight/build/org/ox-beamer hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-beamer
/Users/rgarner/.emacs.d/straight/build/org/org-protocol hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-protocol
/Users/rgarner/.emacs.d/straight/build/org/org-element hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-element
/Users/rgarner/.emacs.d/straight/build/org/ob-lob hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-lob
/Users/rgarner/.emacs.d/straight/build/org/org-tempo hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-tempo
/Users/rgarner/.emacs.d/straight/build/org/ob-python hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-python
/Users/rgarner/.emacs.d/straight/build/org/ob-latex hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-latex
/Users/rgarner/.emacs.d/straight/build/org/ol-w3m hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-w3m
/Users/rgarner/.emacs.d/straight/build/org/org-agenda hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-agenda
/Users/rgarner/.emacs.d/straight/build/org/org-persist hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-persist
/Users/rgarner/.emacs.d/straight/build/org/ob-ocaml hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-ocaml
/Users/rgarner/.emacs.d/straight/build/org/ob-ref hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-ref
/Users/rgarner/.emacs.d/straight/build/org/org-fold hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-fold
/Users/rgarner/.emacs.d/straight/build/org/ob-julia hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-julia
/Users/rgarner/.emacs.d/straight/build/org/ob-lilypond hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-lilypond
/Users/rgarner/.emacs.d/straight/build/org/ob-table hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-table
/Users/rgarner/.emacs.d/straight/build/org/ob-clojure hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-clojure
/Users/rgarner/.emacs.d/straight/build/org/org-indent hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-indent
/Users/rgarner/.emacs.d/straight/build/org/org-plot hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-plot
/Users/rgarner/.emacs.d/straight/build/org/ox-latex hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-latex
/Users/rgarner/.emacs.d/straight/build/org/org-src hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-src
/Users/rgarner/.emacs.d/straight/build/org/org-duration hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-duration
/Users/rgarner/.emacs.d/straight/build/org/ob-makefile hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-makefile
/Users/rgarner/.emacs.d/straight/build/org/ol-info hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-info
/Users/rgarner/.emacs.d/straight/build/org/org-clock hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-clock
/Users/rgarner/.emacs.d/straight/build/org/ob-forth hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-forth
/Users/rgarner/.emacs.d/straight/build/org/ox-odt hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-odt
/Users/rgarner/.emacs.d/straight/build/org/ol-man hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-man
/Users/rgarner/.emacs.d/straight/build/org/ox-publish hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-publish
/Users/rgarner/.emacs.d/straight/build/org/org-archive hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-archive
/Users/rgarner/.emacs.d/straight/build/org/ob-org hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-org
/Users/rgarner/.emacs.d/straight/build/org/ob-lua hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-lua
/Users/rgarner/.emacs.d/straight/build/org/org-keys hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-keys
/Users/rgarner/.emacs.d/straight/build/org/ob-eshell hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-eshell
/Users/rgarner/.emacs.d/straight/build/org/org-faces hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-faces
/Users/rgarner/.emacs.d/straight/build/org/ox-man hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-man
/Users/rgarner/.emacs.d/straight/build/org/org-list hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-list
/Users/rgarner/.emacs.d/straight/build/org/ox-md hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-md
/Users/rgarner/.emacs.d/straight/build/org/org-goto hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-goto
/Users/rgarner/.emacs.d/straight/build/org/ol-bbdb hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-bbdb
/Users/rgarner/.emacs.d/straight/build/org/org hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org
/Users/rgarner/.emacs.d/straight/build/org/ol-bibtex hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ol-bibtex
/Users/rgarner/.emacs.d/straight/build/org/ox-koma-letter hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-koma-letter
/Users/rgarner/.emacs.d/straight/build/org/ox-ascii hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox-ascii
/Users/rgarner/.emacs.d/straight/build/org/ob-matlab hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-matlab
/Users/rgarner/.emacs.d/straight/build/org/ox hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ox
/Users/rgarner/.emacs.d/straight/build/org/org-timer hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-timer
/Users/rgarner/.emacs.d/straight/build/org/oc-natbib hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/oc-natbib
/Users/rgarner/.emacs.d/straight/build/org/ob-core hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-core
/Users/rgarner/.emacs.d/straight/build/org/org-feed hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-feed
/Users/rgarner/.emacs.d/straight/build/org/ob-gnuplot hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-gnuplot
/Users/rgarner/.emacs.d/straight/build/org/ob-js hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-js
/Users/rgarner/.emacs.d/straight/build/org/org-element-ast hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-element-ast
/Users/rgarner/.emacs.d/straight/build/org/org-footnote hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-footnote
/Users/rgarner/.emacs.d/straight/build/org/ob-maxima hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/ob-maxima
/Users/rgarner/.emacs.d/straight/build/org/org-cycle hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-cycle
/Users/rgarner/.emacs.d/straight/build/org/org-crypt hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/org/org-crypt
/Users/rgarner/.emacs.d/straight/build/compat/compat hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/emacs-lisp/compat
/Users/rgarner/.emacs.d/straight/build/let-alist/let-alist hides /opt/homebrew/Cellar/emacs-plus@30/30.1/share/emacs/30.1/lisp/emacs-lisp/let-alist

Features:
(shadow emacsbug avy json-ts-mode cal-move rect hideshow eglot
external-completion jsonrpc flymake ert ewoc debug backtrace lua-ts-mode
smartparens-c cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles
cc-align cc-engine cc-vars cc-defs cl-print magit-extras patch-review
pdf-sync pdf-annot pdf-outline pdf-links pdf-history pdf-occur ibuf-ext
ibuffer ibuffer-loaddefs tablist tablist-filter semantic/wisent/comp
semantic/wisent semantic/wisent/wisent semantic/util-modes semantic/util
semantic semantic/tag semantic/lex semantic/fw mode-local cedet
pdf-isearch pdf-misc pdf-tools package url-handlers pdf-view pdf-cache
pdf-info tq pdf-util pdf-macs tabify org-datetree cal-iso vc-hg vc-bzr
vc-src vc-sccs vc-svn vc-cvs vc-rcs log-view vc bug-reference
magit-bookmark magit-submodule magit-blame magit-stash magit-reflog
magit-bisect magit-push magit-pull magit-fetch magit-clone magit-remote
magit-commit magit-sequence magit-notes magit-worktree magit-tag
magit-merge magit-branch magit-reset magit-files magit-refs magit-status
magit magit-repos magit-apply magit-wip magit-log csv-mode tramp-cache
time-stamp tramp-sh shortdoc help-fns radix-tree network-stream nsm
mailalias qp misearch multi-isearch etags fileloop xref
display-line-numbers clyde magit-diff which-func smerge-mode diff
git-commit log-edit pcvs-util add-log magit-core magit-autorevert
magit-margin magit-transient magit-process with-editor magit-mode
benchmark magit-git magit-base magit-section cursor-sensor consult-dir
consult sgml-mode facemenu smartparens-markdown markdown-mode dired-aux
view vertico-directory sort smiley gnus-cite mm-archive mail-extr
textsec uni-scripts idna-mapping uni-confusable textsec-check
rg-editorial vc-git diff-mode track-changes vc-dispatcher ghostel
ghostel-module ghostel-prompt imenu ghostel-module-install ghostel-links
ghostel-line-mode ghostel-kitty ghostel-faces ghostel-autoloads wgrep
grep wgrep-autoloads corfu corfu-autoloads smartparens-lua lua-mode
lua-mode-autoloads treesit-auto treesit-auto-autoloads smartparens-html
web-mode web-mode-autoloads vterm tramp trampver tramp-integration
files-x tramp-message tramp-compat tramp-loaddefs face-remap compile
color term disp-table shell ehelp vterm-module term/xterm xterm
vterm-autoloads magit-autoloads with-editor-autoloads
magit-section-autoloads rg-code rg-outlook-sync rg-notes morc
mu4e-icalendar gnus-icalendar icalendar rg-mu4e mu4e mu4e-org
mu4e-transient gnus-ml mu4e-notification notifications mu4e-main
smtpmail mu4e-view mu4e-mime-parts crm mu4e-headers mu4e-thread
mu4e-actions mu4e-compose mu4e-draft gnus-msg mu4e-search mu4e-lists
mu4e-bookmarks mu4e-mark mu4e-labels mu4e-message flow-fill
mu4e-contacts mu4e-update mu4e-folders mu4e-context mu4e-query-items
mu4e-server mu4e-modeline mu4e-vars mu4e-helpers mu4e-config mu4e-window
bookmark mu4e-obsolete yaml yaml-autoloads emacsql-sqlite
emacsql-sqlite-common emacsql emacsql-compiler emacsql-autoloads
xeft-autoloads org-duration oc-basic ol-eww eww ol-rmail ol-mhe ol-irc
ol-info ol-gnus nnselect gnus-art mm-uu mml2015 mm-view mml-smime smime
gnutls dig gnus-sum shr pixel-fill kinsoku gnus-group gnus-undo
gnus-start gnus-dbus dbus gnus-cloud nnimap nnmail mail-source utf7 nnoo
parse-time gnus-spec gnus-int gnus-range message sendmail yank-media
puny rfc822 mml mml-sec epa epg rfc6068 epg-config mm-decode mm-bodies
mm-encode mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mailabbrev
gmm-utils mailheader gnus-win ol-docview doc-view jka-compr image-mode
exif dired dired-loaddefs ol-bibtex ol-bbdb ol-w3m ol-doi org-link-doi
org-agenda org-element org-persist xdg org-id avl-tree generator appt
diary-lib diary-loaddefs org-timeblock compat-macs svg dom xml
org-timeblock-autoloads svg-autoloads rg-org completing-read-keymaps
transient llama cond-let transient-autoloads llama-autoloads
cond-let-autoloads bibretrieve-base reftex-sel reftex-cite reftex
reftex-loaddefs reftex-vars bibretrieve bibretrieve-autoloads
bibtex-completion org-capture org-refile smartparens-org org ob
ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-src sh-script smie
treesit executable ob-comint org-element-ast inline org-pcomplete
pcomplete comint ansi-osc ansi-color ring org-list org-footnote
org-faces org-entities noutline outline ob-emacs-lisp ob-core ob-eval
org-cycle org-table ol org-fold org-fold-core org-keys oc org-compat
org-loaddefs find-func cal-menu calendar cal-loaddefs org-version
org-macs format-spec biblio biblio-download biblio-dissemin biblio-ieee
biblio-hal biblio-dblp biblio-crossref biblio-arxiv timezone biblio-doi
biblio-core url-queue url-file ido hl-line browse-url url url-proxy
url-privacy url-expand url-methods url-history url-cookie
generate-lisp-file url-domsuf url-util url-parse auth-source eieio
eieio-core password-cache url-vars mailcap biblio-autoloads
biblio-core-autoloads f f-autoloads parsebib parsebib-autoloads
pdf-tools-autoloads let-alist-autoloads tablist-autoloads bibtex iso8601
tex-parens tex-parens-autoloads bratex latex-edit-fns rg-latex json map
mm-url gnus nnheader gnus-util text-property-search time-date mail-utils
range mm-util mail-prsvr auctex-autoloads tex-site
embark-consult-autoloads embark-autoloads consult-dir-autoloads
consult-autoloads rg-project project vertico-prescient
vertico-prescient-autoloads prescient char-fold prescient-autoloads
vertico compat compat-31 vertico-autoloads compat-autoloads rg-selection
markdown-mode-autoloads csv-mode-autoloads expand-region-autoloads
fancy-dabbrev popup dabbrev fancy-dabbrev-autoloads popup-autoloads
yasnippet yasnippet-autoloads move-text-autoloads smartparens-config
smartparens-text smartparens advice loadhist thingatpt dash
smartparens-autoloads goto-chg-autoloads vundo-autoloads
whole-line-or-region whole-line-or-region-autoloads use-package-diminish
avy-autoloads finder-inf rg-editing rg-utilities remember
dired-ranger-autoloads dired-subtree-autoloads dired-narrow-autoloads
dired-hacks-utils-autoloads dash-autoloads visual-fill-column
visual-fill-column-autoloads spatial-navigate-autoloads savehist recentf
tree-widget edmacro kmacro byte-opt use-package-bind-key bind-key
diminish diminish-autoloads s s-autoloads so-long autorevert filenotify
easy-mmode display-fill-column-indicator time rg-basics server
continuum-theme rg-theme let-alist use-package-core derived pcase
use-package-autoloads info bind-key-autoloads straight-autoloads
straight cl-macs cus-edit pp cus-load wid-edit comp cl-seq comp-cstr
cl-extra help-mode warnings icons subr-x gv cl-loaddefs cl-lib comp-run
bytecomp byte-compile comp-common rx rmc iso-transl tooltip cconv eldoc
paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode
mwheel term/ns-win ns-win ucs-normalize mule-util term/common-win
tool-bar dnd fontset image regexp-opt fringe tabulated-list replace
newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar
rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock
font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq
simple cl-generic indonesian philippine cham georgian utf-8-lang
misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms
cp51932 hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese composite emoji-zwj charscript charprop case-table
epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button
loaddefs theme-loaddefs faces cus-face macroexp files window
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget keymap hashtable-print-readable backquote threads kqueue
cocoa ns lcms2 multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 1477616 1245879) (symbols 48 59993 43)
 (strings 32 376006 44478) (string-bytes 1 14782567)
 (vectors 16 113794) (vector-slots 8 2327069 407593)
 (floats 8 19502 42240) (intervals 56 72932 15945) (buffers 992 92))
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.