GNU bug report logs - #77658
30.1.50; Eglot: wrong-type-argument: consp, #<marker at 1 in file> when saving

Previous Next

Package: emacs;

Reported by: Aaron Zeng <azeng <at> janestreet.com>

Date: Tue, 8 Apr 2025 22:06:01 UTC

Severity: normal

Found in version 30.1.50

To reply to this bug, email your comments to 77658 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#77658; Package emacs. (Tue, 08 Apr 2025 22:06:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Aaron Zeng <azeng <at> janestreet.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Tue, 08 Apr 2025 22:06:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Aaron Zeng <azeng <at> janestreet.com>
To: bug-gnu-emacs <at> gnu.org
Cc: app-emacs-dev <at> janestreet.com
Subject: 30.1.50; Eglot: wrong-type-argument: consp, #<marker at 1 in file>
 when saving
Date: Tue, 08 Apr 2025 18:05:27 -0400
When saving an empty buffer, and while `before-save-hook` has some function for reformatting the buffer (such as an auto-styler), the following error is issued:

```
Error running timer: (wrong-type-argument consp #<marker at 1 in jbuild<src>>)
```

This error can also happen synchronously in `basic-save-buffer` rather than in a timer.

Reproduction recipe:

With `~/src/emacs/trunk` checked out to `9663c959c73d6cca0c56f833d80ff1d9e9708b70`:

1. emacs -Q -l ~/src/emacs/trunk/lisp/progmodes/eglot.el
2. Evaluate the following code:

```emacs-lisp
(add-hook 'before-save-hook #'no-op-file-formatter)

(defun no-op-file-formatter ()
  (let ((temp-file (make-temp-file "no-op-file-formatter")))
    (save-restriction
      (widen)
      (write-region nil nil temp-file)
      (insert-file-contents temp-file nil nil nil 'replace))))
```

This adds a dummy "reformatter" to `before-save-hook` that is always a no-op.

3. `C-x C-f /tmp/z.c`
4. `M-x eglot` (clangd must be installed, I suppose)
5. Make some trivial edits, then `C-x h DEL` to erase the buffer contents
6. `C-x C-s`

An error is issued as described above.  Also, since `eglot--recent-changes` now includes a malformatted entry, random other things break, too, for example just inserting a space character.  Backtrace included below.

I believe what is happening here, is that `insert-file-contents`, when inserting an empty file into an empty buffer (maybe in other situations as well), may cause `before-change-functions` to be run but `after-change-functions` never runs.  Therefore, `eglot--before-changes` inserts an element into `eglot--recent-changes` that `eglot--after-changes` never gets a chance to fix up.

According to the manual (https://www.gnu.org/software/emacs/manual/html_node/elisp/Change-Hooks.html), this is allowed to happen (i.e., `after-change-functions` might not always run after a change).

Backtrace for eglot--post-self-insert-hook:
```
Debugger entered--Lisp error: (wrong-type-argument consp #<marker at 1 in z.c>)
  json-serialize((:jsonrpc "2.0" :method "textDocument/didChange" :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")])) :false-object :json-false :null-object nil)
  jsonrpc--json-encode((:jsonrpc "2.0" :method "textDocument/didChange" :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")])))
  #f(compiled-function (arg1 &rest rest) "Send MESSAGE, a JSON object, to CONNECTION." #<bytecode -0x12f6683e8a694a20>)(#<eglot-lsp-server eglot-lsp-server-3450ea1> :method :textDocument/didChange :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")]))
  apply(#f(compiled-function (arg1 &rest rest) "Send MESSAGE, a JSON object, to CONNECTION." #<bytecode -0x12f6683e8a694a20>) #<eglot-lsp-server eglot-lsp-server-3450ea1> (:method :textDocument/didChange :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")])))
  jsonrpc-connection-send(#<eglot-lsp-server eglot-lsp-server-3450ea1> :method :textDocument/didChange :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")]))
  jsonrpc-notify(#<eglot-lsp-server eglot-lsp-server-3450ea1> :textDocument/didChange (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")]))
  (let* ((server (eglot--current-server-or-lose)) (sync-capability (eglot-server-capable :textDocumentSync)) (sync-kind (if (numberp sync-capability) sync-capability (plist-get sync-capability :change))) (full-sync-p (or (eq sync-kind 1) (eq :emacs-messup eglot--recent-changes)))) (jsonrpc-notify server :textDocument/didChange (list :textDocument (eglot--VersionedTextDocumentIdentifier) :contentChanges (if full-sync-p (vector (list ':text (save-excursion (save-restriction ... ...)))) (let* ((--cl-var-- (reverse eglot--recent-changes)) (beg nil) (end nil) (len nil) (text nil) (--cl-var--) (--cl-var-- [])) (while (consp --cl-var--) (progn (setq --cl-var-- ...) (setq beg ...) (setq end ...) (setq len ...) (setq text ...)) (setq --cl-var-- (vconcat --cl-var-- ...)) (setq --cl-var-- (cdr --cl-var--))) --cl-var--)))) (setq eglot--recent-changes nil) (jsonrpc--call-deferred server))
  (progn (let* ((server (eglot--current-server-or-lose)) (sync-capability (eglot-server-capable :textDocumentSync)) (sync-kind (if (numberp sync-capability) sync-capability (plist-get sync-capability :change))) (full-sync-p (or (eq sync-kind 1) (eq :emacs-messup eglot--recent-changes)))) (jsonrpc-notify server :textDocument/didChange (list :textDocument (eglot--VersionedTextDocumentIdentifier) :contentChanges (if full-sync-p (vector (list ':text (save-excursion ...))) (let* ((--cl-var-- ...) (beg nil) (end nil) (len nil) (text nil) (--cl-var--) (--cl-var-- ...)) (while (consp --cl-var--) (progn ... ... ... ... ...) (setq --cl-var-- ...) (setq --cl-var-- ...)) --cl-var--)))) (setq eglot--recent-changes nil) (jsonrpc--call-deferred server)))
  (if eglot--recent-changes (progn (let* ((server (eglot--current-server-or-lose)) (sync-capability (eglot-server-capable :textDocumentSync)) (sync-kind (if (numberp sync-capability) sync-capability (plist-get sync-capability :change))) (full-sync-p (or (eq sync-kind 1) (eq :emacs-messup eglot--recent-changes)))) (jsonrpc-notify server :textDocument/didChange (list :textDocument (eglot--VersionedTextDocumentIdentifier) :contentChanges (if full-sync-p (vector (list ... ...)) (let* (... ... ... ... ... ... ...) (while ... ... ... ...) --cl-var--)))) (setq eglot--recent-changes nil) (jsonrpc--call-deferred server))))
  eglot--signal-textDocument/didChange()
  (if immediate nil (eglot--signal-textDocument/didChange))
  (progn (if immediate nil (eglot--signal-textDocument/didChange)) (jsonrpc-request server method params :timeout timeout :cancel-on-input (cond ((and cancel-on-input eglot-advertise-cancellation) #'(lambda (id) (jsonrpc-notify server '$/cancelRequest (list ... id)))) (cancel-on-input)) :cancel-on-input-retval cancel-on-input-retval))
  (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '(:immediate :timeout :cancel-on-input :cancel-on-input-retval :allow-other-keys)) (if (cdr --cl-keys--) nil (error "Missing argument for %s" (car --cl-keys--))) (setq --cl-keys-- (cdr (cdr --cl-keys--)))) ((car (cdr (memq ... --cl-rest--))) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:immediate :timeout :cancel-on-input :cancel-on-input-retval)" (car --cl-keys--)))))) (progn (if immediate nil (eglot--signal-textDocument/didChange)) (jsonrpc-request server method params :timeout timeout :cancel-on-input (cond ((and cancel-on-input eglot-advertise-cancellation) #'(lambda (id) (jsonrpc-notify server ... ...))) (cancel-on-input)) :cancel-on-input-retval cancel-on-input-retval)))
  (let* ((immediate (car (cdr (plist-member --cl-rest-- ':immediate)))) (timeout (car (cdr (plist-member --cl-rest-- ':timeout)))) (cancel-on-input (car (cdr (plist-member --cl-rest-- ':cancel-on-input)))) (cancel-on-input-retval (car (cdr (plist-member --cl-rest-- ':cancel-on-input-retval))))) (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '...) (if (cdr --cl-keys--) nil (error "Missing argument for %s" ...)) (setq --cl-keys-- (cdr ...))) ((car (cdr ...)) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:immediate :timeout :cancel-on-input :cancel-on-input-retval)" (car --cl-keys--)))))) (progn (if immediate nil (eglot--signal-textDocument/didChange)) (jsonrpc-request server method params :timeout timeout :cancel-on-input (cond ((and cancel-on-input eglot-advertise-cancellation) #'(lambda ... ...)) (cancel-on-input)) :cancel-on-input-retval cancel-on-input-retval))))
  eglot--request(#<eglot-lsp-server eglot-lsp-server-3450ea1> :textDocument/onTypeFormatting (:textDocument (:uri "file:///tmp/z.c") :options (:tabSize 8 :insertSpaces :json-false :insertFinalNewline t :trimFinalNewlines t) :position (:line 1 :character 0) :ch "\n"))
  (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options (cons (list :tabSize tab-width :insertSpaces (if indent-tabs-mode :json-false t) :insertFinalNewline (if require-final-newline t :json-false) :trimFinalNewlines (if delete-trailing-lines t :json-false)) args))))) nil on-type-format)
  (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options (cons (list :tabSize tab-width :insertSpaces ... :insertFinalNewline ... :trimFinalNewlines ...) args))))) nil on-type-format))
  (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options (cons ... args))))) nil on-type-format)))
  (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options ...)))) nil on-type-format))))
  (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons ... ...))) nil on-type-format)))))
  (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument ...)) nil on-type-format))))))
  (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request ... method ...) nil on-type-format)))))))
  (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits ... nil on-type-format))))))))
  (let* ((x37 (car-safe val)) (x38 (cdr-safe val))) (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let (... ... ...) (progn ... ...))))))))
  (progn (ignore (consp val)) (let* ((x37 (car-safe val)) (x38 (cdr-safe val))) (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 ...) (x42 ...)) (progn (ignore ...) (let ... ...))))))))
  (let* ((val (cond ((and beg on-type-format) (list ':textDocument/onTypeFormatting ':documentOnTypeFormattingProvider (list ':position (eglot--pos-to-lsp-position beg) ':ch (string on-type-format)))) ((and beg end) (list ':textDocument/rangeFormatting ':documentRangeFormattingProvider (list ':range (list :start ... :end ...)))) (t '(:textDocument/formatting :documentFormattingProvider nil))))) (progn (ignore (consp val)) (let* ((x37 (car-safe val)) (x38 (cdr-safe val))) (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* (... ...) (progn ... ...))))))))
  eglot-format(2 nil 10)
  (progn (eglot-format (point) nil eglot--last-inserted-char))
  (if (and ot-provider (condition-case nil (progn (or (eq eglot--last-inserted-char (seq-first (plist-get ot-provider :firstTriggerCharacter))) (cl-find eglot--last-inserted-char (plist-get ot-provider :moreTriggerCharacter) :key #'seq-first))) (error nil))) (progn (eglot-format (point) nil eglot--last-inserted-char)))
  (let ((ot-provider (eglot-server-capable :documentOnTypeFormattingProvider))) (if (and ot-provider (condition-case nil (progn (or (eq eglot--last-inserted-char (seq-first ...)) (cl-find eglot--last-inserted-char (plist-get ot-provider :moreTriggerCharacter) :key #'seq-first))) (error nil))) (progn (eglot-format (point) nil eglot--last-inserted-char))))
  eglot--post-self-insert-hook()
  newline(nil 1)
  funcall-interactively(newline nil 1)
  command-execute(newline)
```


In GNU Emacs 30.1.50 (build 2, x86_64-pc-linux-gnu, X toolkit, cairo
 version 1.15.12, Xaw scroll bars) of 2025-03-28 built on
 igm-qws-u22796a
Repository revision: 3e6424e1f1816332e574035bc73143551a69efb6
Windowing system distributor 'The X.Org Foundation', version 11.0.12011000
System Description: Rocky Linux 8.10 (Green Obsidian)

Configured using:
 'configure --config-cache --with-x-toolkit=lucid --without-gpm
 --without-gconf --without-selinux --without-imagemagick --with-modules
 --with-gif=no --with-cairo --with-rsvg --without-compress-install
 --with-tree-sitter --with-native-compilation=aot
 --prefix=/usr/local/home/garnish/raw-emacs/30-20250328_130425'

Configured features:
CAIRO DBUS FREETYPE GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG LIBSYSTEMD
LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP
SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER X11 XDBE XIM
XINPUT2 XPM LUCID ZLIB

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

Major mode: Fundamental

Minor modes in effect:
  delete-selection-mode: t
  jane-fe-minor-mode: t
  dired-omit-mode: t
  editorconfig-mode: t
  mode-line-bell-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  context-menu-mode: t
  global-font-lock-mode: t
  blink-cursor-mode: t
  minibuffer-regexp-mode: t
  buffer-read-only: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/helm-4.0.2/helm-x-icons hides /usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/helm-core-4.0.2/helm-x-icons
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/helm-4.0.2/helm-packages hides /usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/helm-core-4.0.2/helm-packages
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/magit-4.3.1/magit-autorevert hides /usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/magit-section-4.3.1/magit-autorevert
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/transient-0.8.6/transient hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/transient
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/eglot-1.18/eglot hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/progmodes/eglot
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-texinfo hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-texinfo
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-publish hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-publish
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-org hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-org
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-odt hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-odt
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-md hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-md
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-man hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-man
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-latex hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-latex
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-koma-letter hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-koma-letter
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-icalendar hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-icalendar
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-html hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-html
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-beamer hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-beamer
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ox-ascii hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ox-ascii
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-version hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-version
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-timer hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-timer
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-tempo hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-tempo
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-table hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-table
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-src hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-src
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-refile hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-refile
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-protocol hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-protocol
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-plot hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-plot
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-persist hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-persist
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-pcomplete hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-pcomplete
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-num hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-num
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-mouse hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-mouse
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-mobile hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-mobile
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-macs hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-macs
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-macro hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-macro
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-loaddefs hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-loaddefs
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-list hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-list
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-lint hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-lint
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-keys hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-keys
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-inlinetask hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-inlinetask
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-indent hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-indent
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-id hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-id
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-habit hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-habit
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-goto hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-goto
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-footnote hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-footnote
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-fold hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-fold
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-fold-core hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-fold-core
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-feed hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-feed
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-faces hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-faces
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-entities hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-entities
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-element hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-element
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-element-ast hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-element-ast
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-duration hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-duration
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-datetree hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-datetree
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-cycle hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-cycle
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-ctags hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-ctags
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-crypt hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-crypt
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-compat hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-compat
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-colview hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-colview
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-clock hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-clock
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-capture hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-capture
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-attach hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-attach
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-attach-git hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-attach-git
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-archive hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-archive
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/org-agenda hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/org-agenda
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-w3m hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-w3m
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-rmail hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-rmail
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-mhe hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-mhe
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-man hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-man
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-irc hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-irc
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-info hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-info
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-gnus hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-gnus
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-eww hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-eww
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-eshell hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-eshell
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-doi hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-doi
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-docview hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-docview
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-bibtex hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-bibtex
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ol-bbdb hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ol-bbdb
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/oc hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/oc
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/oc-natbib hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/oc-natbib
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/oc-csl hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/oc-csl
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/oc-bibtex hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/oc-bibtex
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/oc-biblatex hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/oc-biblatex
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/oc-basic hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/oc-basic
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-tangle hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-tangle
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-table hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-table
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-sqlite hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-sqlite
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-sql hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-sql
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-shell hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-shell
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-sed hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-sed
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-screen hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-screen
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-scheme hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-scheme
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-sass hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-sass
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-ruby hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-ruby
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-ref hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-ref
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-python hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-python
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-processing hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-processing
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-plantuml hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-plantuml
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-perl hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-perl
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-org hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-org
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-octave hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-octave
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-ocaml hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-ocaml
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-maxima hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-maxima
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-matlab hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-matlab
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-makefile hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-makefile
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-lua hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-lua
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-lob hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-lob
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-lisp hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-lisp
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-lilypond hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-lilypond
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-latex hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-latex
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-julia hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-julia
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-js hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-js
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-java hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-java
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-haskell hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-haskell
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-groovy hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-groovy
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-gnuplot hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-gnuplot
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-fortran hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-fortran
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-forth hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-forth
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-exp hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-exp
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-eval hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-eval
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-eshell hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-eshell
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-emacs-lisp hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-emacs-lisp
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-dot hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-dot
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-ditaa hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-ditaa
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-css hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-css
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-core hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-core
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-comint hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-comint
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-clojure hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-clojure
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-calc hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-calc
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-awk hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-awk
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-R hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-R
/usr/local/home/azeng/workspaces/24833141-bffb-3c99-a9d6-c366d37c4f5e/+share+/app/emacs/site-lisp/elpa/org-9.7.27/ob-C hides /usr/local/home/garnish/raw-emacs/30-20250328_130425/share/emacs/30.1.50/lisp/org/ob-C

Features:
(shadow sort mail-extr emacsbug message yank-media rfc822 mml mml-sec
epa epg rfc6068 epg-config gnus-util time-date mm-decode mm-bodies
mm-encode mailabbrev gmm-utils mailheader sendmail mail-utils overseer
pkg-info url-http url-auth mail-parse rfc2231 rfc2047 rfc2045 mm-util
ietf-drums mail-prsvr url-gw nsm puny lisp-mnt epl dash site-start
jane-customization jane-which-key which-key delsel jane-fe-regex
jane-build-status jane-patdiff jane-diagnose jane-merlin merlin-xref
xref merlin-cap merlin hi-lock crm jane-async-merlin jane-completion
jane-yasnippet jane-fe-project jane-fe-feature-table imenu jane-fe-menu
ecaml_plugin view edmacro kmacro bookmark ecaml dired-x editorconfig
editorconfig-core editorconfig-core-handle editorconfig-fnmatch
mode-line-bell help-at-pt jane-micro-features server jane-diff
smerge-mode diff unified-test-mode shell-file dired dired-loaddefs
jane-sexp derived rainbow-delimiters jane-python jane-ocaml hydra advice
lv jane-aide diff-mode track-changes easy-mmode ert ewoc debug backtrace
find-func tuareg tuareg-compat tuareg-opam flymake project thingatpt
smie find-file compile text-property-search jane-cr jane-align shell
pcomplete comint ansi-osc ansi-color ring vc vc-dispatcher
jane-telemetry comp comp-cstr cl-extra help-mode warnings comp-run
comp-common jane-rust ocp-indent jane-eglot jane-elisp-loaddefs
jane-util jane-elpa-pin ace-jump-helm-line-autoloads ace-link-autoloads
aggressive-indent-autoloads ahk-mode-autoloads
all-the-icons-ivy-rich-autoloads auto-compile-autoloads
auto-dictionary-autoloads auto-highlight-symbol-autoloads
auto-yasnippet-autoloads base16-theme-autoloads
bash-completion-autoloads blacken-autoloads browse-at-remote-autoloads
centered-cursor-mode-autoloads clean-aindent-mode-autoloads
code-cells-autoloads column-enforce-mode-autoloads company-box-autoloads
company-lua-autoloads company-posframe-autoloads
company-quickhelp-autoloads company-shell-autoloads
company-statistics-autoloads company-web-autoloads
consult-yasnippet-autoloads corfu-autoloads counsel-css-autoloads
counsel-projectile-autoloads counsel-autoloads csv-mode-autoloads
dap-mode-autoloads bui-autoloads debbugs-autoloads define-word-autoloads
diff-hl-autoloads diminish-autoloads dired-quick-sort-autoloads
disable-mouse-autoloads doom-modeline-autoloads doom-themes-autoloads
dotenv-mode-autoloads drag-stuff-autoloads eat-autoloads
edit-indirect-autoloads eldoc-box-autoloads elisp-def-autoloads
elisp-slime-nav-autoloads embark-consult-autoloads consult-autoloads
embark-autoloads emmet-mode-autoloads emr-autoloads
clang-format-autoloads esh-help-autoloads eshell-prompt-extras-autoloads
eshell-z-autoloads ess-autoloads eval-sexp-fu-autoloads
evil-anzu-autoloads anzu-autoloads evil-args-autoloads
evil-cleverparens-autoloads evil-collection-autoloads annalist-autoloads
evil-easymotion-autoloads evil-escape-autoloads evil-exchange-autoloads
evil-goggles-autoloads evil-iedit-state-autoloads
evil-indent-plus-autoloads evil-lion-autoloads evil-lisp-state-autoloads
bind-map-autoloads evil-matchit-autoloads evil-mc-autoloads
evil-nerd-commenter-autoloads evil-numbers-autoloads evil-org-autoloads
evil-surround-autoloads evil-textobj-line-autoloads evil-tutor-autoloads
evil-visual-mark-mode-autoloads evil-visualstar-autoloads
expand-region-autoloads explain-pause-mode-autoloads eyebrowse-autoloads
fish-mode-autoloads flx-autoloads flycheck-bashate-autoloads
flycheck-eglot-autoloads eglot-autoloads flycheck-elsa-autoloads
flycheck-package-autoloads flycheck-pos-tip-autoloads
flyspell-correct-helm-autoloads flyspell-correct-ivy-autoloads
flyspell-correct-popup-autoloads flyspell-correct-autoloads
flyspell-popup-autoloads frame-local-autoloads fzf-autoloads
gh-md-autoloads git-gutter-autoloads git-link-autoloads
git-messenger-autoloads git-modes-autoloads git-timemachine-autoloads
gitignore-templates-autoloads gnu-elpa-keyring-update-autoloads
gnuplot-autoloads golden-ratio-autoloads goto-chg-autoloads
gruvbox-theme-autoloads autothemer-autoloads haskell-mode-autoloads
hc-zenburn-theme-autoloads helm-ag-autoloads helm-c-yasnippet-autoloads
helm-comint-autoloads helm-company-autoloads company-autoloads
helm-css-scss-autoloads helm-descbinds-autoloads helm-git-grep-autoloads
helm-make-autoloads helm-mode-manager-autoloads helm-org-autoloads
helm-easymenu helm-org-rifle-autoloads helm-projectile-autoloads
helm-purpose-autoloads helm-pydoc-autoloads helm-swoop-autoloads
helm-autoloads helm-themes-autoloads helm-core-autoloads
helpful-autoloads elisp-refs-autoloads highlight-indentation-autoloads
highlight-numbers-autoloads highlight-parentheses-autoloads
ibuffer-projectile-autoloads iedit-autoloads impatient-mode-autoloads
importmagic-autoloads epc-autoloads ctable-autoloads
concurrent-autoloads deferred-autoloads indent-guide-autoloads
ivy-avy-autoloads ivy-hydra-autoloads ivy-purpose-autoloads
ivy-rich-autoloads ivy-xref-autoloads ivy-yasnippet-autoloads
js-doc-autoloads js2-refactor-autoloads json-mode-autoloads
json-navigator-autoloads json-reformat-autoloads json-snatcher-autoloads
jsonnet-mode-autoloads ligature-autoloads link-hint-autoloads
livid-mode-autoloads lorem-ipsum-autoloads lsp-docker-autoloads
lsp-treemacs-autoloads lsp-mode-autoloads lua-mode-autoloads
macrostep-autoloads magit-gitflow-autoloads magit-popup-autoloads
magit-svn-autoloads magit-todos-autoloads hl-todo-autoloads
marginalia-autoloads markdown-toc-autoloads material-theme-autoloads
merlin-eldoc-autoloads merlin-autoloads mode-line-bell-autoloads
monokai-theme-autoloads multi-line-autoloads multi-term-autoloads
multiple-cursors-autoloads mwim-autoloads nameless-autoloads
nerd-icons-autoloads nix-mode-autoloads nodejs-repl-autoloads
npm-mode-autoloads ob-powershell-autoloads ocp-indent-autoloads
open-junk-file-autoloads orderless-autoloads org-appear-autoloads
org-cliplink-autoloads org-contrib-autoloads org-download-autoloads
org-mime-autoloads org-modern-autoloads org-pomodoro-autoloads
org-present-autoloads org-projectile-autoloads
org-project-capture-autoloads org-category-capture-autoloads
org-re-reveal-autoloads htmlize-autoloads org-rich-yank-autoloads
org-roam-autoloads org-sticky-header-autoloads org-superstar-autoloads
org-transclusion-autoloads org-wild-notifier-autoloads async-autoloads
alert-autoloads log4e-autoloads gntp-autoloads orgit-forge-autoloads
orgit-autoloads forge-autoloads ghub-autoloads closql-autoloads
emacsql-autoloads overseer-autoloads ox-gfm-autoloads ox-jira-autoloads
org-autoloads package-lint-autoloads paradox-autoloads paredit-autoloads
parent-mode-autoloads pcre2el-autoloads persistent-scratch-autoloads
pip-requirements-autoloads pippel-autoloads pkg-info-autoloads
epl-autoloads poly-markdown-autoloads polymode-autoloads popup-autoloads
popwin-autoloads pos-tip-autoloads powershell-autoloads
prettier-js-autoloads protobuf-mode-autoloads pug-mode-autoloads
py-isort-autoloads pydoc-autoloads pytest-autoloads pyvenv-autoloads
quickrun-autoloads rainbow-delimiters-autoloads rg-autoloads
ron-mode-autoloads rustic-autoloads flycheck-autoloads
markdown-mode-autoloads rust-mode-autoloads sass-mode-autoloads
haml-mode-autoloads scss-mode-autoloads shell-pop-autoloads
shfmt-autoloads reformatter-autoloads shrink-path-autoloads f-autoloads
shut-up-autoloads skewer-mode-autoloads js2-mode-autoloads
simple-httpd-autoloads slim-mode-autoloads smartparens-autoloads
smeargle-autoloads smex-autoloads sml-mode-autoloads
solarized-theme-autoloads sphinx-doc-autoloads spinner-autoloads
string-edit-at-point-autoloads string-inflection-autoloads
swiper-autoloads ivy-autoloads symbol-overlay-autoloads
tagedit-autoloads term-cursor-autoloads terminal-here-autoloads
toc-org-autoloads toml-mode-autoloads treemacs-all-the-icons-autoloads
all-the-icons-autoloads treemacs-evil-autoloads evil-autoloads
treemacs-icons-dired-autoloads treemacs-magit-autoloads magit-autoloads
pcase transient-autoloads magit-section-autoloads llama-autoloads
treemacs-persp-autoloads persp-mode-autoloads
treemacs-projectile-autoloads treemacs-autoloads cfrs-autoloads
ht-autoloads hydra-autoloads lv-autoloads pfuture-autoloads
ace-window-autoloads avy-autoloads s-autoloads projectile-autoloads
treepy-autoloads typescript-mode-autoloads undo-fu-autoloads
undo-fu-session-autoloads unfill-autoloads unicode-fonts-autoloads
ucs-utils-autoloads font-utils-autoloads persistent-soft-autoloads
list-utils-autoloads pcache-autoloads urgrep-autoloads utop-autoloads
tuareg-autoloads rx uuidgen-autoloads valign-autoloads
vba-mode-autoloads verb-autoloads vertico-autoloads
vi-tilde-fringe-autoloads vmd-mode-autoloads
volatile-highlights-autoloads vundo-autoloads web-beautify-autoloads
web-completion-data-autoloads web-mode-autoloads wfnames-autoloads
wgrep-autoloads which-key-posframe-autoloads posframe-autoloads
window-purpose-autoloads imenu-list-autoloads winum-autoloads
dash-autoloads with-editor-autoloads info writeroom-mode-autoloads
visual-fill-column-autoloads ws-butler-autoloads xterm-color-autoloads
yaml-autoloads yasnippet-snippets-autoloads yasnippet-autoloads
zenburn-theme-autoloads finder-inf package browse-url url url-proxy
url-privacy url-expand url-methods url-history url-cookie
generate-lisp-file url-domsuf url-util mailcap url-handlers url-parse
auth-source cl-seq eieio eieio-core cl-macs password-cache json subr-x
map byte-opt gv bytecomp byte-compile url-vars cus-edit pp cus-load
icons wid-edit 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 touch-screen tool-bar dnd
fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow
isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax
font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads dbusbind inotify
dynamic-setting system-font-setting font-render-setting cairo x-toolkit
xinput2 x multi-tty move-toolbar make-network-process native-compile
emacs)

Memory information:
((conses 16 391760 54534) (symbols 48 32259 0) (strings 32 94496 6285)
 (string-bytes 1 3916931) (vectors 16 39356)
 (vector-slots 8 402217 40518) (floats 8 112 0) (intervals 56 900 0)
 (buffers 992 12))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#77658; Package emacs. (Wed, 09 Apr 2025 12:11:02 GMT) Full text and rfc822 format available.

Message #8 received at 77658 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Aaron Zeng <azeng <at> janestreet.com>,
 João Távora <joaotavora <at> gmail.com>
Cc: 77658 <at> debbugs.gnu.org, app-emacs-dev <at> janestreet.com
Subject: Re: bug#77658: 30.1.50;
 Eglot: wrong-type-argument: consp, #<marker at 1 in file> when saving
Date: Wed, 09 Apr 2025 15:09:40 +0300
> Cc: app-emacs-dev <at> janestreet.com
> Date: Tue, 08 Apr 2025 18:05:27 -0400
> From:  Aaron Zeng via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org>
> 
> 
> When saving an empty buffer, and while `before-save-hook` has some function for reformatting the buffer (such as an auto-styler), the following error is issued:
> 
> ```
> Error running timer: (wrong-type-argument consp #<marker at 1 in jbuild<src>>)
> ```
> 
> This error can also happen synchronously in `basic-save-buffer` rather than in a timer.

Adding João.

> Reproduction recipe:
> 
> With `~/src/emacs/trunk` checked out to `9663c959c73d6cca0c56f833d80ff1d9e9708b70`:
> 
> 1. emacs -Q -l ~/src/emacs/trunk/lisp/progmodes/eglot.el
> 2. Evaluate the following code:
> 
> ```emacs-lisp
> (add-hook 'before-save-hook #'no-op-file-formatter)
> 
> (defun no-op-file-formatter ()
>   (let ((temp-file (make-temp-file "no-op-file-formatter")))
>     (save-restriction
>       (widen)
>       (write-region nil nil temp-file)
>       (insert-file-contents temp-file nil nil nil 'replace))))
> ```
> 
> This adds a dummy "reformatter" to `before-save-hook` that is always a no-op.
> 
> 3. `C-x C-f /tmp/z.c`
> 4. `M-x eglot` (clangd must be installed, I suppose)
> 5. Make some trivial edits, then `C-x h DEL` to erase the buffer contents
> 6. `C-x C-s`
> 
> An error is issued as described above.  Also, since `eglot--recent-changes` now includes a malformatted entry, random other things break, too, for example just inserting a space character.  Backtrace included below.
> 
> I believe what is happening here, is that `insert-file-contents`, when inserting an empty file into an empty buffer (maybe in other situations as well), may cause `before-change-functions` to be run but `after-change-functions` never runs.  Therefore, `eglot--before-changes` inserts an element into `eglot--recent-changes` that `eglot--after-changes` never gets a chance to fix up.
> 
> According to the manual (https://www.gnu.org/software/emacs/manual/html_node/elisp/Change-Hooks.html), this is allowed to happen (i.e., `after-change-functions` might not always run after a change).
> 
> Backtrace for eglot--post-self-insert-hook:
> ```
> Debugger entered--Lisp error: (wrong-type-argument consp #<marker at 1 in z.c>)
>   json-serialize((:jsonrpc "2.0" :method "textDocument/didChange" :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")])) :false-object :json-false :null-object nil)
>   jsonrpc--json-encode((:jsonrpc "2.0" :method "textDocument/didChange" :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")])))
>   #f(compiled-function (arg1 &rest rest) "Send MESSAGE, a JSON object, to CONNECTION." #<bytecode -0x12f6683e8a694a20>)(#<eglot-lsp-server eglot-lsp-server-3450ea1> :method :textDocument/didChange :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")]))
>   apply(#f(compiled-function (arg1 &rest rest) "Send MESSAGE, a JSON object, to CONNECTION." #<bytecode -0x12f6683e8a694a20>) #<eglot-lsp-server eglot-lsp-server-3450ea1> (:method :textDocument/didChange :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")])))
>   jsonrpc-connection-send(#<eglot-lsp-server eglot-lsp-server-3450ea1> :method :textDocument/didChange :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")]))
>   jsonrpc-notify(#<eglot-lsp-server eglot-lsp-server-3450ea1> :textDocument/didChange (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")]))
>   (let* ((server (eglot--current-server-or-lose)) (sync-capability (eglot-server-capable :textDocumentSync)) (sync-kind (if (numberp sync-capability) sync-capability (plist-get sync-capability :change))) (full-sync-p (or (eq sync-kind 1) (eq :emacs-messup eglot--recent-changes)))) (jsonrpc-notify server :textDocument/didChange (list :textDocument (eglot--VersionedTextDocumentIdentifier) :contentChanges (if full-sync-p (vector (list ':text (save-excursion (save-restriction ... ...)))) (let* ((--cl-var-- (reverse eglot--recent-changes)) (beg nil) (end nil) (len nil) (text nil) (--cl-var--) (--cl-var-- [])) (while (consp --cl-var--) (progn (setq --cl-var-- ...) (setq beg ...) (setq end ...) (setq len ...) (setq text ...)) (setq --cl-var-- (vconcat --cl-var-- ...)) (setq --cl-var-- (cdr --cl-var--))) --cl-var--)))) (setq eglot--recent-changes nil) (jsonrpc--call-deferred server))
>   (progn (let* ((server (eglot--current-server-or-lose)) (sync-capability (eglot-server-capable :textDocumentSync)) (sync-kind (if (numberp sync-capability) sync-capability (plist-get sync-capability :change))) (full-sync-p (or (eq sync-kind 1) (eq :emacs-messup eglot--recent-changes)))) (jsonrpc-notify server :textDocument/didChange (list :textDocument (eglot--VersionedTextDocumentIdentifier) :contentChanges (if full-sync-p (vector (list ':text (save-excursion ...))) (let* ((--cl-var-- ...) (beg nil) (end nil) (len nil) (text nil) (--cl-var--) (--cl-var-- ...)) (while (consp --cl-var--) (progn ... ... ... ... ...) (setq --cl-var-- ...) (setq --cl-var-- ...)) --cl-var--)))) (setq eglot--recent-changes nil) (jsonrpc--call-deferred server)))
>   (if eglot--recent-changes (progn (let* ((server (eglot--current-server-or-lose)) (sync-capability (eglot-server-capable :textDocumentSync)) (sync-kind (if (numberp sync-capability) sync-capability (plist-get sync-capability :change))) (full-sync-p (or (eq sync-kind 1) (eq :emacs-messup eglot--recent-changes)))) (jsonrpc-notify server :textDocument/didChange (list :textDocument (eglot--VersionedTextDocumentIdentifier) :contentChanges (if full-sync-p (vector (list ... ...)) (let* (... ... ... ... ... ... ...) (while ... ... ... ...) --cl-var--)))) (setq eglot--recent-changes nil) (jsonrpc--call-deferred server))))
>   eglot--signal-textDocument/didChange()
>   (if immediate nil (eglot--signal-textDocument/didChange))
>   (progn (if immediate nil (eglot--signal-textDocument/didChange)) (jsonrpc-request server method params :timeout timeout :cancel-on-input (cond ((and cancel-on-input eglot-advertise-cancellation) #'(lambda (id) (jsonrpc-notify server '$/cancelRequest (list ... id)))) (cancel-on-input)) :cancel-on-input-retval cancel-on-input-retval))
>   (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '(:immediate :timeout :cancel-on-input :cancel-on-input-retval :allow-other-keys)) (if (cdr --cl-keys--) nil (error "Missing argument for %s" (car --cl-keys--))) (setq --cl-keys-- (cdr (cdr --cl-keys--)))) ((car (cdr (memq ... --cl-rest--))) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:immediate :timeout :cancel-on-input :cancel-on-input-retval)" (car --cl-keys--)))))) (progn (if immediate nil (eglot--signal-textDocument/didChange)) (jsonrpc-request server method params :timeout timeout :cancel-on-input (cond ((and cancel-on-input eglot-advertise-cancellation) #'(lambda (id) (jsonrpc-notify server ... ...))) (cancel-on-input)) :cancel-on-input-retval cancel-on-input-retval)))
>   (let* ((immediate (car (cdr (plist-member --cl-rest-- ':immediate)))) (timeout (car (cdr (plist-member --cl-rest-- ':timeout)))) (cancel-on-input (car (cdr (plist-member --cl-rest-- ':cancel-on-input)))) (cancel-on-input-retval (car (cdr (plist-member --cl-rest-- ':cancel-on-input-retval))))) (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '...) (if (cdr --cl-keys--) nil (error "Missing argument for %s" ...)) (setq --cl-keys-- (cdr ...))) ((car (cdr ...)) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:immediate :timeout :cancel-on-input :cancel-on-input-retval)" (car --cl-keys--)))))) (progn (if immediate nil (eglot--signal-textDocument/didChange)) (jsonrpc-request server method params :timeout timeout :cancel-on-input (cond ((and cancel-on-input eglot-advertise-cancellation) #'(lambda ... ...)) (cancel-on-input)) :cancel-on-input-retval cancel-on-input-retval))))
>   eglot--request(#<eglot-lsp-server eglot-lsp-server-3450ea1> :textDocument/onTypeFormatting (:textDocument (:uri "file:///tmp/z.c") :options (:tabSize 8 :insertSpaces :json-false :insertFinalNewline t :trimFinalNewlines t) :position (:line 1 :character 0) :ch "\n"))
>   (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options (cons (list :tabSize tab-width :insertSpaces (if indent-tabs-mode :json-false t) :insertFinalNewline (if require-final-newline t :json-false) :trimFinalNewlines (if delete-trailing-lines t :json-false)) args))))) nil on-type-format)
>   (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options (cons (list :tabSize tab-width :insertSpaces ... :insertFinalNewline ... :trimFinalNewlines ...) args))))) nil on-type-format))
>   (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options (cons ... args))))) nil on-type-format)))
>   (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options ...)))) nil on-type-format))))
>   (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons ... ...))) nil on-type-format)))))
>   (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument ...)) nil on-type-format))))))
>   (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request ... method ...) nil on-type-format)))))))
>   (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits ... nil on-type-format))))))))
>   (let* ((x37 (car-safe val)) (x38 (cdr-safe val))) (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let (... ... ...) (progn ... ...))))))))
>   (progn (ignore (consp val)) (let* ((x37 (car-safe val)) (x38 (cdr-safe val))) (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 ...) (x42 ...)) (progn (ignore ...) (let ... ...))))))))
>   (let* ((val (cond ((and beg on-type-format) (list ':textDocument/onTypeFormatting ':documentOnTypeFormattingProvider (list ':position (eglot--pos-to-lsp-position beg) ':ch (string on-type-format)))) ((and beg end) (list ':textDocument/rangeFormatting ':documentRangeFormattingProvider (list ':range (list :start ... :end ...)))) (t '(:textDocument/formatting :documentFormattingProvider nil))))) (progn (ignore (consp val)) (let* ((x37 (car-safe val)) (x38 (cdr-safe val))) (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* (... ...) (progn ... ...))))))))
>   eglot-format(2 nil 10)
>   (progn (eglot-format (point) nil eglot--last-inserted-char))
>   (if (and ot-provider (condition-case nil (progn (or (eq eglot--last-inserted-char (seq-first (plist-get ot-provider :firstTriggerCharacter))) (cl-find eglot--last-inserted-char (plist-get ot-provider :moreTriggerCharacter) :key #'seq-first))) (error nil))) (progn (eglot-format (point) nil eglot--last-inserted-char)))
>   (let ((ot-provider (eglot-server-capable :documentOnTypeFormattingProvider))) (if (and ot-provider (condition-case nil (progn (or (eq eglot--last-inserted-char (seq-first ...)) (cl-find eglot--last-inserted-char (plist-get ot-provider :moreTriggerCharacter) :key #'seq-first))) (error nil))) (progn (eglot-format (point) nil eglot--last-inserted-char))))
>   eglot--post-self-insert-hook()
>   newline(nil 1)
>   funcall-interactively(newline nil 1)
>   command-execute(newline)
> ```
> 
> 
> In GNU Emacs 30.1.50 (build 2, x86_64-pc-linux-gnu, X toolkit, cairo
>  version 1.15.12, Xaw scroll bars) of 2025-03-28 built on
>  igm-qws-u22796a
> Repository revision: 3e6424e1f1816332e574035bc73143551a69efb6
> Windowing system distributor 'The X.Org Foundation', version 11.0.12011000
> System Description: Rocky Linux 8.10 (Green Obsidian)
> 
> Configured using:
>  'configure --config-cache --with-x-toolkit=lucid --without-gpm
>  --without-gconf --without-selinux --without-imagemagick --with-modules
>  --with-gif=no --with-cairo --with-rsvg --without-compress-install
>  --with-tree-sitter --with-native-compilation=aot
>  --prefix=/usr/local/home/garnish/raw-emacs/30-20250328_130425'
> 
> Configured features:
> CAIRO DBUS FREETYPE GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG LIBSYSTEMD
> LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP
> SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER X11 XDBE XIM
> XINPUT2 XPM LUCID ZLIB
> 
> Important settings:
>   value of $LANG: en_US.utf8
>   locale-coding-system: utf-8-unix
> 
> Major mode: Fundamental




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#77658; Package emacs. (Sat, 26 Apr 2025 11:09:02 GMT) Full text and rfc822 format available.

Message #11 received at 77658 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: azeng <at> janestreet.com, joaotavora <at> gmail.com
Cc: 77658 <at> debbugs.gnu.org, app-emacs-dev <at> janestreet.com
Subject: Re: bug#77658: 30.1.50;
 Eglot: wrong-type-argument: consp, #<marker at 1 in file> when saving
Date: Sat, 26 Apr 2025 14:08:37 +0300
Ping!  João, any suggestions or comments?

> Cc: 77658 <at> debbugs.gnu.org, app-emacs-dev <at> janestreet.com
> Date: Wed, 09 Apr 2025 15:09:40 +0300
> From: Eli Zaretskii <eliz <at> gnu.org>
> 
> > Cc: app-emacs-dev <at> janestreet.com
> > Date: Tue, 08 Apr 2025 18:05:27 -0400
> > From:  Aaron Zeng via "Bug reports for GNU Emacs,
> >  the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org>
> > 
> > 
> > When saving an empty buffer, and while `before-save-hook` has some function for reformatting the buffer (such as an auto-styler), the following error is issued:
> > 
> > ```
> > Error running timer: (wrong-type-argument consp #<marker at 1 in jbuild<src>>)
> > ```
> > 
> > This error can also happen synchronously in `basic-save-buffer` rather than in a timer.
> 
> Adding João.
> 
> > Reproduction recipe:
> > 
> > With `~/src/emacs/trunk` checked out to `9663c959c73d6cca0c56f833d80ff1d9e9708b70`:
> > 
> > 1. emacs -Q -l ~/src/emacs/trunk/lisp/progmodes/eglot.el
> > 2. Evaluate the following code:
> > 
> > ```emacs-lisp
> > (add-hook 'before-save-hook #'no-op-file-formatter)
> > 
> > (defun no-op-file-formatter ()
> >   (let ((temp-file (make-temp-file "no-op-file-formatter")))
> >     (save-restriction
> >       (widen)
> >       (write-region nil nil temp-file)
> >       (insert-file-contents temp-file nil nil nil 'replace))))
> > ```
> > 
> > This adds a dummy "reformatter" to `before-save-hook` that is always a no-op.
> > 
> > 3. `C-x C-f /tmp/z.c`
> > 4. `M-x eglot` (clangd must be installed, I suppose)
> > 5. Make some trivial edits, then `C-x h DEL` to erase the buffer contents
> > 6. `C-x C-s`
> > 
> > An error is issued as described above.  Also, since `eglot--recent-changes` now includes a malformatted entry, random other things break, too, for example just inserting a space character.  Backtrace included below.
> > 
> > I believe what is happening here, is that `insert-file-contents`, when inserting an empty file into an empty buffer (maybe in other situations as well), may cause `before-change-functions` to be run but `after-change-functions` never runs.  Therefore, `eglot--before-changes` inserts an element into `eglot--recent-changes` that `eglot--after-changes` never gets a chance to fix up.
> > 
> > According to the manual (https://www.gnu.org/software/emacs/manual/html_node/elisp/Change-Hooks.html), this is allowed to happen (i.e., `after-change-functions` might not always run after a change).
> > 
> > Backtrace for eglot--post-self-insert-hook:
> > ```
> > Debugger entered--Lisp error: (wrong-type-argument consp #<marker at 1 in z.c>)
> >   json-serialize((:jsonrpc "2.0" :method "textDocument/didChange" :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")])) :false-object :json-false :null-object nil)
> >   jsonrpc--json-encode((:jsonrpc "2.0" :method "textDocument/didChange" :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")])))
> >   #f(compiled-function (arg1 &rest rest) "Send MESSAGE, a JSON object, to CONNECTION." #<bytecode -0x12f6683e8a694a20>)(#<eglot-lsp-server eglot-lsp-server-3450ea1> :method :textDocument/didChange :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")]))
> >   apply(#f(compiled-function (arg1 &rest rest) "Send MESSAGE, a JSON object, to CONNECTION." #<bytecode -0x12f6683e8a694a20>) #<eglot-lsp-server eglot-lsp-server-3450ea1> (:method :textDocument/didChange :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")])))
> >   jsonrpc-connection-send(#<eglot-lsp-server eglot-lsp-server-3450ea1> :method :textDocument/didChange :params (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")]))
> >   jsonrpc-notify(#<eglot-lsp-server eglot-lsp-server-3450ea1> :textDocument/didChange (:textDocument (:uri "file:///tmp/z.c" :version 8) :contentChanges [(:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength (1 . #<marker at 1 in z.c>) :text (1 . #<marker (moves after insertion) at 3 in z.c>)) (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text " ") (:range (:start (:line 0 :character 1) :end (:line 0 :character 1)) :rangeLength 0 :text "\n") (:range (:start (:line 0 :character 0) :end (:line 0 :character 1)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 1 :character 0)) :rangeLength 0 :text "\n") (:range (:start (:line 1 :character 0) :end (:line 2 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 1 :character 0)) :rangeLength 1 :text "") (:range (:start (:line 0 :character 0) :end (:line 0 :character 0)) :rangeLength 0 :text "\n")]))
> >   (let* ((server (eglot--current-server-or-lose)) (sync-capability (eglot-server-capable :textDocumentSync)) (sync-kind (if (numberp sync-capability) sync-capability (plist-get sync-capability :change))) (full-sync-p (or (eq sync-kind 1) (eq :emacs-messup eglot--recent-changes)))) (jsonrpc-notify server :textDocument/didChange (list :textDocument (eglot--VersionedTextDocumentIdentifier) :contentChanges (if full-sync-p (vector (list ':text (save-excursion (save-restriction ... ...)))) (let* ((--cl-var-- (reverse eglot--recent-changes)) (beg nil) (end nil) (len nil) (text nil) (--cl-var--) (--cl-var-- [])) (while (consp --cl-var--) (progn (setq --cl-var-- ...) (setq beg ...) (setq end ...) (setq len ...) (setq text ...)) (setq --cl-var-- (vconcat --cl-var-- ...)) (setq --cl-var-- (cdr --cl-var--))) --cl-var--)))) (setq eglot--recent-changes nil) (jsonrpc--call-deferred server))
> >   (progn (let* ((server (eglot--current-server-or-lose)) (sync-capability (eglot-server-capable :textDocumentSync)) (sync-kind (if (numberp sync-capability) sync-capability (plist-get sync-capability :change))) (full-sync-p (or (eq sync-kind 1) (eq :emacs-messup eglot--recent-changes)))) (jsonrpc-notify server :textDocument/didChange (list :textDocument (eglot--VersionedTextDocumentIdentifier) :contentChanges (if full-sync-p (vector (list ':text (save-excursion ...))) (let* ((--cl-var-- ...) (beg nil) (end nil) (len nil) (text nil) (--cl-var--) (--cl-var-- ...)) (while (consp --cl-var--) (progn ... ... ... ... ...) (setq --cl-var-- ...) (setq --cl-var-- ...)) --cl-var--)))) (setq eglot--recent-changes nil) (jsonrpc--call-deferred server)))
> >   (if eglot--recent-changes (progn (let* ((server (eglot--current-server-or-lose)) (sync-capability (eglot-server-capable :textDocumentSync)) (sync-kind (if (numberp sync-capability) sync-capability (plist-get sync-capability :change))) (full-sync-p (or (eq sync-kind 1) (eq :emacs-messup eglot--recent-changes)))) (jsonrpc-notify server :textDocument/didChange (list :textDocument (eglot--VersionedTextDocumentIdentifier) :contentChanges (if full-sync-p (vector (list ... ...)) (let* (... ... ... ... ... ... ...) (while ... ... ... ...) --cl-var--)))) (setq eglot--recent-changes nil) (jsonrpc--call-deferred server))))
> >   eglot--signal-textDocument/didChange()
> >   (if immediate nil (eglot--signal-textDocument/didChange))
> >   (progn (if immediate nil (eglot--signal-textDocument/didChange)) (jsonrpc-request server method params :timeout timeout :cancel-on-input (cond ((and cancel-on-input eglot-advertise-cancellation) #'(lambda (id) (jsonrpc-notify server '$/cancelRequest (list ... id)))) (cancel-on-input)) :cancel-on-input-retval cancel-on-input-retval))
> >   (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '(:immediate :timeout :cancel-on-input :cancel-on-input-retval :allow-other-keys)) (if (cdr --cl-keys--) nil (error "Missing argument for %s" (car --cl-keys--))) (setq --cl-keys-- (cdr (cdr --cl-keys--)))) ((car (cdr (memq ... --cl-rest--))) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:immediate :timeout :cancel-on-input :cancel-on-input-retval)" (car --cl-keys--)))))) (progn (if immediate nil (eglot--signal-textDocument/didChange)) (jsonrpc-request server method params :timeout timeout :cancel-on-input (cond ((and cancel-on-input eglot-advertise-cancellation) #'(lambda (id) (jsonrpc-notify server ... ...))) (cancel-on-input)) :cancel-on-input-retval cancel-on-input-retval)))
> >   (let* ((immediate (car (cdr (plist-member --cl-rest-- ':immediate)))) (timeout (car (cdr (plist-member --cl-rest-- ':timeout)))) (cancel-on-input (car (cdr (plist-member --cl-rest-- ':cancel-on-input)))) (cancel-on-input-retval (car (cdr (plist-member --cl-rest-- ':cancel-on-input-retval))))) (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '...) (if (cdr --cl-keys--) nil (error "Missing argument for %s" ...)) (setq --cl-keys-- (cdr ...))) ((car (cdr ...)) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:immediate :timeout :cancel-on-input :cancel-on-input-retval)" (car --cl-keys--)))))) (progn (if immediate nil (eglot--signal-textDocument/didChange)) (jsonrpc-request server method params :timeout timeout :cancel-on-input (cond ((and cancel-on-input eglot-advertise-cancellation) #'(lambda ... ...)) (cancel-on-input)) :cancel-on-input-retval cancel-on-input-retval))))
> >   eglot--request(#<eglot-lsp-server eglot-lsp-server-3450ea1> :textDocument/onTypeFormatting (:textDocument (:uri "file:///tmp/z.c") :options (:tabSize 8 :insertSpaces :json-false :insertFinalNewline t :trimFinalNewlines t) :position (:line 1 :character 0) :ch "\n"))
> >   (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options (cons (list :tabSize tab-width :insertSpaces (if indent-tabs-mode :json-false t) :insertFinalNewline (if require-final-newline t :json-false) :trimFinalNewlines (if delete-trailing-lines t :json-false)) args))))) nil on-type-format)
> >   (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options (cons (list :tabSize tab-width :insertSpaces ... :insertFinalNewline ... :trimFinalNewlines ...) args))))) nil on-type-format))
> >   (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options (cons ... args))))) nil on-type-format)))
> >   (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons (eglot--TextDocumentIdentifier) (cons :options ...)))) nil on-type-format))))
> >   (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument (cons ... ...))) nil on-type-format)))))
> >   (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request (eglot--current-server-or-lose) method (cons :textDocument ...)) nil on-type-format))))))
> >   (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits (eglot--request ... method ...) nil on-type-format)))))))
> >   (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let ((method x37) (cap x39) (args x41)) (progn (eglot-server-capable-or-lose cap) (eglot--apply-text-edits ... nil on-type-format))))))))
> >   (let* ((x37 (car-safe val)) (x38 (cdr-safe val))) (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 (car-safe x40)) (x42 (cdr-safe x40))) (progn (ignore (null x42)) (let (... ... ...) (progn ... ...))))))))
> >   (progn (ignore (consp val)) (let* ((x37 (car-safe val)) (x38 (cdr-safe val))) (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* ((x41 ...) (x42 ...)) (progn (ignore ...) (let ... ...))))))))
> >   (let* ((val (cond ((and beg on-type-format) (list ':textDocument/onTypeFormatting ':documentOnTypeFormattingProvider (list ':position (eglot--pos-to-lsp-position beg) ':ch (string on-type-format)))) ((and beg end) (list ':textDocument/rangeFormatting ':documentRangeFormattingProvider (list ':range (list :start ... :end ...)))) (t '(:textDocument/formatting :documentFormattingProvider nil))))) (progn (ignore (consp val)) (let* ((x37 (car-safe val)) (x38 (cdr-safe val))) (progn (ignore (consp x38)) (let* ((x39 (car-safe x38)) (x40 (cdr-safe x38))) (progn (ignore (consp x40)) (let* (... ...) (progn ... ...))))))))
> >   eglot-format(2 nil 10)
> >   (progn (eglot-format (point) nil eglot--last-inserted-char))
> >   (if (and ot-provider (condition-case nil (progn (or (eq eglot--last-inserted-char (seq-first (plist-get ot-provider :firstTriggerCharacter))) (cl-find eglot--last-inserted-char (plist-get ot-provider :moreTriggerCharacter) :key #'seq-first))) (error nil))) (progn (eglot-format (point) nil eglot--last-inserted-char)))
> >   (let ((ot-provider (eglot-server-capable :documentOnTypeFormattingProvider))) (if (and ot-provider (condition-case nil (progn (or (eq eglot--last-inserted-char (seq-first ...)) (cl-find eglot--last-inserted-char (plist-get ot-provider :moreTriggerCharacter) :key #'seq-first))) (error nil))) (progn (eglot-format (point) nil eglot--last-inserted-char))))
> >   eglot--post-self-insert-hook()
> >   newline(nil 1)
> >   funcall-interactively(newline nil 1)
> >   command-execute(newline)
> > ```
> > 
> > 
> > In GNU Emacs 30.1.50 (build 2, x86_64-pc-linux-gnu, X toolkit, cairo
> >  version 1.15.12, Xaw scroll bars) of 2025-03-28 built on
> >  igm-qws-u22796a
> > Repository revision: 3e6424e1f1816332e574035bc73143551a69efb6
> > Windowing system distributor 'The X.Org Foundation', version 11.0.12011000
> > System Description: Rocky Linux 8.10 (Green Obsidian)
> > 
> > Configured using:
> >  'configure --config-cache --with-x-toolkit=lucid --without-gpm
> >  --without-gconf --without-selinux --without-imagemagick --with-modules
> >  --with-gif=no --with-cairo --with-rsvg --without-compress-install
> >  --with-tree-sitter --with-native-compilation=aot
> >  --prefix=/usr/local/home/garnish/raw-emacs/30-20250328_130425'
> > 
> > Configured features:
> > CAIRO DBUS FREETYPE GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG LIBSYSTEMD
> > LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP
> > SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER X11 XDBE XIM
> > XINPUT2 XPM LUCID ZLIB
> > 
> > Important settings:
> >   value of $LANG: en_US.utf8
> >   locale-coding-system: utf-8-unix
> > 
> > Major mode: Fundamental
> 
> 
> 
> 




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#77658; Package emacs. (Sat, 26 Apr 2025 11:52:01 GMT) Full text and rfc822 format available.

Message #14 received at 77658 <at> debbugs.gnu.org (full text, mbox):

From: João Távora <joaotavora <at> gmail.com>
To: Eli Zaretskii <eliz <at> gnu.org>, Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 77658 <at> debbugs.gnu.org, app-emacs-dev <at> janestreet.com, azeng <at> janestreet.com
Subject: Re: bug#77658: 30.1.50; Eglot: wrong-type-argument: consp, #<marker
 at 1 in file> when saving
Date: Sat, 26 Apr 2025 12:51:35 +0100
On Sat, Apr 26, 2025 at 12:08 PM Eli Zaretskii <eliz <at> gnu.org> wrote:
>
> Ping!  João, any suggestions or comments?

I think Aaron is on the right track by identifying this as a mismatch
between before-change-functions and after-change-functions.  This seems
to happen in a (rather extreme?) edge case where the full buffer's
contents are replaced just before saving.

It looks like a bug in the b-c-fns and a-c-fns, and there are a number
of those that eglot.el already recognizes and fixes.  Stefan Monnier has
written a library to try to smooth over these bugs and provide a better
API to clients, but that some problems in itself so I recently removed
it.  I don't know if it had support for fixing this particular bug.  I
could re-add it, but I think the root problem should be clearly identified
before.  The ideal fix, in my view, is for the b-c-fns and a-c-fns to be
fixed so that they are more predictable.

In the meantime, I wonder if completely disabling the modification hooks
around the `insert-file-contents` wouldn't be a suitable workaround.
There would, of course, be no change notification Eglot -> LSPserver,
except for Eglot stating it has saved the file to disk, which most LSPs
usually interpret as a hint to go read from the disk.

João




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#77658; Package emacs. (Sun, 27 Apr 2025 04:12:01 GMT) Full text and rfc822 format available.

Message #17 received at 77658 <at> debbugs.gnu.org (full text, mbox):

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Aaron Zeng <azeng <at> janestreet.com>
Cc: 77658 <at> debbugs.gnu.org, app-emacs-dev <at> janestreet.com
Subject: Re: bug#77658: 30.1.50; Eglot: wrong-type-argument: consp, #<marker
 at 1 in file> when saving
Date: Sun, 27 Apr 2025 00:11:32 -0400
> I believe what is happening here, is that `insert-file-contents`, when
> inserting an empty file into an empty buffer (maybe in other
> situations as well), may cause `before-change-functions` to be run but
> `after-change-functions` never runs.  Therefore,
> `eglot--before-changes` inserts an element into
> `eglot--recent-changes` that `eglot--after-changes` never gets
> a chance to fix up.

Indeed, `insert-file-contents` does not run `after-change-functions` if
it does not actually modify the buffer, whereas it does always run
`before-change-functions`.  You can verify that for yourself with:

    (defvar-local my-changes nil)
    (add-hook 'after-change-functions
              (lambda (&rest args) (push `(after . ,args) my-changes)))
    (add-hook 'before-change-functions
              (lambda (&rest args) (push `(before . ,args) my-changes)))

and then do `M-: (insert-file-contents "/dev/null") RET` and check the
value of `my-changes`.

As you noted, this is not considered as a bug.
So, the problem is on Eglot's side because it makes sadly invalid
assumptions about how before and after change-functions are paired.

The Track-Changes library should handle this case correctly, AFAIK.
It might be worth trying out your recipe with an Eglot that uses
that library (again).


        Stefan


PS: I hope at some point João will reconsider his decision to not use
Track-Changes, although I understand his motivation: while Eglot doesn't
benefit much from Track-Changes because Eglot has already gone through
most of the pain of handling the corner cases of
`before/after-change-functions`, Track-Changes (and other users of
`before/after-change-functions`) would benefit from Eglot using it
because Eglot is used widely and because Track-Changes comes with
extensive sanity checks to detect when `before/after-change-functions`
are not run correctly (in which case it can report those problems, and
it also knows how to recover from them).  Furthermore it also records
extensive data about the circumstances of those problems, to help find
their origin.





This bug report was last modified 48 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.