Package: emacs;
Reported by: Matt Armstrong <matt <at> rfc20.org>
Date: Tue, 7 May 2024 19:22:01 UTC
Severity: normal
Found in version 29.3
Done: Eli Zaretskii <eliz <at> gnu.org>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 70824 in the body.
You can then email your comments to 70824 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
bug-gnu-emacs <at> gnu.org
:bug#70824
; Package emacs
.
(Tue, 07 May 2024 19:22:01 GMT) Full text and rfc822 format available.Matt Armstrong <matt <at> rfc20.org>
:bug-gnu-emacs <at> gnu.org
.
(Tue, 07 May 2024 19:22:02 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Matt Armstrong <matt <at> rfc20.org> To: bug-gnu-emacs <at> gnu.org Subject: 29.3; Run time error in `dabbrev-completion' Date: Tue, 7 May 2024 12:19:43 -0700
I'm in a state where `dabbrev--last-buffer' is set to #<killed buffer>, which confuses the `dabbrev-completion' command as shown by the backtrace below. If I find a way to reproduce I will follow up with that. I suspect that dabbrev.el should use `(buffer-live-p dabbrev--last-buffer)' instead of checking for non-nil. First, the value of dabbrev--last-buffer: dabbrev--last-buffer is a variable defined in ‘dabbrev.el’. Its value is #<killed buffer> Not documented as a variable. Second, what happens when I run `dabbrev-completion': Debugger entered--Lisp error: (error "Selecting deleted buffer") set-buffer(#<killed buffer>) (progn (set-buffer dabbrev--last-buffer)) (if dabbrev--last-buffer (progn (set-buffer dabbrev--last-buffer))) (save-excursion (if dabbrev--last-buffer (progn (set-buffer dabbrev--last-buffer))) (or (and (not dabbrev-search-these-buffers-only) (>= direction 0) (setq dabbrev--last-direction (min 1 direction)) (dabbrev--try-find abbrev t (max 1 direction) ignore-case)) (and (or (not dabbrev-search-these-buffers-only) dabbrev--last-buffer) (<= direction 0) (setq dabbrev--last-direction -1) (dabbrev--try-find abbrev nil (max 1 (- direction)) ignore-case)) (progn (setq dabbrev--last-direction -1) (if dabbrev--last-buffer nil (if dabbrev--friend-buffer-list nil (setq dabbrev--friend-buffer-list (dabbrev--make-friend-buffer-list)) (setq dabbrev--progress-reporter (make-progress-reporter "Scanning for dabbrevs..." (- ...) 0 0 1 1.5)))) (let ((file-name (buffer-file-name)) file-name-buffer) (unwind-protect (progn (if file-name (progn ... ... ...)) (let (expansion) (while ... ... ... ... ... ...) (progress-reporter-done dabbrev--progress-reporter) expansion)) (if (buffer-live-p file-name-buffer) (progn (kill-buffer file-name-buffer))) (setq dabbrev--friend-buffer-list (seq-filter #'buffer-live-p dabbrev--friend-buffer-list))))))) dabbrev--find-expansion("p" -1 t) dabbrev--find-all-expansions("p" t) #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>)(#("p" 0 1 (fontified t)) nil (boundaries . "")) completion-boundaries(#("p" 0 1 (fontified t)) #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>) nil "") completion-basic-try-completion(#("p" 0 1 (fontified t)) #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>) nil 1) #f(compiled-function (style) #<bytecode -0x1bb324416e7d7fbf>)(basic) completion--some(#f(compiled-function (style) #<bytecode -0x1bb324416e7d7fbf>) (basic partial-completion emacs22)) completion--nth-completion(1 #("p" 0 1 (fontified t)) #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>) nil 1 (metadata (cycle-sort-function . identity) (category . dabbrev))) completion-try-completion(#("p" 0 1 (fontified t)) #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>) nil 1 (metadata (cycle-sort-function . identity) (category . dabbrev))) completion--do-completion(#<marker at 531 in persist.rs> 532) completion--in-region-1(#<marker at 531 in persist.rs> 532) #f(compiled-function (start end collection predicate) #<bytecode -0x16fb47f8fb6a4d3d>)(#<marker at 531 in persist.rs> 532 #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>) nil) apply(#f(compiled-function (start end collection predicate) #<bytecode -0x16fb47f8fb6a4d3d>) (#<marker at 531 in persist.rs> 532 #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>) nil)) #f(compiled-function (funs global args) #<bytecode -0x73c1f01704730a2>)(nil nil (#<marker at 531 in persist.rs> 532 #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>) nil)) completion--in-region(#<marker at 531 in persist.rs> 532 #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>) nil) completion-in-region(#<marker at 531 in persist.rs> 532 #f(compiled-function (s p a) #<bytecode -0x1773fde4def7ae30>) nil) completion-at-point() dabbrev-completion(nil) funcall-interactively(dabbrev-completion nil) command-execute(dabbrev-completion) In GNU Emacs 29.3 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.41, cairo version 1.18.0) System Description: Debian GNU/Linux 12 (bookworm) Configured using: 'configure --prefix=/nix/store/m88zm8z7qrby6zlnq32z35nmn89jdzkl-emacs-pgtk-29.3 --disable-build-details --with-modules --with-pgtk --with-compress-install --with-toolkit-scroll-bars --with-native-compilation --without-imagemagick --without-small-ja-dic --with-tree-sitter --without-xinput2 --with-xwidgets --with-dbus --with-selinux' Configured features: CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG JSON LIBSELINUX LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PGTK PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM XWIDGETS GTK3 ZLIB Important settings: value of $EMACSLOADPATH: value of $EMACSNATIVELOADPATH: value of $LC_MONETARY: en_US.UTF-8 value of $LC_NUMERIC: en_US.UTF-8 value of $LC_TIME: en_US.UTF-8 value of $LANG: en_US.UTF-8 value of $XMODIFIERS: @im=ibus locale-coding-system: utf-8-unix Major mode: ELisp/l Minor modes in effect: global-git-commit-mode: t magit-auto-revert-mode: t shell-dirtrack-mode: t msb-mode: t display-time-mode: t flyspell-mode: t server-mode: t auto-insert-mode: t keyfreq-autosave-mode: t keyfreq-mode: t global-treesit-auto-mode: t savehist-mode: t vertico-mode: t editorconfig-mode: t which-key-mode: t electric-pair-mode: t override-global-mode: t tooltip-mode: t global-eldoc-mode: t eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t buffer-read-only: t column-number-mode: t line-number-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t temp-buffer-resize-mode: t Load-path shadows: /home/matt/.nix-profile/share/emacs/site-lisp/cmake-mode hides /home/matt/.config/emacs/elpa/cmake-mode-3.28.1/cmake-mode ~/env/elisp/ol-notmuch hides /home/matt/.config/emacs/elpa/ol-notmuch-2.0.1/ol-notmuch /nix/store/qm3ihp915s71a5sdvg6w7ag5vr295qmi-emacs-packages-deps/share/emacs/site-lisp/site-start hides /nix/store/m88zm8z7qrby6zlnq32z35nmn89jdzkl-emacs-pgtk-29.3/share/emacs/site-lisp/site-start /home/matt/.config/emacs/elpa/project-0.10.0/project hides /nix/store/m88zm8z7qrby6zlnq32z35nmn89jdzkl-emacs-pgtk-29.3/share/emacs/29.3/lisp/progmodes/project Features: (shadow sort mail-extr emacsbug jka-compr cl-print cus-start cus-load shortdoc dabbrev vc-hg vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs log-view vc bug-reference magit-extras face-remap magit-submodule magit-obsolete magit-blame magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit magit-sequence magit-notes magit-worktree magit-tag magit-merge magit-branch magit-reset magit-files magit-refs magit-status magit magit-repos magit-apply magit-wip magit-log which-func magit-diff smerge-mode diff git-commit log-edit message sendmail yank-media puny rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr mailabbrev mail-utils gmm-utils mailheader pcvs-util add-log magit-core magit-autorevert autorevert magit-margin magit-transient magit-process with-editor dirtrack shell pcomplete magit-mode magit-git magit-section magit-utils crm dash files-x find-dired dired dired-loaddefs grep pulse yasnippet protbuf msb time markdown-mode color noutline outline go-mode find-file ffap eglot external-completion array filenotify jsonrpc ert pp ewoc debug backtrace flymake-proc flymake imenu copyright misearch multi-isearch time-date vc-git diff-mode vc-dispatcher rust-ts-mode c-ts-common flyspell ispell midnight server geiser-guile info-look transient format-spec geiser-debug geiser-repl geiser-image geiser-capf geiser-doc geiser-menu geiser-autodoc geiser-edit etags fileloop generator xref geiser-completion geiser-eval geiser-connection tq geiser-syntax scheme geiser-impl help-fns radix-tree geiser-log geiser-popup view geiser-custom geiser-base geiser skeleton autoinsert advice keyfreq rust-utils thingatpt rust-mode rust-rustfmt rust-playpen rust-compile compile text-property-search comint ansi-osc ansi-color ring rust-cargo project codeium treesit-auto treesit edmacro kmacro savehist corfu vertico compat compat-29 comp comp-cstr warnings icons rx editorconfig editorconfig-core editorconfig-core-handle editorconfig-fnmatch pcase modus-operandi-theme modus-themes which-key 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 eieio eieio-core password-cache json subr-x map byte-opt url-vars cl-macs gv cl-extra help-mode cl-seq elec-pair use-package use-package-ensure use-package-delight use-package-diminish use-package-bind-key bind-key easy-mmode use-package-core cl-loaddefs cl-lib bytecomp byte-compile find-func info cmake-mode-autoloads codeium-autoloads corfu-autoloads debbugs-autoloads company-autoloads geiser-guile-autoloads geiser-autoloads god-mode-autoloads meow-autoloads modus-themes-autoloads nix-mode-autoloads nixpkgs-fmt-autoloads notmuch-autoloads rust-mode-autoloads reformatter-autoloads treesit-auto-autoloads vertico-autoloads web-mode-autoloads yaml-mode-autoloads yasnippet-autoloads rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/pgtk-win pgtk-win term/common-win pgtk-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads xwidget-internal dbusbind inotify dynamic-setting system-font-setting font-render-setting cairo gtk pgtk multi-tty make-network-process native-compile emacs) Memory information: ((conses 16 449923 81499) (symbols 48 28929 27) (strings 32 104412 4026) (string-bytes 1 3615216) (vectors 16 65301) (vector-slots 8 1514110 53758) (floats 8 396 470) (intervals 56 4575 36) (buffers 984 32))
bug-gnu-emacs <at> gnu.org
:bug#70824
; Package emacs
.
(Tue, 07 May 2024 19:54:02 GMT) Full text and rfc822 format available.Message #8 received at 70824 <at> debbugs.gnu.org (full text, mbox):
From: Matt Armstrong <matt <at> rfc20.org> To: 70824 <at> debbugs.gnu.org Subject: Re: 29.3; Run time error in `dabbrev-completion' Date: Tue, 7 May 2024 12:52:56 -0700
Debugging this further (sorry, still no repro so I'm debugging my live image), I think this was introduced a few years ago in commit 2d0085f756572856a2ed8d1bf043b59195a3e3f3 and partially fixed in commit d0975d7db03c231a3db5a1cd0edaf41094d43f0d. Those commits introduced a feature where `dabbrev--find-expansion' considers the components of a buffer's file name as completion candidates. It does this by creating a temp buffer containing the components. The problem is that this temp buffer is immediately killed, yet dabbrev variables still hold references to it. The second commit above correctly removes the killed buffer from `dabbrev--friend-buffer-list', but did not handle the case where `dabbrev--last-buffer' or `dabbrev--last-buffer-found' happened to be the just-killed buffer. I can think of two approaches: - continual with the "manual GC" approach and scrub more dabbrev vars of this killed buffer. - handle the killed buffer gracefully by using buffer-live-p consistently, instead using checks against nil.
bug-gnu-emacs <at> gnu.org
:bug#70824
; Package emacs
.
(Wed, 08 May 2024 13:25:02 GMT) Full text and rfc822 format available.Message #11 received at 70824 <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: Matt Armstrong <matt <at> rfc20.org> Cc: 70824 <at> debbugs.gnu.org Subject: Re: bug#70824: 29.3; Run time error in `dabbrev-completion' Date: Wed, 08 May 2024 16:24:15 +0300
> Date: Tue, 7 May 2024 12:52:56 -0700 > From: Matt Armstrong via "Bug reports for GNU Emacs, > the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org> > > Debugging this further (sorry, still no repro so I'm debugging my live > image), I think this was introduced a few years ago in commit > 2d0085f756572856a2ed8d1bf043b59195a3e3f3 and partially fixed in commit > d0975d7db03c231a3db5a1cd0edaf41094d43f0d. > > Those commits introduced a feature where `dabbrev--find-expansion' > considers the components of a buffer's file name as completion > candidates. It does this by creating a temp buffer containing the > components. > > The problem is that this temp buffer is immediately killed, yet dabbrev > variables still hold references to it. The second commit above correctly > removes the killed buffer from `dabbrev--friend-buffer-list', but did > not handle the case where `dabbrev--last-buffer' or > `dabbrev--last-buffer-found' happened to be the just-killed buffer. Thanks for the analysis. > I can think of two approaches: > > - continual with the "manual GC" approach and scrub more dabbrev vars > of this killed buffer. > - handle the killed buffer gracefully by using buffer-live-p > consistently, instead using checks against nil. I think we should do both. Can you suggest a patch along these lines?
Eli Zaretskii <eliz <at> gnu.org>
:Matt Armstrong <matt <at> rfc20.org>
:Message #16 received at 70824-done <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: Matt Armstrong <matt <at> rfc20.org> Cc: 70824-done <at> debbugs.gnu.org Subject: Re: bug#70824: 29.3; Run time error in `dabbrev-completion' Date: Sat, 25 May 2024 10:34:55 +0300
> Date: Tue, 7 May 2024 12:19:43 -0700 > From: Matt Armstrong via "Bug reports for GNU Emacs, > the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org> > > I'm in a state where `dabbrev--last-buffer' is set to #<killed buffer>, > which confuses the `dabbrev-completion' command as shown by the > backtrace below. > > If I find a way to reproduce I will follow up with that. > > I suspect that dabbrev.el should use `(buffer-live-p > dabbrev--last-buffer)' instead of checking for non-nil. Thanks, I added the buffer-live-p tests where appropriate in dabbrev.el and installed the changes on the master branch. I'm now boldly closing this bug.
Debbugs Internal Request <help-debbugs <at> gnu.org>
to internal_control <at> debbugs.gnu.org
.
(Sat, 22 Jun 2024 11:24:08 GMT) Full text and rfc822 format available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.