* bug#74230: 30.0.92; eshell-emit-prompt clobbers text properties @ 2024-11-06 18:21 Ashton Wiersdorf 2024-11-07 18:16 ` Jim Porter 0 siblings, 1 reply; 4+ messages in thread From: Ashton Wiersdorf @ 2024-11-06 18:21 UTC (permalink / raw) To: 74230 Hi there, I like configuring my eshell prompt like so: (this has been tested with emacs -Q) (defun fancy-shell () "A pretty shell with git status" (let* ((cwd (abbreviate-file-name (eshell/pwd))) (ref "main") ; usually calls out to magit to get the current refname (stat t) (x-stat eshell-last-command-status) (git-chunk (if ref (format "%s%s%s " (propertize (if stat "[" "(") 'font-lock-face (list :foreground (if stat "red" "green"))) (propertize ref 'font-lock-face '(:foreground "yellow")) (propertize (if stat "]" ")") 'font-lock-face (list :foreground (if stat "red" "green")))) ""))) (propertize (format "%s %s %s$ " (if (< 0 x-stat) (format (propertize "!%s" 'font-lock-face '(:foreground "red")) x-stat) (propertize "➤" 'font-lock-face (list :foreground (if (< 0 x-stat) "red" "green")))) (propertize cwd 'font-lock-face '(:foreground "#45babf")) git-chunk) 'read-only t 'front-sticky '(font-lock-face read-only) 'rear-nonsticky '(font-lock-face read-only)))) (setopt eshell-prompt-function 'fancy-shell) (setopt eshell-highlight-prompt nil) This worked perfectly in Emacs 29.4. However, in Emacs 30.0.92, I cannot type any text any more. This appears to be an issue with the function `eshell-emit-prompt'. In Emacs 29.4, the function did *not* overwrite the text properties of the prompt `rear-nonsticky (read-only)`. The new version overwrites the rear-nonsticky property so that it is only `(field)`. If I set `eshell-highlight-prompt' to `t', then I get the read-only behavior that I want, but now I cannot get the pleasant component highlighting that `fancy-shell' is meant to provide. You probably know a better solution, but I would like that either the text properties that `eshell-prompt-function' do *not* get clobbered like this, or that `read-only' get added to the `front-sticky' and `rear-nonsticky' text properties, and `read-only' set to `t'. For example, this does what I want: (defun eshell-emit-prompt () "Emit a prompt if eshell is being used interactively." (when (boundp 'ansi-color-context-region) (setq ansi-color-context-region nil)) (run-hooks 'eshell-before-prompt-hook) (if (not eshell-prompt-function) (set-marker eshell-last-output-end (point)) (let ((prompt (funcall eshell-prompt-function))) (add-text-properties 0 (length prompt) (if eshell-highlight-prompt '( read-only t field prompt font-lock-face eshell-prompt front-sticky (read-only field font-lock-face) rear-nonsticky (read-only field font-lock-face)) '( field prompt read-only t ; CHANGE HERE front-sticky (read-only field) ; CHANGE HERE rear-nonsticky (read-only field))) ; CHANGE HERE prompt) (eshell-interactive-filter nil prompt))) (run-hooks 'eshell-after-prompt-hook)) I hope that was helpful; thank you for your time and attention. In GNU Emacs 30.0.92 (build 2, aarch64-apple-darwin24.1.0, NS appkit-2575.20 Version 15.1 (Build 24B83)) of 2024-11-05 built on vulcan.local Windowing system distributor 'Apple', version 10.3.2575 System Description: macOS 15.1 Configured using: 'configure --disable-dependency-tracking --disable-silent-rules --enable-locallisppath=/opt/homebrew/share/emacs/site-lisp --infodir=/opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/info/emacs --prefix=/opt/homebrew/Cellar/emacs-plus@30/30.0.92 --with-xml2 --with-gnutls --with-native-compilation=aot --without-compress-install --with-dbus --with-imagemagick --with-modules --with-rsvg --with-webp --without-pop --with-xwidgets --with-ns --disable-ns-self-contained 'CFLAGS=-O2 -DFD_SETSIZE=10000 -DDARWIN_UNLIMITED_SELECT -I/opt/homebrew/opt/gcc/include -I/opt/homebrew/opt/libgccjit/include' 'LDFLAGS=-L/opt/homebrew/lib/gcc/14 -I/opt/homebrew/opt/gcc/include -I/opt/homebrew/opt/libgccjit/include'' Configured features: ACL DBUS GIF GLIB GMP GNUTLS IMAGEMAGICK JPEG LCMS2 LIBXML2 MODULES NATIVE_COMP NOTIFY KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM XWIDGETS ZLIB Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: ELisp/l Minor modes in effect: jinx-mode: t electric-pair-mode: t hl-line-mode: t magit-todos-mode: t global-git-commit-mode: t global-treesit-auto-mode: t eat-eshell-visual-command-mode: t eat-eshell-mode: t corfu-popupinfo-mode: t corfu-echo-mode: t corfu-history-mode: t global-corfu-mode: t corfu-mode: t marginalia-mode: t vertico-multiform-mode: t vertico-mode: t which-key-mode: t pulsar-global-mode: t pulsar-mode: t mlscroll-mode: t olivetti-mode: t consult-notes-denote-mode: t consult-denote-mode: t denote-rename-buffer-mode: t citar-denote-mode: t citar-embark-mode: t denote-menu-bar-mode: t global-evil-surround-mode: t evil-surround-mode: t global-evil-collection-unimpaired-mode: t evil-collection-unimpaired-mode: t global-origami-mode: t origami-mode: t evil-mode: t evil-local-mode: t gcmh-mode: t puni-mode: t windmove-mode: t winner-mode: t pixel-scroll-precision-mode: t global-auto-revert-mode: t elpaca-use-package-mode: t override-global-mode: t display-time-mode: t savehist-mode: t tooltip-mode: t global-eldoc-mode: t eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t tab-bar-mode: t file-name-shadow-mode: t context-menu-mode: t global-font-lock-mode: t font-lock-mode: t minibuffer-regexp-mode: t column-number-mode: t line-number-mode: t visual-line-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t hs-minor-mode: t Load-path shadows: /Users/ashton/.emacs.d/elpaca/builds/auctex/tex-site hides /opt/homebrew/share/emacs/site-lisp/tex-site /Users/ashton/.emacs.d/elpaca/builds/which-key/which-key hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/which-key /Users/ashton/.emacs.d/elpaca/builds/transient/transient hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/transient /Users/ashton/.emacs.d/elpaca/builds/org/ob-comint hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-comint /Users/ashton/.emacs.d/elpaca/builds/org/ob-exp hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-exp /Users/ashton/.emacs.d/elpaca/builds/org/org-ctags hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-ctags /Users/ashton/.emacs.d/elpaca/builds/org/ob-emacs-lisp hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-emacs-lisp /Users/ashton/.emacs.d/elpaca/builds/org/oc hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/oc /Users/ashton/.emacs.d/elpaca/builds/org/ox-texinfo hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-texinfo /Users/ashton/.emacs.d/elpaca/builds/org/ol-irc hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-irc /Users/ashton/.emacs.d/elpaca/builds/org/ol-doi hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-doi /Users/ashton/.emacs.d/elpaca/builds/org/ob hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob /Users/ashton/.emacs.d/elpaca/builds/org/org-refile hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-refile /Users/ashton/.emacs.d/elpaca/builds/org/org-version hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-version /Users/ashton/.emacs.d/elpaca/builds/org/org-num hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-num /Users/ashton/.emacs.d/elpaca/builds/org/ol-mhe hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-mhe /Users/ashton/.emacs.d/elpaca/builds/org/ob-shell hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-shell /Users/ashton/.emacs.d/elpaca/builds/org/org-attach hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-attach /Users/ashton/.emacs.d/elpaca/builds/org/ob-C hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-C /Users/ashton/.emacs.d/elpaca/builds/org/org-macs hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-macs /Users/ashton/.emacs.d/elpaca/builds/org/org-entities hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-entities /Users/ashton/.emacs.d/elpaca/builds/org/ob-dot hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-dot /Users/ashton/.emacs.d/elpaca/builds/org/ob-sql hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-sql /Users/ashton/.emacs.d/elpaca/builds/org/ol-eww hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-eww /Users/ashton/.emacs.d/elpaca/builds/org/org-datetree hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-datetree /Users/ashton/.emacs.d/elpaca/builds/org/org-macro hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-macro /Users/ashton/.emacs.d/elpaca/builds/org/ob-eval hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-eval /Users/ashton/.emacs.d/elpaca/builds/org/ob-haskell hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-haskell /Users/ashton/.emacs.d/elpaca/builds/org/ox-org hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-org /Users/ashton/.emacs.d/elpaca/builds/org/ol-rmail hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-rmail /Users/ashton/.emacs.d/elpaca/builds/org/ob-awk hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-awk /Users/ashton/.emacs.d/elpaca/builds/org/ob-groovy hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-groovy /Users/ashton/.emacs.d/elpaca/builds/org/ox-icalendar hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-icalendar /Users/ashton/.emacs.d/elpaca/builds/org/ob-octave hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-octave /Users/ashton/.emacs.d/elpaca/builds/org/ob-scheme hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-scheme /Users/ashton/.emacs.d/elpaca/builds/org/org-mobile hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-mobile /Users/ashton/.emacs.d/elpaca/builds/org/ob-processing hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-processing /Users/ashton/.emacs.d/elpaca/builds/org/oc-biblatex hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/oc-biblatex /Users/ashton/.emacs.d/elpaca/builds/org/oc-csl hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/oc-csl /Users/ashton/.emacs.d/elpaca/builds/org/org-colview hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-colview /Users/ashton/.emacs.d/elpaca/builds/org/ob-R hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-R /Users/ashton/.emacs.d/elpaca/builds/org/org-table hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-table /Users/ashton/.emacs.d/elpaca/builds/org/ox-html hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-html /Users/ashton/.emacs.d/elpaca/builds/org/ob-fortran hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-fortran /Users/ashton/.emacs.d/elpaca/builds/org/ol hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol /Users/ashton/.emacs.d/elpaca/builds/org/ob-plantuml hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-plantuml /Users/ashton/.emacs.d/elpaca/builds/org/ol-docview hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-docview /Users/ashton/.emacs.d/elpaca/builds/org/ob-perl hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-perl /Users/ashton/.emacs.d/elpaca/builds/org/ob-sqlite hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-sqlite /Users/ashton/.emacs.d/elpaca/builds/org/oc-basic hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/oc-basic /Users/ashton/.emacs.d/elpaca/builds/org/ob-sed hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-sed /Users/ashton/.emacs.d/elpaca/builds/org/org-fold-core hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-fold-core /Users/ashton/.emacs.d/elpaca/builds/org/ob-ditaa hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-ditaa /Users/ashton/.emacs.d/elpaca/builds/org/ob-ruby hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-ruby /Users/ashton/.emacs.d/elpaca/builds/org/oc-bibtex hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/oc-bibtex /Users/ashton/.emacs.d/elpaca/builds/org/org-habit hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-habit /Users/ashton/.emacs.d/elpaca/builds/org/org-loaddefs hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-loaddefs /Users/ashton/.emacs.d/elpaca/builds/org/ol-gnus hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-gnus /Users/ashton/.emacs.d/elpaca/builds/org/ob-screen hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-screen /Users/ashton/.emacs.d/elpaca/builds/org/org-mouse hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-mouse /Users/ashton/.emacs.d/elpaca/builds/org/ob-css hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-css /Users/ashton/.emacs.d/elpaca/builds/org/org-inlinetask hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-inlinetask /Users/ashton/.emacs.d/elpaca/builds/org/ob-lisp hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-lisp /Users/ashton/.emacs.d/elpaca/builds/org/ol-eshell hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-eshell /Users/ashton/.emacs.d/elpaca/builds/org/org-pcomplete hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-pcomplete /Users/ashton/.emacs.d/elpaca/builds/org/org-lint hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-lint /Users/ashton/.emacs.d/elpaca/builds/org/org-id hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-id /Users/ashton/.emacs.d/elpaca/builds/org/org-capture hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-capture /Users/ashton/.emacs.d/elpaca/builds/org/ob-sass hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-sass /Users/ashton/.emacs.d/elpaca/builds/org/ob-tangle hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-tangle /Users/ashton/.emacs.d/elpaca/builds/org/ob-calc hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-calc /Users/ashton/.emacs.d/elpaca/builds/org/ob-java hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-java /Users/ashton/.emacs.d/elpaca/builds/org/org-compat hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-compat /Users/ashton/.emacs.d/elpaca/builds/org/org-attach-git hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-attach-git /Users/ashton/.emacs.d/elpaca/builds/org/ox-beamer hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-beamer /Users/ashton/.emacs.d/elpaca/builds/org/org-protocol hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-protocol /Users/ashton/.emacs.d/elpaca/builds/org/org-element hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-element /Users/ashton/.emacs.d/elpaca/builds/org/ob-lob hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-lob /Users/ashton/.emacs.d/elpaca/builds/org/org-tempo hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-tempo /Users/ashton/.emacs.d/elpaca/builds/org/ob-python hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-python /Users/ashton/.emacs.d/elpaca/builds/org/ob-latex hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-latex /Users/ashton/.emacs.d/elpaca/builds/org/ol-w3m hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-w3m /Users/ashton/.emacs.d/elpaca/builds/org/org-agenda hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-agenda /Users/ashton/.emacs.d/elpaca/builds/org/org-persist hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-persist /Users/ashton/.emacs.d/elpaca/builds/org/ob-ocaml hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-ocaml /Users/ashton/.emacs.d/elpaca/builds/org/ob-ref hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-ref /Users/ashton/.emacs.d/elpaca/builds/org/org-fold hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-fold /Users/ashton/.emacs.d/elpaca/builds/org/ob-julia hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-julia /Users/ashton/.emacs.d/elpaca/builds/org/ob-lilypond hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-lilypond /Users/ashton/.emacs.d/elpaca/builds/org/ob-table hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-table /Users/ashton/.emacs.d/elpaca/builds/org/ob-clojure hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-clojure /Users/ashton/.emacs.d/elpaca/builds/org/org-indent hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-indent /Users/ashton/.emacs.d/elpaca/builds/org/org-plot hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-plot /Users/ashton/.emacs.d/elpaca/builds/org/ox-latex hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-latex /Users/ashton/.emacs.d/elpaca/builds/org/org-src hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-src /Users/ashton/.emacs.d/elpaca/builds/org/org-duration hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-duration /Users/ashton/.emacs.d/elpaca/builds/org/ob-makefile hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-makefile /Users/ashton/.emacs.d/elpaca/builds/org/ol-info hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-info /Users/ashton/.emacs.d/elpaca/builds/org/org-clock hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-clock /Users/ashton/.emacs.d/elpaca/builds/org/ob-forth hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-forth /Users/ashton/.emacs.d/elpaca/builds/org/ox-odt hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-odt /Users/ashton/.emacs.d/elpaca/builds/org/ol-man hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-man /Users/ashton/.emacs.d/elpaca/builds/org/ox-publish hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-publish /Users/ashton/.emacs.d/elpaca/builds/org/org-archive hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-archive /Users/ashton/.emacs.d/elpaca/builds/org/ob-org hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-org /Users/ashton/.emacs.d/elpaca/builds/org/ob-lua hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-lua /Users/ashton/.emacs.d/elpaca/builds/org/org-keys hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-keys /Users/ashton/.emacs.d/elpaca/builds/org/ob-eshell hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-eshell /Users/ashton/.emacs.d/elpaca/builds/org/org-faces hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-faces /Users/ashton/.emacs.d/elpaca/builds/org/ox-man hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-man /Users/ashton/.emacs.d/elpaca/builds/org/org-list hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-list /Users/ashton/.emacs.d/elpaca/builds/org/ox-md hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-md /Users/ashton/.emacs.d/elpaca/builds/org/org-goto hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-goto /Users/ashton/.emacs.d/elpaca/builds/org/ol-bbdb hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-bbdb /Users/ashton/.emacs.d/elpaca/builds/org/org hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org /Users/ashton/.emacs.d/elpaca/builds/org/ol-bibtex hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ol-bibtex /Users/ashton/.emacs.d/elpaca/builds/org/ox-koma-letter hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-koma-letter /Users/ashton/.emacs.d/elpaca/builds/org/ox-ascii hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox-ascii /Users/ashton/.emacs.d/elpaca/builds/org/ob-matlab hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-matlab /Users/ashton/.emacs.d/elpaca/builds/org/ox hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ox /Users/ashton/.emacs.d/elpaca/builds/org/org-timer hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-timer /Users/ashton/.emacs.d/elpaca/builds/org/oc-natbib hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/oc-natbib /Users/ashton/.emacs.d/elpaca/builds/org/ob-core hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-core /Users/ashton/.emacs.d/elpaca/builds/org/org-feed hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-feed /Users/ashton/.emacs.d/elpaca/builds/org/ob-gnuplot hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-gnuplot /Users/ashton/.emacs.d/elpaca/builds/org/ob-js hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-js /Users/ashton/.emacs.d/elpaca/builds/org/org-element-ast hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-element-ast /Users/ashton/.emacs.d/elpaca/builds/org/org-footnote hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-footnote /Users/ashton/.emacs.d/elpaca/builds/org/ob-maxima hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/ob-maxima /Users/ashton/.emacs.d/elpaca/builds/org/org-cycle hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-cycle /Users/ashton/.emacs.d/elpaca/builds/org/org-crypt hides /opt/homebrew/Cellar/emacs-plus@30/30.0.92/share/emacs/30.0.92/lisp/org/org-crypt Features: (shadow sort adaptive-wrap mail-extr emacsbug tempel find-func evil-collection-info info cl-print em-rebind em-smart em-tramp help-fns radix-tree misearch multi-isearch vc-git vc-dispatcher hideshow face-remap jinx elec-pair em-unix em-term em-script em-pred em-ls em-hist em-glob em-extpipe em-cmpl em-dirs em-basic em-banner em-alias evil-collection-eshell em-prompt evil-collection-forge forge-repos forge-tablist hl-line forge-topics forge-commands forge-semi forge-bitbucket buck forge-gogs gogs forge-gitea gtea forge-gitlab glab forge-github ghub-graphql treepy gsexp ghub url-http url-gw nsm url-auth let-alist gnutls forge-notify forge-revnote forge-pullreq forge-issue forge-topic yaml eieio-custom bug-reference forge-post markdown-mode edit-indirect noutline outline forge-repo forge forge-core forge-db closql emacsql-sqlite-common emacsql emacsql-compiler eieio-base magit-todos pcre2el rxt advice re-builder hl-todo f async grep evil-collection-magit magit-bookmark magit-submodule magit-blame magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit magit-sequence magit-notes magit-worktree magit-tag magit-merge magit-branch magit-reset magit-files magit-refs magit-status magit package url-handlers magit-repos magit-apply magit-wip magit-log which-func imenu 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 magit-margin magit-transient magit-process with-editor server magit-mode benchmark magit-git magit-base magit-section cursor-sensor crm eshell treesit-auto combobulate combobulate-go combobulate-json combobulate-yaml combobulate-css combobulate-js-ts combobulate-python combobulate-html combobulate-toml combobulate-cursor combobulate-query scheme combobulate-ui transient combobulate-display combobulate-ztree combobulate-contrib combobulate-envelope combobulate-manipulation python combobulate-procedure combobulate-navigation combobulate-misc combobulate-setup tempo combobulate-interface combobulate-settings diff-mode track-changes combobulate-rules typescript-mode cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs compile esh-mode esh-var esh-cmd generator esh-ext esh-opt esh-proc esh-io esh-arg esh-module esh-module-loaddefs esh-util eat term/xterm xterm tramp trampver tramp-integration files-x tramp-message tramp-compat xdg parse-time format-spec tramp-loaddefs term disp-table ehelp shell pcomplete comint ansi-osc ansi-color cape kind-icon svg-lib svg dom xml corfu-popupinfo corfu-echo corfu-history corfu orderless symbol-overlay marginalia vertico-multiform vertico which-key avy pulsar pulse color mlscroll olivetti consult-notes-denote consult-notes consult-denote denote-journal-extras denote-rename-buffer citar-denote citar-embark embark-consult embark ffap all-the-icons all-the-icons-faces data-material data-weathericons data-octicons data-fileicons data-faicons data-alltheicons citar citar-file citar-cache citar-format parsebib bibtex iso8601 time-date browse-url denote xref project consult bookmark text-property-search compat nordic-midnight-theme nordic-night-theme evil-surround evil-collection-unimpaired evil-collection-eldoc evil-collection-dired evil-collection annalist origami origami-parsers cl s dash evil evil-integration evil-maps evil-commands reveal evil-jumps evil-command-window evil-types evil-search evil-ex evil-macros evil-repeat evil-states evil-core comp comp-cstr warnings comp-run comp-common evil-common thingatpt rect evil-vars cus-start diminish gcmh tempel-autoloads git-timemachine-autoloads git-modes-autoloads consult-projectile-autoloads projectile-autoloads forge-autoloads closql-autoloads emacsql-autoloads ghub-autoloads treepy-autoloads markdown-mode-autoloads yaml-autoloads magit-delta-autoloads xterm-color-autoloads blamer-autoloads posframe-autoloads magit-todos-autoloads async-autoloads hl-todo-autoloads pcre2el-autoloads apheleia-autoloads rust-mode-autoloads json-mode-autoloads rx json-snatcher-autoloads web-mode-autoloads csv-mode-autoloads docker-compose-mode-autoloads yaml-mode-autoloads dockerfile-mode-autoloads go-mode-autoloads elixir-mode-autoloads treesit-auto-autoloads combobulate-autoloads consult-flycheck-autoloads eglot-booster-autoloads flycheck-autoloads consult-eglot-autoloads rainbow-mode-autoloads free-keys-autoloads package-lint-autoloads scribble-mode-autoloads lua-mode-autoloads racket-mode-autoloads haskell-mode-autoloads typescript-mode-autoloads julia-repl-autoloads eglot-jl-autoloads julia-mode-autoloads company-coq-autoloads yasnippet-autoloads company-math-autoloads company-autoloads math-symbol-lists-autoloads proof-general-autoloads proof-site proof-autoloads idris-mode-autoloads prop-menu-autoloads slime-autoloads macrostep-autoloads eshell-vterm-autoloads eat-autoloads vterm-autoloads message-view-patch-autoloads magit-autoloads magit-section-autoloads with-editor-autoloads mu4e-views-autoloads xwidgets-reuse-autoloads org-mime-autoloads ebdb-autoloads pcmpl-args-autoloads cape-autoloads kind-icon-autoloads svg-lib-autoloads corfu-autoloads orderless-autoloads all-the-icons-autoloads wgrep-autoloads embark-consult-autoloads embark-autoloads symbol-overlay-autoloads marginalia-autoloads vertico-autoloads puni-autoloads which-key-autoloads ace-window-autoloads avy-autoloads diminish-autoloads pulsar-autoloads mlscroll-autoloads gptel-autoloads transient-autoloads crdt-autoloads malyon-autoloads mastodon-autoloads request-autoloads persist-autoloads hackernews-autoloads nov-autoloads esxml-autoloads kv-autoloads atomic-chrome-autoloads websocket-autoloads lorem-ipsum-autoloads writegood-mode-autoloads jinx-autoloads auctex-autoloads tex-site edit-indirect-autoloads wc-goal-mode-autoloads osx-dictionary-autoloads adaptive-wrap-autoloads writeroom-mode-autoloads visual-fill-column-autoloads olivetti-autoloads deft-autoloads consult-notes-autoloads consult-denote-autoloads consult-autoloads citar-denote-autoloads denote-autoloads citar-autoloads citeproc-autoloads f-autoloads queue-autoloads string-inflection-autoloads parsebib-autoloads pdf-tools-autoloads tablist-autoloads gnuplot-autoloads corg-autoloads org-bulletproof-autoloads org-fragtog-autoloads ox-pandoc-autoloads ht-autoloads ox-hugo-autoloads tomelr-autoloads ox-gfm-autoloads htmlize-autoloads engrave-faces-autoloads ob-racket-autoloads org-loaddefs nordic-night-theme-autoloads evil-org-autoloads evil-surround-autoloads evil-nerd-commenter-autoloads evil-args-autoloads evil-numbers-autoloads evil-collection-autoloads annalist-autoloads evil-autoloads goto-chg-autoloads origami-autoloads s-autoloads dash-autoloads gcmh-autoloads pcase treesit doc-view jka-compr image-mode exif dired dired-loaddefs edmacro kmacro windmove winner pixel-scroll cua-base ring cl-extra help-mode autorevert filenotify cus-edit pp cus-load wid-edit elpaca-use-package use-package use-package-ensure use-package-delight use-package-diminish use-package-bind-key bind-key easy-mmode use-package-core elpaca-use-package-autoloads elpaca-log elpaca-ui url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf url-util url-parse auth-source eieio eieio-core cl-macs icons password-cache json subr-x map byte-opt gv bytecomp byte-compile url-vars mailcap cl-seq elpaca elpaca-process cl-loaddefs cl-lib elpaca-autoloads time savehist rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/ns-win ns-win ucs-normalize mule-util term/common-win tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads xwidget-internal dbusbind kqueue cocoa ns lcms2 multi-tty make-network-process native-compile emacs) Memory information: ((conses 16 1045386 1178825) (symbols 48 49905 20) (strings 32 351480 71515) (string-bytes 1 8452714) (vectors 16 87562) (vector-slots 8 1759867 513038) (floats 8 987 15307) (intervals 56 10261 5742) (buffers 992 26)) -- Ashton Wiersdorf https://lambdaland.org/ ^ permalink raw reply [flat|nested] 4+ messages in thread
* bug#74230: 30.0.92; eshell-emit-prompt clobbers text properties 2024-11-06 18:21 bug#74230: 30.0.92; eshell-emit-prompt clobbers text properties Ashton Wiersdorf @ 2024-11-07 18:16 ` Jim Porter 2024-11-14 8:52 ` Eli Zaretskii 0 siblings, 1 reply; 4+ messages in thread From: Jim Porter @ 2024-11-07 18:16 UTC (permalink / raw) To: Ashton Wiersdorf, 74230; +Cc: eliz [-- Attachment #1: Type: text/plain, Size: 1392 bytes --] On 11/6/2024 10:21 AM, Ashton Wiersdorf wrote: > In Emacs 29.4, the function did *not* overwrite the text properties of > the prompt `rear-nonsticky (read-only)`. The new version overwrites the > rear-nonsticky property so that it is only `(field)`. Thanks for noticing this. > If I set `eshell-highlight-prompt' to `t', then I get the read-only > behavior that I want, but now I cannot get the pleasant component > highlighting that `fancy-shell' is meant to provide. If you set the 'face' attribute instead of the 'font-lock-face' attribute, you should get the highlighting you want (that's what I do) while 'eshell-highlight-prompt' is non-nil. Here's a patch to fix this though so that we're more careful about not clobbering stickiness properties. Eli, what do you think about this patch? It fixes a regression from Emacs 29, but the diff is fairly large for so late in the Emacs 30 cycle. Unfortunately, I can't think of a better solution that doesn't just shuffle the bug around to a different spot. On the plus side, this code already has regression tests, and it was easy to add a new one for this case. Personally, I'd be ok with having this be a known bug (there's a workaround for Emacs 30) and fixing it on master. But if you think this change is ok for the release branch, I'd also be ok with installing there; then people don't need to deal with the workaround. [-- Attachment #2: 0001-Don-t-clobber-stickiness-text-properties-when-printi.patch --] [-- Type: text/plain, Size: 5857 bytes --] From 8b8e4830f45e69329018bc87121e12ee6ddfb9d4 Mon Sep 17 00:00:00 2001 From: Jim Porter <jporterbugs@gmail.com> Date: Thu, 7 Nov 2024 10:08:33 -0800 Subject: [PATCH] Don't clobber stickiness text properties when printing Eshell prompt * lisp/eshell/em-prompt.el (eshell--append-text-property): New function... (eshell-emit-prompt): ... use it. * test/lisp/eshell/em-prompt-tests.el (em-prompt-test/field-properties/merge-stickiness): New test. (em-prompt-test/field-properties, em-prompt-test/after-failure): Reorder stickiness values (bug#74230). --- lisp/eshell/em-prompt.el | 36 ++++++++++++++++++----------- test/lisp/eshell/em-prompt-tests.el | 35 ++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/lisp/eshell/em-prompt.el b/lisp/eshell/em-prompt.el index de62b5c7d97..37970ac0ba5 100644 --- a/lisp/eshell/em-prompt.el +++ b/lisp/eshell/em-prompt.el @@ -119,6 +119,19 @@ eshell-prompt-initialize (add-hook 'eshell-post-command-hook 'eshell-emit-prompt nil t) (eshell-prompt-mode))) +(defun eshell--append-text-property (start end prop value &optional object) + "Append to a text property from START to END. +PROP is the text property to append to, and VALUE is the list of +property values to append. OBJECT is the object to propertize, as with +`put-text-property' (which see)." + (let (next) + (while (< start end) + (setq next (next-single-property-change start prop object end)) + (put-text-property start next prop + (append (get-text-property start prop object) value) + object) + (setq start next)))) + (defun eshell-emit-prompt () "Emit a prompt if eshell is being used interactively." (when (boundp 'ansi-color-context-region) @@ -126,19 +139,16 @@ eshell-emit-prompt (run-hooks 'eshell-before-prompt-hook) (if (not eshell-prompt-function) (set-marker eshell-last-output-end (point)) - (let ((prompt (funcall eshell-prompt-function))) - (add-text-properties - 0 (length prompt) - (if eshell-highlight-prompt - '( read-only t - field prompt - font-lock-face eshell-prompt - front-sticky (read-only field font-lock-face) - rear-nonsticky (read-only field font-lock-face)) - '( field prompt - front-sticky (field) - rear-nonsticky (field))) - prompt) + (let* ((prompt (funcall eshell-prompt-function)) + (len (length prompt)) + (sticky-props '(field))) + (put-text-property 0 len 'field 'prompt prompt) + (when eshell-highlight-prompt + (add-text-properties + 0 len '(read-only t font-lock-face eshell-prompt) prompt) + (setq sticky-props `(read-only font-lock-face . ,sticky-props))) + (eshell--append-text-property 0 len 'front-sticky sticky-props prompt) + (eshell--append-text-property 0 len 'rear-nonsticky sticky-props prompt) (eshell-interactive-filter nil prompt))) (run-hooks 'eshell-after-prompt-hook)) diff --git a/test/lisp/eshell/em-prompt-tests.el b/test/lisp/eshell/em-prompt-tests.el index fbadade061f..1c6e8e02293 100644 --- a/test/lisp/eshell/em-prompt-tests.el +++ b/test/lisp/eshell/em-prompt-tests.el @@ -57,8 +57,8 @@ em-prompt-test/field-properties 'read-only t 'field 'prompt 'font-lock-face 'eshell-prompt - 'front-sticky '(read-only field font-lock-face) - 'rear-nonsticky '(read-only field font-lock-face)))) + 'front-sticky '(read-only font-lock-face field) + 'rear-nonsticky '(read-only font-lock-face field)))) (should (equal last-input "echo hello\n")) (should (equal-including-properties last-output @@ -88,6 +88,33 @@ em-prompt-test/field-properties/no-highlight (apply #'propertize "hello\n" eshell-command-output-properties))))))) +(ert-deftest em-prompt-test/field-properties/merge-stickiness () + "Check that stickiness properties are properly merged on Eshell prompts." + (let ((eshell-prompt-function + (lambda () + (concat (propertize (eshell/pwd) 'front-sticky '(front)) + (propertize "$ " 'rear-nonsticky '(rear)))))) + (with-temp-eshell + (eshell-insert-command "echo hello") + (let ((last-prompt (field-string (1- eshell-last-input-start)))) + (should (equal-including-properties + last-prompt + (concat + (propertize + (directory-file-name default-directory) + 'read-only t + 'field 'prompt + 'font-lock-face 'eshell-prompt + 'front-sticky '(front read-only font-lock-face field) + 'rear-nonsticky '(read-only font-lock-face field)) + (propertize + "$ " + 'read-only t + 'field 'prompt + 'font-lock-face 'eshell-prompt + 'front-sticky '(read-only font-lock-face field) + 'rear-nonsticky '(rear read-only font-lock-face field))))))))) + (ert-deftest em-prompt-test/after-failure () "Check that current prompt shows the exit code of the last failed command." (with-temp-eshell @@ -104,8 +131,8 @@ em-prompt-test/after-failure 'read-only t 'field 'prompt 'font-lock-face 'eshell-prompt - 'front-sticky '(read-only field font-lock-face) - 'rear-nonsticky '(read-only field font-lock-face))))))) + 'front-sticky '(read-only font-lock-face field) + 'rear-nonsticky '(read-only font-lock-face field))))))) \f ;; Prompt navigation -- 2.25.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* bug#74230: 30.0.92; eshell-emit-prompt clobbers text properties 2024-11-07 18:16 ` Jim Porter @ 2024-11-14 8:52 ` Eli Zaretskii 2024-11-14 18:33 ` Jim Porter 0 siblings, 1 reply; 4+ messages in thread From: Eli Zaretskii @ 2024-11-14 8:52 UTC (permalink / raw) To: Jim Porter; +Cc: ashton, 74230 > Date: Thu, 7 Nov 2024 10:16:16 -0800 > Cc: eliz@gnu.org > From: Jim Porter <jporterbugs@gmail.com> > > On 11/6/2024 10:21 AM, Ashton Wiersdorf wrote: > > In Emacs 29.4, the function did *not* overwrite the text properties of > > the prompt `rear-nonsticky (read-only)`. The new version overwrites the > > rear-nonsticky property so that it is only `(field)`. > > Thanks for noticing this. > > > If I set `eshell-highlight-prompt' to `t', then I get the read-only > > behavior that I want, but now I cannot get the pleasant component > > highlighting that `fancy-shell' is meant to provide. > > If you set the 'face' attribute instead of the 'font-lock-face' > attribute, you should get the highlighting you want (that's what I do) > while 'eshell-highlight-prompt' is non-nil. > > Here's a patch to fix this though so that we're more careful about not > clobbering stickiness properties. Eli, what do you think about this > patch? It fixes a regression from Emacs 29, but the diff is fairly large > for so late in the Emacs 30 cycle. Unfortunately, I can't think of a > better solution that doesn't just shuffle the bug around to a different > spot. On the plus side, this code already has regression tests, and it > was easy to add a new one for this case. > > Personally, I'd be ok with having this be a known bug (there's a > workaround for Emacs 30) and fixing it on master. But if you think this > change is ok for the release branch, I'd also be ok with installing > there; then people don't need to deal with the workaround. I agree, let's fix this on master. Thanks. ^ permalink raw reply [flat|nested] 4+ messages in thread
* bug#74230: 30.0.92; eshell-emit-prompt clobbers text properties 2024-11-14 8:52 ` Eli Zaretskii @ 2024-11-14 18:33 ` Jim Porter 0 siblings, 0 replies; 4+ messages in thread From: Jim Porter @ 2024-11-14 18:33 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 74230-done, ashton On 11/14/2024 12:52 AM, Eli Zaretskii wrote: >> Date: Thu, 7 Nov 2024 10:16:16 -0800 >> Cc: eliz@gnu.org >> From: Jim Porter <jporterbugs@gmail.com> >> >> Personally, I'd be ok with having this be a known bug (there's a >> workaround for Emacs 30) and fixing it on master. But if you think this >> change is ok for the release branch, I'd also be ok with installing >> there; then people don't need to deal with the workaround. > > I agree, let's fix this on master. Sounds good to me. I've therefore merged my patch to the master branch as df288d2e414, so closing this bug. If we think this issue is important enough to fix for Emacs 30, I suppose we could consider backporting my patch for the (hypothetical) 30.2 release after 30.1 is tagged. Then users could get the fix a bit faster, and we wouldn't be adding last-minute changes to 30.1. I don't have a strong opinion on whether to do this or not though. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-11-14 18:33 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-11-06 18:21 bug#74230: 30.0.92; eshell-emit-prompt clobbers text properties Ashton Wiersdorf 2024-11-07 18:16 ` Jim Porter 2024-11-14 8:52 ` Eli Zaretskii 2024-11-14 18:33 ` Jim Porter
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).