> From: awrhygty@outlook.com > Cc: 69795@debbugs.gnu.org > Date: Tue, 19 Mar 2024 07:54:51 +0900 > > Eli Zaretskii <eliz@gnu.org> writes: > > >> c:\msys64\usr\bin\ matters. And iconv.exe under it makes the difference. > >> In the log below, the process continues after the first call of gdb.exe, > >> while iconv.exe does not exist. > >> And the process finishes after the second call of gdb.exe, > >> while iconv.exe exists. > > > > So what is special with iconv.exe? What does "iconv --version" say? > > Here is the log, and the process finished automatically. > > c:\tmp>c:\msys64\usr\bin\iconv.exe --version > c:\msys64\usr\bin\iconv.exe --version > iconv (GNU libiconv 1.17) > Copyright (C) 2000-2022 Free Software Foundation, Inc. > License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> > This is free software: you are free to change and redistribute it. > There is NO WARRANTY, to the extent permitted by law. > Written by Bruno Haible. > > c:\tmp> > Process shell finished > > > Also, what DLLs does it load? You can find out like this: > > > > objdump -x c:\msys64\usr\bin\iconv.exe | grep -F "DLL Name:" > > I have no objdump. I hope output of ldd.exe helps. > > c:\tmp>c:\msys64\usr\bin\ldd.exe c:\msys64\usr\bin\iconv.exe > c:\msys64\usr\bin\ldd.exe c:\msys64\usr\bin\iconv.exe > ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffd19ad0000) > KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffd17c60000) > KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffd172f0000) > msys-iconv-2.dll => /usr/bin/msys-iconv-2.dll (0x5603f0000) > msys-intl-8.dll => /usr/bin/msys-intl-8.dll (0x430b30000) > msys-2.0.dll => /usr/bin/msys-2.0.dll (0x180040000) > > c:\tmp> > Process shell finished > > > /usr/bin/ is same as c:\msys64\usr\bin\. So you have an MSYS build of iconv.exe, and it seems to be causing these problems. You don't have a MinGW64 build of iconv.exe (in the c:\msys64\mingw64\bin\ directory). So if GD|B needs to invoke iconv.exe, it will invoke the MSYS build, as it cannot find any other one. So my suggestion is to download the MinGW64 build of iconv.exe and install it in the c:\msys64\mingw64\bin\ directory. It is supposed to be part of the libiconv package, I think this is it: https://packages.msys2.org/package/mingw-w64-x86_64-libiconv Please tell if doing that solves the problem.
Dear All, In a diary file, with a simple entry entry "2024-03-19 10:00 Appointment", icalendar-export-file process to an error: "Could not parse date". The entry is provided by the default value of calendar-iso-date-display-form. I solve the problem with the following patch mathchin '-' has a separator in the function icalendar--datestring-to-isodate : diff -u --label /usr/local/share/emacs/29.1/lisp/calendar/icalendar.el.gz --label /tmp/icalendar.el /tmp/jka-commHr8dl /tmp/icalendar.el --- /usr/local/share/emacs/29.1/lisp/calendar/icalendar.el.gz +++ /tmp/icalendar.el @@ -894,8 +894,8 @@ (save-match-data (cond ( ;; iso-style numeric date (string-match (concat "\\s-*" - "\\([0-9]\\{4\\}\\)[ \t/]\\s-*" - "0?\\([1-9][0-9]?\\)[ \t/]\\s-*" + "\\([0-9]\\{4\\}\\)[ \t/-]\\s-*" + "0?\\([1-9][0-9]?\\)[ \t/-]\\s-*" "0?\\([1-9][0-9]?\\)") datestring) (setq year (read (substring datestring (match-beginning 1) Diff finished. Tue Mar 19 02:40:06 2024 Is it a correct solution to proposed? RwN. In GNU Emacs 29.1 (build 3, x86_64-pc-linux-gnu, GTK+ Version 3.24.33, cairo version 1.16.0) of 2023-10-16 built on laptop Windowing system distributor 'The X.Org Foundation', version 11.0.12101004 System Description: Ubuntu 22.04.4 LTS Configured features: ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB Important settings: value of $LANG: fr_FR.UTF-8 value of $XMODIFIERS: @im=ibus locale-coding-system: utf-8-unix Major mode: Fundamental Minor modes in effect: marginalia-mode: t vertico-mode: t recentf-mode: t savehist-mode: t minibuffer-electric-default-mode: t minibuffer-depth-indicate-mode: t windmove-mode: t delete-selection-mode: t server-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 global-font-lock-mode: t blink-cursor-mode: t buffer-read-only: t column-number-mode: t line-number-mode: t indent-tabs-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t Load-path shadows: /home/erwan/.emacs.d/etc/custom hides /usr/local/share/emacs/29.1/lisp/custom Features: (shadow sort flycheck-grammalecte grammalecte flycheck flyspell ispell mail-extr emacsbug vertico-directory cl-extra help-mode orderless cursor-sensor display-line-numbers display-fill-column-indicator rwn-emacs-completion marginalia vertico compat recentf tree-widget savehist minibuf-eldef mb-depth rwn-emacs-diary mc tempo-api request french-holidays holidays holiday-loaddefs appt diary-lib diary-loaddefs solar cal-dst rwn-emacs-windows rwn-emacs-spelling rwn-emacs-vc rwn-emacs-dired dired-preview rwn-emacs-latex rwn-emacs-pdf pdf-loader rwn-emacs-mail rwn-mail mu4e mu4e-org org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-src ob-comint org-pcomplete pcomplete org-list org-footnote org-faces org-entities noutline outline icons ob-emacs-lisp ob-core ob-eval org-cycle org-table ol rx org-fold org-fold-core org-keys oc org-loaddefs find-func org-version org-compat org-macs format-spec mu4e-notification notifications mu4e-main smtpmail mu4e-view pcase mu4e-mime-parts thingatpt comint ansi-osc ansi-color ring gnus-art mm-uu mml2015 mm-view mml-smime smime gnutls dig gnus-sum gnus-group gnus-undo gnus-start gnus-dbus dbus gnus-cloud nnimap nnmail mail-source utf7 nnoo parse-time iso8601 gnus-spec gnus-int gnus-range gnus-win gnus wid-edit cal-menu calendar cal-loaddefs mu4e-headers mu4e-thread mu4e-actions mu4e-compose nnheader range mu4e-search mu4e-lists mu4e-bookmarks mu4e-mark mu4e-message shr pixel-fill kinsoku url-file svg xml dom flow-fill mule-util hl-line mu4e-contacts mu4e-update mu4e-folders mu4e-context mu4e-query-items mu4e-server mu4e-modeline mu4e-vars mu4e-helpers mu4e-config mu4e-window bookmark pp ido message sendmail yank-media puny dired dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util text-property-search time-date mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr mailabbrev mail-utils gmm-utils mailheader mu4e-obsolete rwn-emacs-themes standard-dark-theme standard-themes rwn-emacs-packages finder-inf auctex-autoloads tex-site biblio-autoloads biblio-core-autoloads citar-embark-autoloads citar-autoloads citeproc-autoloads consult-autoloads dired-preview-autoloads embark-autoloads f-autoloads dash-autoloads flycheck-grammalecte-autoloads flycheck-autoloads marginalia-autoloads messages-are-flowing-autoloads orderless-autoloads parsebib-autoloads pdf-tools-autoloads pkg-info-autoloads epl-autoloads queue-autoloads request-autoloads s-autoloads standard-themes-autoloads string-inflection-autoloads sudo-edit-autoloads tablist-autoloads vertico-autoloads info compat-autoloads package browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers 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 rwn-emacs-essentials windmove delsel rwn-common cl-loaddefs cl-lib server rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads dbusbind inotify lcms2 dynamic-setting system-font-setting font-render-setting cairo move-toolbar gtk x-toolkit xinput2 x multi-tty make-network-process emacs) Memory information: ((conses 16 468357 33831) (symbols 48 30514 4) (strings 32 153392 6568) (string-bytes 1 4223999) (vectors 16 50001) (vector-slots 8 578847 29215) (floats 8 615 116) (intervals 56 357 175) (buffers 976 11))
"Sparapani, Rodney" <rsparapa@mcw.edu> writes: > Usually, this will lock-up emacs and you have to kill it from > > the window manager which seems to be the only option available. > > When there are unsaved files, you still get a prompt for that > so it is not a crash, but just very annoying. > > However, I realized that this bug/feature had already been > > addressed for LUCID scrollbars in lwlib/xlwmenu.c but that code > > is inactive for Motif. So the simple solution is to uncomment > > this block from lines 2906 to 2913 for Motif as well... > > //#ifdef emacs > > if (x_had_errors_p (display)) > > { > > pointer_grabbed = 0; > > XtUngrabPointer ((Widget)mw, event->time); > > } > > x_uncatch_errors (); > > //#endif The macro emacs is always defined, and this block of code relies on the presence of an earlier call to x_catch_errors, which would not have been satisified if this "#ifdef emacs" was inactive. Therefore, something else is at work here.
[-- Attachment #1: Type: text/plain, Size: 797 bytes --] On 3/18/2024 5:37 AM, Eli Zaretskii wrote: >> Date: Sun, 17 Mar 2024 12:24:26 -0700 >> Cc: 68254@debbugs.gnu.org >> From: Jim Porter <jporterbugs@gmail.com> >> >> Here's a patch for this. It turns 'eww-readable' into a toggle (using >> the same semantics as minor modes), and also adds an option to prevent >> adding a new history entry for each call. > > Thanks. Thanks for looking. I've addressed all of your comments, and made some more extensive changes to the implementation. I split up some of the logic in the first patch so that it's easier to reuse without error, and then added 'eww-readable-urls' in the second. Because of how much I changed, I'd like to add some regression tests to make sure everything still works correctly, but otherwise these patches should be ready to go. [-- Attachment #2: 0001-Allow-toggling-readable-mode-in-EWW.patch --] [-- Type: text/plain, Size: 10793 bytes --] From 4839990148e2a58cf44c04547994611392ff1955 Mon Sep 17 00:00:00 2001 From: Jim Porter <jporterbugs@gmail.com> Date: Sun, 17 Mar 2024 12:01:59 -0700 Subject: [PATCH 1/2] Allow toggling "readable" mode in EWW Additionally, add an option to prevent adding a new history entry for each call of 'eww-readable' (bug#68254). * lisp/net/eww.el (eww-retrieve): * lisp/net/eww.el (eww-readable-adds-to-history): New option. (eww-retrieve): Make sure we call CALLBACK in all configurations. (eww-render): Simplify how to pass encoding. (eww--parse-html-region, eww-display-document): New functions, extracted from... (eww-display-html): ... here. (eww-document-base): New function. (eww-readable): Toggle "readable" mode interactively, like with a minor mode. Consult 'eww-readable-adds-to-history'. (eww-reload): Use 'eshell-display-document'. * doc/misc/eww.texi (Basics): Describe the new behavior. * etc/NEWS: Announce this change. --- doc/misc/eww.texi | 5 ++ etc/NEWS | 12 +++++ lisp/net/eww.el | 127 ++++++++++++++++++++++++++++++---------------- 3 files changed, 99 insertions(+), 45 deletions(-) diff --git a/doc/misc/eww.texi b/doc/misc/eww.texi index d31fcf1802b..522034c874d 100644 --- a/doc/misc/eww.texi +++ b/doc/misc/eww.texi @@ -146,6 +146,11 @@ Basics which part of the document contains the ``readable'' text, and will only display this part. This usually gets rid of menus and the like. + When called interactively, this command toggles the display of the +readable parts. With a positive prefix argument, this command always +displays the readable parts, and with a zero or negative prefix, it +always displays the full page. + @findex eww-toggle-fonts @vindex shr-use-fonts @kindex F diff --git a/etc/NEWS b/etc/NEWS index b02712dd21c..b23754fb17f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1054,6 +1054,18 @@ entries newer than the current page. To change the behavior when browsing from "historical" pages, you can customize 'eww-before-browse-history-function'. ++++ +*** 'eww-readable' now toggles display of the readable parts of a web page. +When called interactively, 'eww-readable' toggles whether to display +only the readable parts of a page or the full page. With a positive +prefix argument, always display the readable parts, and with a zero or +negative prefix, always display the full page. + +--- +*** New option 'eww-readable-adds-to-history'. +When non-nil (the default), calling 'eww-readable' adds a new entry to +the EWW page history. + ** go-ts-mode +++ diff --git a/lisp/net/eww.el b/lisp/net/eww.el index 54847bdf396..fd697846988 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -275,6 +275,11 @@ eww-url-transformers :type '(repeat function) :version "29.1") +(defcustom eww-readable-adds-to-history t + "If non-nil, calling `eww-readable' adds a new entry to the history." + :type 'boolean + :version "30.1") + (defface eww-form-submit '((((type x w32 ns haiku pgtk android) (class color)) ; Like default mode line :box (:line-width 2 :style released-button) @@ -464,11 +469,11 @@ eww (defun eww-retrieve (url callback cbargs) (cond ((null eww-retrieve-command) - (url-retrieve url #'eww-render cbargs)) + (url-retrieve url callback cbargs)) ((eq eww-retrieve-command 'sync) (let ((data-buffer (url-retrieve-synchronously url))) (with-current-buffer data-buffer - (apply #'eww-render nil cbargs)))) + (apply callback nil cbargs)))) (t (let ((buffer (generate-new-buffer " *eww retrieve*")) (error-buffer (generate-new-buffer " *eww error*"))) @@ -673,9 +678,9 @@ eww-render (insert (format "<a href=%S>Direct link to the document</a>" url)) (goto-char (point-min)) - (eww-display-html charset url nil point buffer encode)) + (eww-display-html (or encode charset) url nil point buffer)) ((eww-html-p (car content-type)) - (eww-display-html charset url nil point buffer encode)) + (eww-display-html (or encode charset) url nil point buffer)) ((equal (car content-type) "application/pdf") (eww-display-pdf)) ((string-match-p "\\`image/" (car content-type)) @@ -723,37 +728,43 @@ eww-detect-charset "[\t\n\r ]*<\\?xml[\t\n\r ]+[^>]*encoding=\"\\([^\"]+\\)") (match-string 1))))) +(defun eww--parse-html-region (start end &optional encode) + "Parse the HTML between START and END, returning the DOM as an S-expression. +Use ENCODE to decode the region; if nil, decode as UTF-8. + +This replaces the region with the preprocessed HTML." + (setq encode (or encode 'utf-8)) + (with-restriction start end + (condition-case nil + (decode-coding-region (point-min) (point-max) encode) + (coding-system-error nil)) + ;; Remove CRLF and replace NUL with � before parsing. + (while (re-search-forward "\\(\r$\\)\\|\0" nil t) + (replace-match (if (match-beginning 1) "" "�") t t)) + (eww--preprocess-html (point-min) (point-max)) + (libxml-parse-html-region (point-min) (point-max)))) + +(defsubst eww-document-base (url dom) + `(base ((href . ,url)) ,dom)) + (declare-function libxml-parse-html-region "xml.c" (start end &optional base-url discard-comments)) -(defun eww-display-html (charset url &optional document point buffer encode) +(defun eww-display-document (document &optional point buffer) (unless (fboundp 'libxml-parse-html-region) (error "This function requires Emacs to be compiled with libxml2")) + (setq buffer (or buffer (current-buffer))) (unless (buffer-live-p buffer) (error "Buffer %s doesn't exist" buffer)) ;; There should be a better way to abort loading images ;; asynchronously. (setq url-queue nil) - (let ((document - (or document - (list - 'base (list (cons 'href url)) - (progn - (setq encode (or encode charset 'utf-8)) - (condition-case nil - (decode-coding-region (point) (point-max) encode) - (coding-system-error nil)) - (save-excursion - ;; Remove CRLF and replace NUL with � before parsing. - (while (re-search-forward "\\(\r$\\)\\|\0" nil t) - (replace-match (if (match-beginning 1) "" "�") t t))) - (eww--preprocess-html (point) (point-max)) - (libxml-parse-html-region (point) (point-max)))))) - (source (and (null document) - (buffer-substring (point) (point-max))))) + (let ((url (when (eq (car document) 'base) + (alist-get 'href (cadr document))))) + (unless url + (error "Document is missing base URL")) (with-current-buffer buffer (setq bidi-paragraph-direction nil) - (plist-put eww-data :source source) (plist-put eww-data :dom document) (let ((inhibit-read-only t) (inhibit-modification-hooks t) @@ -794,6 +805,16 @@ eww-display-html (forward-line 1))))) (eww-size-text-inputs)))) +(defun eww-display-html (charset url &optional document point buffer) + (let ((source (buffer-substring (point) (point-max)))) + (with-current-buffer buffer + (plist-put eww-data :source source))) + (eww-display-document + (or document + (eww-document-base + url (eww--parse-html-region (point) (point-max) charset))) + point buffer)) + (defun eww-handle-link (dom) (let* ((rel (dom-attr dom 'rel)) (href (dom-attr dom 'href)) @@ -1055,30 +1076,47 @@ eww-toggle-paragraph-direction "automatic" bidi-paragraph-direction))) -(defun eww-readable () - "View the main \"readable\" parts of the current web page. +(defun eww-readable (&optional arg) + "Toggle display of only the main \"readable\" parts of the current web page. This command uses heuristics to find the parts of the web page that -contains the main textual portion, leaving out navigation menus and -the like." - (interactive nil eww-mode) +contain the main textual portion, leaving out navigation menus and the +like. + +If called interactively, toggle the display of the readable parts. If +the prefix argument is positive, display the readable parts, and if it +is zero or negative, display the full page. + +If called from Lisp, toggle the display of the readable parts if ARG is +`toggle'. Display the readable parts if ARG is nil, omitted, or is a +positive number. Display the full page if ARG is a negative number. + +When `eww-readable-adds-to-history' is non-nil, calling this function +adds a new entry to `eww-history'." + (interactive (list (if current-prefix-arg + (prefix-numeric-value current-prefix-arg) + 'toggle)) + eww-mode) (let* ((old-data eww-data) - (dom (with-temp-buffer + (make-readable (cond + ((eq arg 'toggle) + (not (plist-get old-data :readable))) + ((and (numberp arg) (< arg 1)) + nil) + (t t))) + (dom (with-temp-buffer (insert (plist-get old-data :source)) - (condition-case nil - (decode-coding-region (point-min) (point-max) 'utf-8) - (coding-system-error nil)) - (eww--preprocess-html (point-min) (point-max)) - (libxml-parse-html-region (point-min) (point-max)))) + (eww--parse-html-region (point-min) (point-max)))) (base (plist-get eww-data :url))) - (eww-score-readability dom) - (eww-save-history) - (eww--before-browse) - (eww-display-html nil nil - (list 'base (list (cons 'href base)) - (eww-highest-readability dom)) - nil (current-buffer)) - (dolist (elem '(:source :url :title :next :previous :up :peer)) - (plist-put eww-data elem (plist-get old-data elem))) + (when make-readable + (eww-score-readability dom) + (setq dom (eww-highest-readability dom))) + (when eww-readable-adds-to-history + (eww-save-history) + (eww--before-browse) + (dolist (elem '(:source :url :title :next :previous :up :peer)) + (plist-put eww-data elem (plist-get old-data elem)))) + (eww-display-document (eww-document-base base dom)) + (plist-put eww-data :readable make-readable) (eww--after-page-change))) (defun eww-score-readability (node) @@ -1398,8 +1436,7 @@ eww-reload (if local (if (null (plist-get eww-data :dom)) (error "No current HTML data") - (eww-display-html 'utf-8 url (plist-get eww-data :dom) - (point) (current-buffer))) + (eww-display-document (plist-get eww-data :dom) (point))) (let ((parsed (url-generic-parse-url url))) (if (equal (url-type parsed) "file") ;; Use Tramp instead of url.el for files (since url.el -- 2.25.1 [-- Attachment #3: 0002-Add-eww-readable-urls.patch --] [-- Type: text/plain, Size: 4771 bytes --] From a6634a1d5d0cb440554eeaa5a014406e40ffeee9 Mon Sep 17 00:00:00 2001 From: Jim Porter <jporterbugs@gmail.com> Date: Mon, 18 Mar 2024 16:52:34 -0700 Subject: [PATCH 2/2] Add 'eww-readable-urls' * lisp/net/eww.el (eww-readable-urls): New option. (eww-default-readable-p): New function... (eww-display-html): ... use it. * doc/misc/eww.texi (Basics): Document 'eww-readable-urls'. * etc/NEWS: Announce this change. --- doc/misc/eww.texi | 16 ++++++++++++++++ etc/NEWS | 6 ++++++ lisp/net/eww.el | 38 +++++++++++++++++++++++++++++++++----- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/doc/misc/eww.texi b/doc/misc/eww.texi index 522034c874d..a08d6694892 100644 --- a/doc/misc/eww.texi +++ b/doc/misc/eww.texi @@ -151,6 +151,22 @@ Basics displays the readable parts, and with a zero or negative prefix, it always displays the full page. +@vindex eww-readable-urls + If you want EWW to render a certain page in ``readable'' mode by +default, you can add a regular expression matching its URL to +@code{eww-readable-urls}. Each entry can either be a regular expression +as a string or a cons cell of the form @code{(@var{regexp} +. @var{readability})}. If @var{readability} is non-@code{nil}, this +behaves the same as the string form; otherwise, URLs matching +@var{regexp} will never be displayed in readable mode by default. For +example, you can use this to make all pages default to readable mode, +except for a few outliers: + +@example +(setq eww-readable-urls '(("https://example\\.com/" . nil) + ".*")) +@end example + @findex eww-toggle-fonts @vindex shr-use-fonts @kindex F diff --git a/etc/NEWS b/etc/NEWS index b23754fb17f..2af00f712a4 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1061,6 +1061,12 @@ only the readable parts of a page or the full page. With a positive prefix argument, always display the readable parts, and with a zero or negative prefix, always display the full page. ++++ +*** New option 'eww-readable-urls'. +This is a list of regular expressions matching the URLs where EWW should +display only the readable parts by default. For more details, see +"(eww) Basics" in the EWW manual. + --- *** New option 'eww-readable-adds-to-history'. When non-nil (the default), calling 'eww-readable' adds a new entry to diff --git a/lisp/net/eww.el b/lisp/net/eww.el index fd697846988..9505378e040 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -275,6 +275,19 @@ eww-url-transformers :type '(repeat function) :version "29.1") +(defcustom eww-readable-urls nil + "A list of regexps matching URLs to display in readable mode by default. +Each element can be either a string regexp or a cons cell of the +form (REGEXP . READABILITY). If READABILITY is non-nil, this behaves +the same as the string form; otherwise, URLs matching REGEXP will never +be displayed in readable mode by default." + :type '(repeat (choice (string :tag "Readable URL") + (cons :tag "URL and Readability" + (string :tag "URL") + (radio (const :tag "Readable" t) + (const :tag "Non-readable" nil))))) + :version "30.1") + (defcustom eww-readable-adds-to-history t "If non-nil, calling `eww-readable' adds a new entry to the history." :type 'boolean @@ -809,11 +822,13 @@ eww-display-html (let ((source (buffer-substring (point) (point-max)))) (with-current-buffer buffer (plist-put eww-data :source source))) - (eww-display-document - (or document - (eww-document-base - url (eww--parse-html-region (point) (point-max) charset))) - point buffer)) + (unless document + (let ((dom (eww--parse-html-region (point) (point-max) charset))) + (when (eww-default-readable-p url) + (eww-score-readability dom) + (setq dom (eww-highest-readability dom))) + (setq document (eww-document-base url dom)))) + (eww-display-document document point buffer)) (defun eww-handle-link (dom) (let* ((rel (dom-attr dom 'rel)) @@ -1159,6 +1174,19 @@ eww-highest-readability (setq result highest)))) result)) +(defun eww-default-readable-p (url) + "Return non-nil if URL should be displayed in readable mode by default. +This consults the entries in `eww-readable-urls' (which see)." + (catch 'found + (let (result) + (dolist (regexp eww-readable-urls) + (if (consp regexp) + (setq result (cdr regexp) + regexp (car regexp)) + (setq result t)) + (when (string-match regexp url) + (throw 'found result)))))) + (defvar-keymap eww-mode-map "g" #'eww-reload ;FIXME: revert-buffer-function instead! "G" #'eww -- 2.25.1
Cygw32 build fails on master $ make (snip) CC w32xfns.o In file included from ../../../emacs/trunk/src/w32xfns.c:35: /usr/include/w32api/wtsapi32.h:147:16: error: redeclaration of ‘enum _WTS_VIRTUAL_CLASS’ 147 | typedef enum _WTS_VIRTUAL_CLASS { | ^~~~~~~~~~~~~~~~~~ ../../../emacs/trunk/src/w32xfns.c:30:14: note: originally defined here 30 | typedef enum _WTS_VIRTUAL_CLASS { | ^~~~~~~~~~~~~~~~~~ In file included from ../../../emacs/trunk/src/w32xfns.c:35: /usr/include/w32api/wtsapi32.h:148:5: error: redeclaration of enumerator ‘WTSVirtualClientData’ 148 | WTSVirtualClientData,WTSVirtualFileHandle | ^~~~~~~~~~~~~~~~~~~~ ../../../emacs/trunk/src/w32xfns.c:31:3: note: previous definition of ‘WTSVirtualClientData’ with type ‘enum _WTS_VIRTUAL_CLASS’ 31 | WTSVirtualClientData, | ^~~~~~~~~~~~~~~~~~~~ In file included from ../../../emacs/trunk/src/w32xfns.c:35: /usr/include/w32api/wtsapi32.h:148:26: error: redeclaration of enumerator ‘WTSVirtualFileHandle’ 148 | WTSVirtualClientData,WTSVirtualFileHandle | ^~~~~~~~~~~~~~~~~~~~ ../../../emacs/trunk/src/w32xfns.c:32:3: note: previous definition of ‘WTSVirtualFileHandle’ with type ‘enum _WTS_VIRTUAL_CLASS’ 32 | WTSVirtualFileHandle | ^~~~~~~~~~~~~~~~~~~~ ../../../emacs/trunk/src/w32xfns.c: In function ‘drain_message_queue’: ../../../emacs/trunk/src/w32xfns.c:431:13: warning: implicit declaration of function ‘reset_w32_kbdhook_state’ [-Wimplicit-function-declaration] 431 | reset_w32_kbdhook_state (); | ^~~~~~~~~~~~~~~~~~~~~~~ ../../../emacs/trunk/src/w32xfns.c:431:13: warning: nested extern declaration of ‘reset_w32_kbdhook_state’ [-Wnested-externs] it seems that _WTS_VIRTUAL_CLASS is defines in Cygwin's headaer and reset_w32_kbdhook_state is not defined on Cygw32 build. -- Kazuhiro Ito
Eli Zaretskii <eliz@gnu.org> writes: >> c:\msys64\usr\bin\ matters. And iconv.exe under it makes the difference. >> In the log below, the process continues after the first call of gdb.exe, >> while iconv.exe does not exist. >> And the process finishes after the second call of gdb.exe, >> while iconv.exe exists. > > So what is special with iconv.exe? What does "iconv --version" say? Here is the log, and the process finished automatically. c:\tmp>c:\msys64\usr\bin\iconv.exe --version c:\msys64\usr\bin\iconv.exe --version iconv (GNU libiconv 1.17) Copyright (C) 2000-2022 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Bruno Haible. c:\tmp> Process shell finished > Also, what DLLs does it load? You can find out like this: > > objdump -x c:\msys64\usr\bin\iconv.exe | grep -F "DLL Name:" I have no objdump. I hope output of ldd.exe helps. c:\tmp>c:\msys64\usr\bin\ldd.exe c:\msys64\usr\bin\iconv.exe c:\msys64\usr\bin\ldd.exe c:\msys64\usr\bin\iconv.exe ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffd19ad0000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffd17c60000) KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffd172f0000) msys-iconv-2.dll => /usr/bin/msys-iconv-2.dll (0x5603f0000) msys-intl-8.dll => /usr/bin/msys-intl-8.dll (0x430b30000) msys-2.0.dll => /usr/bin/msys-2.0.dll (0x180040000) c:\tmp> Process shell finished /usr/bin/ is same as c:\msys64\usr\bin\. c:\tmp>c:\msys64\usr\bin\mount.exe c:\msys64\usr\bin\mount.exe C:/msys64 on / type ntfs (binary,noacl,auto) C:/msys64/usr/bin on /bin type ntfs (binary,noacl,auto) C: on /c type ntfs (binary,noacl,posix=0,user,noumount,auto) c:\tmp> Process shell finished
On 16/03/2024 15:31, sbaugh@catern.com wrote: >> This is technically doable, but what looks worrying to me, is that >> this would make 'project-current' lose more of its idempotency. >> >> Originally, the DIRECTORY argument for it was intended to make sure >> that all calls from the same directory would return the same >> instance. But of course a hook can be local, so some can find it >> practical to define buffer-local projects. This side-steps the >> original design, making, for example, the relation "files A and B are >> in the same project" not necessarily symmetric or transitive. > > True, that's annoying. > > Here's an alternative implementation: Maybe we could have a new > project-guess-functions hook which is only run when maybe-prompt=t. And > these functions should return either nil, or a directory in which to > find a project. And they're allowed to prompt or error or whatever. > > And project-guess-functions would only be called if a DIRECTORY wasn't > provided to project-current. (And maybe only if default-directory is > nil? I'm indifferent about whether project-guess-functions or > default-directory takes precedence) > > Then project-find-functions could still be globally the same, so > project-current would always return the same result for the same > DIRECTORY. That still sounds like the same semantics change in 'project-current', something that would reflect on its callers. >>> Possible new functions for project-find-functions which would benefit >>> from this: >>> - A local project-find-function in a version control buffer for >>> viewing >>> a branch log; if the branch is not currently checked out, prompt to >>> check out that branch (or create a worktree for it) before returning the >>> project >>> - A local project-find-function in a buffer from a package for Git >>> forges; if the buffer corresponds to a repository which is not currently >>> cloned locally, prompt to clone the repository. >>> These behaviors should of course be suppressed if maybe-prompt is >>> nil, >>> which is why it would be nice to be able to access maybe-prompt. >> >> What would such project functions return when maybe-prompt is nil? >> Also nil, right? That would kind of create a separate category of >> projects, interactive-only. > > They would always return nil when maybe-prompt is nil. But when they > return something, it would be a normal vc project. All right, that's what I thought. >> With regards to caching, for example, if some caller wanted to do so >> (some related discussion: >> https://github.com/joaotavora/breadcrumb/issues/18#issuecomment-1984615275), >> then would also need to take this parameter into account. > > True, but it's already not correct to cache when maybe-prompt=t, right? > Because the returned project may just be the one that the user choose > interactively at the prompt. It's... a good point, but so far the main exception was the "transient" project, for which one could make an exception somehow, or even cache without major downsides, as long as buffer stays the same and the cache interval is low. Disabling cache altogether with maybe-prompt=t might be a net negative, given that many users' interaction with project.el might be limited to commands that only do such invocations. But perhaps it's the price to pay for flexibility: as long as we're talking about external cache, it will be up to the callers to avoid caching where the results can be non-deterministic, such as after a prompt. >> So the first thing I'd ask is whether you see a different way to >> implement the same features. I don't see the whole usage scenarios, so >> it's hard to judge. > > Let me give some context about my concrete use case. > > At Jane Street we have a code review system built on top of Emacs, > called FE. A user opens a code review in a buffer in Emacs, and can see > that review's diff. If they want to comment on the review, or build the > code or test it or anything like that, they need to also have a local > working copy of the code in the review. The local working copy for each > review is kept separately, like git worktrees. > > (There are some other details and screenshots in > https://blog.janestreet.com/putting-the-i-back-in-ide-towards-a-github-explorer/ > but this should suffice) > > So my use case then is this: when a user opens code review FE-123 in a > buffer, they look at the diff and then decide they want to do something > in a working copy of the code. Currently, to do that they run one of a > variety of internal commands which duplicate things like > project-find-file, but which are aware of whether or not there's a local > working copy, and operate the local working copy if any, and otherwise > prompt to create a local working copy and then error. > > I'd like to replace those internal commands with just normal > project-find-file, and also allow other commands which use > project-current to determine the current project to just work. If you set up a project instance in a buffer-local way, would it even work correctly outside of that buffer? Would project history work fine? When you pick a project from recently visited, you basically just apply its last root directory and expect the project to be "found". I've read the article (thanks!), but I'm not sure yet of what would be the ergonomic savings in such scenario when instead of having a separate command to check out a branch and visit a file in it (perhaps bound to 'o f' inside the major mode map for the branches list's buffer), you call project-find-file right away. In the former scenario such command would make sure the branch is checked out, so its directory has proper contents, and then it could delegate to project-find-file inside said directory. And later visits (e.g. from project-switch-project) would work fine until the directory is deleted. > (Now that I've framed it this way, I guess a good comparison is to > debbugs. It might be cool if, when you run a project command from a > debbugs buffer, you land in a worktree which has the changes from (any?) > patches in that bug. Although that's obviously quite a bit harder since > you need to find the patch in the thread, and find the base branch to > apply it to.) It seems to me the same principle can apply, with the exception of the difficulties you mention, of course. >>> Since adding a new argument to project-find-functions is hard, maybe we >>> could do this by introducing a new dynamic variable >>> project-find-functions-may-prompt which we let-bind? Like: >>> diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el >>> index c7c07c3d34c..3975182b88d 100644 >>> --- a/lisp/progmodes/project.el >>> +++ b/lisp/progmodes/project.el >>> @@ -242,8 +242,9 @@ project-current >>> (setq pr (cons 'transient directory)))) >>> pr)) >>> -(defun project--find-in-directory (dir) >>> - (run-hook-with-args-until-success 'project-find-functions dir)) >>> +(defun project--find-in-directory (dir &optional maybe-prompt) >>> + (let ((project-find-functions-may-prompt maybe-prompt)) >>> + (run-hook-with-args-until-success 'project-find-functions dir))) >>> (defvar project--within-roots-fallback nil) >> >> As far as the implementation goes, a dynamic variable can work. We >> could also try reusing an existing one: non-essential, and we'd set it >> to nil when maybe-prompt is non-nil. >> >> I wonder how it would interact with Tramp (ask for password in >> disconnected buffers?), but that seems to fall into the same general >> category as your other cases. > > Nice idea, it does seem like we should probably already be binding > non-essential=t around project-find-functions when maybe-prompt is nil. > Since already TRAMP can cause prompting even when a programmer calls > project-current with maybe-prompt=nil. If this change will be enough to cover your scenario, let's go ahead and add the 'non-essential' binding. It does seem to make sense for Tramp, at least.
Recipe for reproducing this problem: 1. Start Emacs at a shell prompt using "emacs -Q". 2. Evaluate the following expressions in the *scratch* buffer. The following keys evaluate as valid (as expected): (key-valid-p "TAB") (key-valid-p "<TAB>") (key-valid-p "<tab>") The following key evaluates as invalid (as expected): (key-valid-p "tab") 3. So, the following expressions should evaluate to ‘indent-for-tab-command’: (keymap-global-set "<tab>" 'indent-for-tab-command) (keymap-global-set "TAB" 'indent-for-tab-command) (keymap-global-set "<TAB>" 'indent-for-tab-command) The first two expressions evaluate as expected, but when the third expression is evaluated, then the following message is reported: keymap-global-set: To bind the key TAB, use [?\t], not [TAB] Because (key-valid-p "<TAB>") evaluates to t, that error message appears to be invalid. 4. Also, the following expressions all evaluate to nil: (key-valid-p "[?\t]") (key-valid-p "[?\\t]") (key-valid-p "?\t") (key-valid-p "?\\t") (key-valid-p "<?\t>") (key-valid-p "<?\\t>") So the error message appears to direct a user to change the key string to an invalid key. --
Gabriele Nicolardi <gabriele@medialab.sissa.it> writes:
> Il 15/03/24 14:52, Andrea Corallo ha scritto:
>
> kay I've installed 00553628558 into master, I believe it does what we
> want and seems to fix the minimal reproducer I made from the original
> example.
>
> Gabriele could you check it solves the issue for you?
>
> I confirm that the version compiled from master resolves my issue.
>
> Thank you!
>
> Gabriele
Very cool. I'll keep this bug open a bit just so we remeber to
re-evaluate the backport.
Thanks!
Andrea
The Emacs Lisp file "../lisp/textmodes/paragraphs.el" does not include an expression to announce that "paragraphs" is a feature in the current Emacs, that is, near the end "paragraphs.el" there is no expression: (provide 'paragraphs) Because of this, if (require 'paragraphs) is included in an Emacs Lisp source file, then the byte-compiler will issue an error message saying that loading the file ‘paragraphs.elc’ failed to provide the feature ‘paragraphs’. --
[-- Attachment #1: Type: text/plain, Size: 433 bytes --] On Mon 2024-03-18 13:30 -0400, Andrea Corallo wrote: > Okay after reducing it I believe it's a duplicate of 67883 so I'm > merging them. > > Andrea Thank you Andrea! Now I'm going to try living with package.el for a while to see if I still have friction with it. Maybe I can just never trigger this again :) cheers Jon -- In this world / we walk on the roof of hell / gazing at flowers - Kobayashi Issa [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --]
merge 69872 67883
thanks
Andrea Corallo <acorallo@gnu.org> writes:
> Jon Levin via "Bug reports for GNU Emacs, the Swiss army knife of text
> editors" <bug-gnu-emacs@gnu.org> writes:
>
>> When I update my installed packages on some version of emacs which
>> is build with native-compilation enabled, most times I end up
>> having to kill emacs and restart it in order to sidestep a problem
>> where a single emacs process, seemingly running a compilation step
>> (I think) uses 100% of a single virtual core and never completes.
>>
>> This is the process responsible:
>>
>> mhcat 12800 6874 99 09:10 pts/96 00:10:41 /usr/bin/emacs
>> -no-comp-spawn -Q --batch --eval (setq w32-disable-abort-dialog t)
>> -l /tmp/emacs-async-comp-seq-tests-znp6r0.el
>>
>> I am not sure how to go about reproducing this problem from a
>> standing start (emacs -Q) because this seems to be part of an
>> otherwise opaque series of steps, and I'm not sure how it starts.
>>
>> Perhaps the author of seq.el can help me put together such a test.
>>
>> This is not a new problem, but I noticed that there is a plan to
>> make native-comp part of the default emacs build, to which I have
>> no objection, but feel that my experience is a data point which
>> should not be overlooked. I usually end up building a
>> non-native-comp version of emacs as a daily driver (I am lucky
>> enough to have systems powerful enough that I notice no difference
>> in performance with or without native-compilation enabled - aside
>> from the initial compilation phases which in the case of
>> native-comp, which are a minor inconvenience).
>>
>> Thanks!
>
> Hi Jon,
>
> I can reproduce on master with:
>
> ./src/emacs -batch -l comp -f batch-native-compile test/lisp/emacs-lisp/seq-tests.el
>
> I'll try to have look.
Okay after reducing it I believe it's a duplicate of 67883 so I'm
merging them.
Andrea
[-- Attachment #1: Type: text/plain, Size: 347 bytes --] Il 15/03/24 14:52, Andrea Corallo ha scritto: > kay I've installed 00553628558 into master, I believe it does what we > want and seems to fix the minimal reproducer I made from the original > example. > > Gabriele could you check it solves the issue for you? I confirm that the version compiled from master resolves my issue. Thank you! Gabriele [-- Attachment #2: Type: text/html, Size: 637 bytes --]
[-- Attachment #1: Type: text/plain, Size: 2532 bytes --] Seems I neglected to copy the bug tracker. Here's my reply to Eli and Andrea: On Mon 2024-03-18 13:13 -0400, Jon Levin wrote: > Date: Mon, 18 Mar 2024 13:13:57 -0400 > From: Jon Levin <hi@mhcat.ca> > To: Andrea Corallo <acorallo@gnu.org>, Eli Zaretskii <eliz@gnu.org> > Subject: Re: bug#69872: 29.2; Async native compilation of seq.el test uses > up resources and hangs > > On Mon 2024-03-18 12:51 -0400, Andrea Corallo wrote: > > I can reproduce on master with: > > > > ./src/emacs -batch -l comp -f batch-native-compile test/lisp/emacs-lisp/seq-tests.el > > > > I'll try to have look. > > Thanks! > > Andrea continues: > > I'm wondering as well why seq-tests is loaded in your system as well > > being this a test file. > > On Mon 2024-03-18 18:55 +0200, Eli Zaretskii wrote: > > seq.el is preloaded, so it is native-compiled only during the build, > > and should not be compiled when you update your packages. I think > > what you see is compilation of seq-tests.el, not seq.el, and if that > > is the case, the question is: why does your Emacs decide to compile > > that file? Could you look through your installed packages and see > > which one of them loads seq-tests.el? Is it possible that you have > > seq.el as a separate package, which perhaps Emacs tries to use instead > > of the built-in one? > > That's an excellent question, one which I have asked myself too. > It's almost certain that there is another seq.el being built by my > package manager, straight.el. It appears in dependencies of other > packages, most notably magit. In fact, when I first started seeing > this problem, it was usually while straight.el was building magit - > that package names seq 2.24 as a dependency. I have not spent a lot > of time on the problem but I seem to recall that there have been > breaking changes between versions of seq.el which have taken me on > journies in the past. > > Anyway, I may look into why this happens at some point, but that is > a separate problem and not one which should really attributed to > emacs. It seems that Andrea has found a reproduction of the problem > which should help him find the problem which *is* the subject of > this bug report. > > My guess is that straight.el is being rather too thorough in doing > what it calls a "build" of packages it installs from sources. > > Thanks for the speedy responses! > > cheers > Jon -- In this world / we walk on the roof of hell / gazing at flowers - Kobayashi Issa [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --]
> Date: Sun, 17 Mar 2024 21:05:56 -0500 > Cc: 69837@debbugs.gnu.org > From: Adam Porter <adam@alphapapa.net> > > Hi Eli, > > On 3/17/24 01:25, Eli Zaretskii wrote: > >> Date: Sat, 16 Mar 2024 22:41:37 -0500 > >> From: Adam Porter <adam@alphapapa.net> > >> > >> I've discovered that `vtable-update-object' only works in buffers that > >> are in visible windows. When trying to update vtables in buffers that > >> aren't, the object being updated or replaced fails to be found in the > >> cache, apparently because `vtable--cache-key' uses `window-width' in its > >> value (so maybe if, when the vtable buffer is not visible, the selected > >> window happens to have the same width as the window in which the vtable > >> buffer was previously displayed, it will work by chance). > > > > Does using with-selected-window help to solve the issue? > > Sometimes, but not reliably, because it doesn't matter whether the > window is selected (and the buffer might not have a window, anyway). > I'll try to give a step-by-step explanation: I'm sorry, I'm not familiar with the design of vtable, so I will have to ask you possibly stupid questions. Apologies in advance. > 1. vtable-update-object looks in the vtable's cache to find the cached > information about the representation of the object being updated or > replaced. Is this cache used just to speed up something (and so if the object is not in the cache, Emacs will just work harder to obtain the same information), or is finding the object in the cache absolutely necessary for working with the object? > 2. In the process of doing that, it calls vtable--cache-key, which > returns a cons cell containing the frame-terminal and window-width. If working with an object needs its window-width, does it mean objects are tightly coupled to their windows? If so, what happens when the user or Emacs resizes the window? are the cached objects recomputed to reflect that? > 3. So if the selected frame is on the same terminal, and the selected > window has the same width, as the ones when the vtable was last > generated, the cache key will match. This will allow > vtable-update-object to access the cached values and look for the object > in them. This again seems to imply that an object is tightly coupled to its window, and changes affecting the window must recompute the cached value. Right? Are these keys (window-width, terminal, etc.) only used to look up the object, or are they needed for processing the objects as well? > > If not, can you show a recipe, starting from "emacs -Q", that > > reproduces the problem, so we could study it in more detail? > > I had hoped to avoid writing that much code to demonstrate it. But if > the explanation above doesn't suffice, let me know and I will. It doesn't have to be code, it could be a (possibly long) list of instructions what to type.
[-- Attachment #1: Type: text/plain, Size: 145 bytes --] I pushed a few more commits (an updated patch is attached) which fix some edge cases with ephemeral groups and simplify some functions. Daniel [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: patch --] [-- Type: text/x-patch, Size: 49815 bytes --] From 43f22a60a33536cfcfdec30457123d455d027159 Mon Sep 17 00:00:00 2001 From: Daniel Semyonov <daniel@dsemy.com> Date: Wed, 21 Jun 2023 10:05:04 +0300 Subject: [PATCH] Gnus: Add back end for Atom feeds (nnatom) * lisp/gnus/gnus.el (gnus-valid-select-methods): Add entry for nnatom. * lisp/gnus/nnfeed.el: New file implementing an abstract web feed back end. * lisp/gnus/nnatom.el: New file implementing a back end for Atom feeds. * doc/misc/gnus.texi (Browsing the Web, Back End Interface): * etc/NEWS (Gnus): Document nnatom and nnfeed. --- doc/misc/gnus.texi | 73 +++++ etc/NEWS | 10 + lisp/gnus/gnus.el | 1 + lisp/gnus/nnatom.el | 276 ++++++++++++++++++ lisp/gnus/nnfeed.el | 683 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1043 insertions(+) create mode 100644 lisp/gnus/nnatom.el create mode 100644 lisp/gnus/nnfeed.el diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 419a5390374..49a85576a37 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -715,6 +715,7 @@ Top * Web Searches:: Creating groups from articles that match a string. * RSS:: Reading RDF site summary. +* Atom:: Reading Atom Syndication Format feeds. Other Sources @@ -975,6 +976,7 @@ Top * Writing New Back Ends:: Extending old back ends. * Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end. * Mail-like Back Ends:: Some tips on mail back ends. +* Web Feed Back Ends:: Easily defining back ends for web feeds. Various File Formats @@ -17252,6 +17254,7 @@ Browsing the Web @menu * Web Searches:: Creating groups from articles that match a string. * RSS:: Reading RDF site summary. +* Atom:: Reading Atom Syndication Format feeds. @end menu The main caveat with all these web sources is that they probably won't @@ -17496,6 +17499,40 @@ RSS @end lisp +@node Atom +@subsection Atom +@cindex nnatom +@cindex Atom + +Some web sites provide an Atom Syndication Format feed. Atom is a web +feed format similar in function to RDF Site Summary (@pxref{RSS}). + +The @code{nnatom} back end allows you to add HTTP or local Atom feeds +as Gnus servers (with a single group), as you would with any other +method, by supplying the location of the feed as the server address. +Note, however, that the server address shouldn't be prefixed with +@url{http://} or @url{https://}. + +Features of @code{nnatom} include: + +@itemize @bullet + +@item +Server data is saved per-server in the @file{atom} sub-directory of +@file{gnus-directory}. + +@item +An article part is generated for both the summary and the content for +each entry in the feed. Content of all MIME types should be displayed +correctly through Gnus (as long as they are supported and the feed +specifies a MIME type). + +@item +Article modification and publish dates are tracked, and articles are +updated if changed. + +@end itemize + @node Other Sources @section Other Sources @@ -29997,6 +30034,7 @@ Back End Interface * Writing New Back Ends:: Extending old back ends. * Hooking New Back Ends Into Gnus:: What has to be done on the Gnus end. * Mail-like Back Ends:: Some tips on mail back ends. +* Web Feed Back Ends:: Easily defining back ends for web feeds. @end menu @@ -30769,6 +30807,41 @@ Mail-like Back Ends ("some-group" (34 . 39))) @end example +@node Web Feed Back Ends +@subsection Web Feed Back Ends + +If you want to write a back end for a new type of web feed (RSS, +Atom), or some other type of feed, an ``abstract'' back end +(@code{nnfeed}) exists to enable the creation of such back ends with +minimal knowledge of Gnus. + +@code{nnfeed} defines a generic parser, which uses functions stored in +server variables to parse information from a feed (@code{nnfeed} +itself doesn't actually define any such functions though). + +The data parsed from the feed is stored in server variables (and +stored per-feed in a sub-directory of @option{gnus-directory} whose name +corresponds to the name of the back end). + +A Gnus back end interface is also defined, which uses the data parsed +from the feed. + +Therefore, a new back end only needs to inherit from @code{nnfeed}, +define (fairly) generic parsing functions for the feed type and setup +the required server variables. + +@code{nnfeed} was originally created to support Atom Syndication +Format feeds (@pxref{Atom}), but is very generic (as of writing this, +no standard web feed exists which can meaningfully use all the +features supported): it supports multiple groups contained in a single +feed, it allows for situations when the entire feed can't (or +shouldn't) be read ahead of time and it allows for very advanced +customization of the actual printing of articles from parsed data +(while providing a reasonably powerful default method). + +Further implementation details are available in the documentation +strings of the various @code{nnfeed-*} server variables and +the commentary and other comments of @file{nnfeed.el}. @node Score File Syntax @subsection Score File Syntax diff --git a/etc/NEWS b/etc/NEWS index 69e61d91b0e..ecf06015829 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1190,6 +1190,16 @@ This keyword enables the user to install packages using 'package-vc'. ** Gnus ++++ +*** New back end 'nnfeed'. +This allows back end developers to easily create new back ends for web +feeds, as inheriting back ends of 'nnfeed'. + ++++ +*** New back end 'nnatom'. +This allow users to add Atom Syndication Format feeds to Gnus as +servers. + *** The 'nnweb-type' option 'gmane' has been removed. The gmane.org website is, sadly, down since a number of years with no prospect of it coming back. Therefore, it is no longer valid to set diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el index dab66b60205..bc8819dc967 100644 --- a/lisp/gnus/gnus.el +++ b/lisp/gnus/gnus.el @@ -1360,6 +1360,7 @@ gnus-valid-select-methods ("nnimap" post-mail address prompt-address physical-address respool server-marks cloud) ("nnmaildir" mail respool address server-marks) + ("nnatom" address) ("nnnil" none)) "An alist of valid select methods. The first element of each list lists should be a string with the name diff --git a/lisp/gnus/nnatom.el b/lisp/gnus/nnatom.el new file mode 100644 index 00000000000..e8dfa12aff5 --- /dev/null +++ b/lisp/gnus/nnatom.el @@ -0,0 +1,276 @@ +;;; nnatom.el --- Atom backend for Gnus -*- lexical-binding: t -*- + +;; Copyright (C) 2023 Free Software Foundation, Inc. +;; Author: Daniel Semyonov <daniel@dsemy.com> + +;; This file is part of GNU Emacs. + +;; nnatom is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; nnatom is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with nnatom. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Gnus backend for HTTP or local feeds following the +;; Atom Syndication Format <https://www.ietf.org/rfc/rfc4287>. + +;;; Code: + +(eval-when-compile + (require 'cl-lib) + (require 'subr-x)) + +(require 'nnfeed) +(require 'mm-url) +(require 'dom) + +(defgroup nnatom nil + "Atom backend for Gnus." + :group 'nnfeed) + +(nnoo-declare nnatom nnfeed) + +(nnfeed-define-basic-backend-interface nnatom) + +;;;; Atom feed parser: + +(defun nnatom--read-feed (feed _) + "Return a list structure representing FEED, or nil." + (if (string-match-p "\\`https?://" feed) + (nnheader-report + nnatom-backend + "Address shouldn't start with \"http://\" or \"https://\"") + (with-temp-buffer + (condition-case e + (if (file-name-absolute-p feed) + (insert-file-contents feed) + (mm-url-insert-file-contents (concat "https://" feed))) + (file-error (nnheader-report nnatom-backend (cdr e))) + (:success (when-let ((data (if (libxml-available-p) + (libxml-parse-xml-region + (point-min) (point-max)) + (car (xml-parse-region + (point-min) (point-max))))) + (authors (list 'authors))) + (when (eq (car data) 'top) + (setq data (assq 'feed data))) + (dom-add-child-before data authors) + (let ((all (dom-children data))) + (while-let ((rest (cdr all)) + (child (car-safe rest)) + (type (car-safe child)) + ((not (eq type 'entry)))) + (and (or (eq type 'author) + (eq type 'contributor)) + (dom-add-child-before authors child)) + (setq all rest)) + ;; Order of entries is reversed as most Atom feeds + ;; list only the "most recent" entries, in reverse + ;; chronological order. + (setcdr all (nreverse (cdr all)))) + data)))))) +(defvoo nnatom-read-feed-function #'nnatom--read-feed + nil nnfeed-read-feed-function) + +(defun nnatom--read-group (data) + "Return the next group and the remaining DATA in a cons cell, or nil." + `(,data)) +(defvoo nnatom-read-group-function #'nnatom--read-group + nil nnfeed-read-group-function) + +(defun nnatom--read-article (data _) + "Return the next article and the remaining DATA in a cons cell, or nil." + (when (eq (car data) 'feed) (setq data (dom-children data))) + ;; Discard any children between/after entries. + (while (and data (not (eq (car-safe (car data)) 'entry))) (pop data)) + (when-let ((article (car data)) + (auths (list 'authors)) (links (list 'links))) + (dom-add-child-before article links) + (dom-add-child-before article auths) + (dolist (child (cddddr article) `(,article . ,(cdr data))) + (pcase (car-safe child) ; Authors and links can appear + ((or 'author 'contributor) ; anywhere in the entry so we + (dom-add-child-before auths child) ; collect them all here to + (dom-add-child-before links child)) ; avoid looping over the + ((or 'link ; entry multiple times later. + (and 'content (guard (assq 'src (dom-attributes child))))) + (dom-add-child-before links child)))))) +(defvoo nnatom-read-article-function #'nnatom--read-article + nil nnfeed-read-article-function) + +(defun nnatom--read-title (group) + "Return the title of GROUP, or nil." + (dom-text (dom-child-by-tag group 'title))) +(defvoo nnatom-read-title-function #'nnatom--read-title + nil nnfeed-read-title-function) + +(defun nnatom--read-description (group) + "Return the description of GROUP, or nil." + (dom-text (dom-child-by-tag group 'subtitle))) +(defvoo nnatom-read-description-function #'nnatom--read-description + nil nnfeed-read-description-function) + +(defun nnatom--read-article-or-group-authors (article-or-group) + "Return the authors of ARTICLE-OR-GROUP, or nil." + (when-let + ((a (mapconcat + (lambda (author) + (let* ((name (dom-text (dom-child-by-tag author 'name))) + (name (unless (string-blank-p name) name)) + (email (dom-text (dom-child-by-tag author 'email))) + (email (unless (string-blank-p email) email))) + (or (and name email (format "%s <%s>" name email)) name email))) + (dom-children (dom-child-by-tag article-or-group 'authors)) + ", ")) + ((not (string-blank-p a)))) + a)) +(defvoo nnatom-read-author-function #'nnatom--read-article-or-group-authors + nil nnfeed-read-author-function) +(defvoo nnatom-read-group-author-function + #'nnatom--read-article-or-group-authors + nil nnfeed-read-group-author-function) + +(defun nnatom--read-subject (article) + "Return the subject of ARTICLE, or nil." + (dom-text (dom-child-by-tag article 'title))) +(defvoo nnatom-read-subject-function #'nnatom--read-subject + nil nnfeed-read-subject-function) + +(defun nnatom--read-id (article) + "Return the ID of ARTICLE. +If the ARTICLE doesn't contain an ID but it does contain a subject, +return the subject. Otherwise, return nil." + (or (dom-text (dom-child-by-tag article 'id)) + (nnatom--read-subject article))) +(defvoo nnatom-read-id-function #'nnatom--read-id + nil nnfeed-read-id-function) + +(defun nnatom--read-publish (article) + "Return the date and time ARTICLE was published, or nil." + (when-let (d (dom-child-by-tag article 'published)) + (date-to-time (dom-text d)))) +(defvoo nnatom-read-publish-date-function #'nnatom--read-publish + nil nnfeed-read-publish-date-function) + +(defun nnatom--read-update (article) + "Return the date and time of the last update to ARTICLE, or nil." + (when-let (d (dom-child-by-tag article 'updated)) + (date-to-time (dom-text d)))) +(defvoo nnatom-read-update-date-function #'nnatom--read-update + nil nnfeed-read-update-date-function) + +(defun nnatom--read-links (article) + "Return all links contained in ARTICLE, or nil." + (let ((alt 0) (rel 0) (sel 0) (enc 0) (via 0) (aut 0)) + (mapcan + (lambda (link) + (when-let ((l (car-safe link))) + (or + (when-let (((eq l 'content)) + (src (dom-attr link 'src)) + (label (concat "Link" + (and (< 1 (cl-incf alt)) + (format " %s" alt))))) + `(((("text/plain") . ,(format "%s: %s\n" label src)) + (("text/html") . ,(format "<a href=\"%s\">[%s]</a> " + src label))))) + (when-let (((or (eq l 'author) (eq l 'contributor))) + (name (dom-text (dom-child-by-tag link 'name))) + (name (if (string-blank-p name) + (concat "Author" + (and (< 1 (cl-incf aut)) + (format " %s" aut))) + name)) + (uri (dom-text (dom-child-by-tag link 'uri))) + ((not (string-blank-p uri)))) + `(((("text/plain") . ,(format "%s: %s\n" name uri)) + (("text/html") . ,(format "<a href=\"%s\">[%s]</a> " + uri name))))) + (when-let (((eq l 'link)) + (attrs (dom-attributes link)) + (label (or (cdr (assq 'title attrs)) + (pcase (cdr (assq 'rel attrs)) + ("related" + (concat "Related" + (and (< 1 (cl-incf rel)) + (format " %s" rel)))) + ("self" + (concat "More" + (and (< 1 (cl-incf sel)) + (format " %s" sel)))) + ("enclosure" + (concat "Enclosure" + (and (< 1 (cl-incf enc)) + (format " %s" enc)))) + ("via" + (concat "Source" + (and (< 1 (cl-incf via)) + (format " %s" via)))) + (_ (if-let + ((lang (cdr (assq 'hreflang link)))) + (format "Link (%s)" lang) + (concat + "Link" + (and (< 1 (cl-incf alt)) + (format " %s" alt)))))))) + (link (cdr (assq 'href attrs)))) + `(((("text/plain") . ,(format "%s: %s\n" label link)) + (("text/html") . ,(format "<a href=\"%s\">[%s]</a> " + link label)))))))) + (dom-children (dom-child-by-tag article 'links))))) +(defvoo nnatom-read-links-function #'nnatom--read-links + nil nnfeed-read-links-function) + +(defun nnatom--read-part (part type) + (let* ((atypes '("html" "plain")) + (mtypes '(("xhtml" . "text/html") ("text" . "text/plain"))) + (xsuff (concat "[+/]xml\\(-\\(dtd\\|external-parsed-entity\\)\\)?\\'" + "\\|^text")) + (part (if (string= type "xhtml") + (with-temp-buffer + (dom-print (dom-child-by-tag part 'div) nil t) + (buffer-substring-no-properties + (point-min) (point-max))) + (dom-text part))) + (type (if (member type atypes) (concat "text/" type) type)) + (type (or (cdr (assoc type mtypes)) type))) + (unless (string-blank-p part) + `(,part (Content-Type . ,(or type (setq type "text/plain"))) + ,(and (not (string-match-p xsuff type)) + '(Content-Transfer-Encoding . "base64")))))) + +(defun nnatom--read-parts (article) + "Return all parts contained in ARTICLE, or an empty HTML part with links." + (let* ((summary (dom-child-by-tag article 'summary)) + (stype (cdr (assq 'type (dom-attributes summary)))) + (summary (nnatom--read-part summary stype)) + (content (dom-child-by-tag article 'content)) + (ctype (cdr (assq 'type (dom-attributes content)))) + (content (nnatom--read-part content ctype)) + (st (string= stype ctype)) + parts) + (cond ((and summary content) + (and st (push summary parts)) + (push (append content '(links)) parts) + (or st (push summary parts))) + ((setq content (or summary content)) + (push (append content '(links)) parts)) + (t (push '((nil (Content-Type . "text/html") links)) parts))) + parts)) +(defvoo nnatom-read-parts-function #'nnatom--read-parts + nil nnfeed-read-parts-function) + +(gnus-declare-backend (symbol-name nnatom-backend) 'address) + +(provide 'nnatom) + +;;; nnatom.el ends here diff --git a/lisp/gnus/nnfeed.el b/lisp/gnus/nnfeed.el new file mode 100644 index 00000000000..3a1b22f2a2f --- /dev/null +++ b/lisp/gnus/nnfeed.el @@ -0,0 +1,683 @@ +;;; nnfeed.el --- Generic feed backend for Gnus -*- lexical-binding: t -*- + +;; Copyright (C) 2023 Free Software Foundation, Inc. +;; Author: Daniel Semyonov <daniel@dsemy.com> + +;; This file is part of GNU Emacs. + +;; nnfeed is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; nnfeed is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with nnfeed. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Generic Gnus backend (intended) for implementing backends for web +;; feeds (Atom, RSS). +;; +;; This backend is abstract - it doesn't implement a parser for any +;; specific web feed type, and so can't be used independently. +;; +;; Instead, it implements a generic parser, feed data storage and most +;; of the Gnus backend interface; the intended use for this backend is +;; to be a source of inheritance for backends supporting new web feed +;; types. +;; +;; To implement new backends, use `nnfeed-define-basic-backend-interface': +;; +;; ... +;; (require 'nnfeed) +;; +;; (nnoo-declare nnfoo nnfeed) +;; +;; (nnfeed-define-basic-backend-interface nnfoo) +;; ... +;; [ definitions of parsing functions, see the "Feed parser interface" +;; section for more information. ] +;; +;; (defvoo nnfoo-read-feed-function #'nnfoo--read-feed +;; nil nnfeed-read-feed-function) +;; ... +;; (gnus-declare-backend (symbol-name nnfeed-backend) 'address) +;; +;; (provide 'nnfoo) +;; +;;; Code: + +(eval-when-compile + (require 'subr-x)) + +(require 'gnus) +(require 'nnoo) + +(defgroup nnfeed nil + "Generic feed backend for Gnus." + :group 'gnus) + +(defcustom nnfeed-date-format "%F %X%p" + "Format of displayed dates (see function `format-time-string')." + :type 'string) + +(nnoo-declare nnfeed) + +(defvoo nnfeed-backend nil + "Symbol which identifies this backend.") + +(defvoo nnfeed-status-string nil + "Last status message reported by this backend.") + +;; This macro should be used to define inheriting backends. + +(defmacro nnfeed-define-basic-backend-interface (backend) + "Define a basic set of functions and variables for BACKEND." + `(progn + (defvoo ,(nnoo-symbol backend 'backend) ',backend nil nnfeed-backend) + (defvoo ,(nnoo-symbol backend 'status-string) + nil nil nnfeed-status-string) + (defvoo ,(nnoo-symbol backend 'group) nil nil nnfeed-group) + (defvoo ,(nnoo-symbol backend 'servers) + (make-hash-table :test 'equal) nil nnfeed-servers) + (defvoo ,(nnoo-symbol backend 'group-article-ids) + (make-hash-table :test 'equal) nil nnfeed-group-article-ids) + (defvoo ,(nnoo-symbol backend 'group-articles) + (make-hash-table :test 'eql) nil nnfeed-group-articles) + (defvoo ,(nnoo-symbol backend 'group-article-max-num) 0 nil + nnfeed-group-article-max-num) + (defvoo ,(nnoo-symbol backend 'group-article-mix-num) 1 nil + nnfeed-group-article-min-num) + ,@(mapcar (lambda (fun) + `(deffoo ,(nnoo-symbol backend fun) (&optional server) + (,(nnoo-symbol 'nnoo fun) ',backend server))) + '(server-opened status-message)) + (deffoo ,(nnoo-symbol backend 'open-server) (server &optional defs) + (nnfeed-open-server server defs ',backend)) + (nnoo-import ,backend (nnfeed)))) + +;;;; Feed parser interface: + +;; The following set of server variables define a parser for a +;; specific web feed type. +;; An inheriting backend doesn't necessarily have to define all of +;; these functions (see the comments below for more information). +;; Apart from this set of variables there is also +;; `nnfeed-print-content-function' which can optionally be defined +;; by an inheriting backend to allow more advanced control over the +;; printing of articles. + +(defvoo nnfeed-read-feed-function #'ignore + "Function returning a Lisp object representing a feed (or part of it). + +It should accept two arguments, the address of a feed and the name of +a group (or nil). +If a group name is supplied, it should return a representation of only +the group (as if it was extracted from the feed with +`nnfeed-read-group-function').") + +(defvoo nnfeed-read-group-function #'ignore + "Function returning a cons cell of a group and remaining data from a feed. + +The returned group can be represented by any Lisp object. +It should accept a single argument, a Lisp object representing a feed +\(as can be returned by this function or `nnfeed-read-feed-function').") + +(defvoo nnfeed-read-article-function #'ignore + "Function returning a cons cell of an article and remaining data from a group. + +The returned article can be represented by any Lisp object. +It should accept two arguments, a Lisp object representing a group +\(as can be returned by this function or `nnfeed-read-group-function'), +and a flag indicating whether the last article was not new or updated.") + +(defvoo nnfeed-read-title-function #'ignore + "Function returning the title of a group (a string). + +It should accept a single argument, a Lisp object representing a group +\(as returned by `nnfeed-read-group-function').") + +;; Optional. +(defvoo nnfeed-read-description-function #'ignore + "Function returning the description of a group (a string), or nil. + +It should accept a single argument, a Lisp object representing a group +\(as returned by `nnfeed-read-group-function').") + +;; Either this function or `nnfeed-read-author-function' is required. +(defvoo nnfeed-read-group-author-function #'ignore + "Function returning the author of a group (a string), or nil. + +It should accept a single argument, a Lisp object representing a group +\(as returned by `nnfeed-read-group-function')..") + +(defvoo nnfeed-read-id-function #'ignore + "Function returning the ID of an article. + +It should accept a single argument, a Lisp object representing an article +\(as returned by `nnfeed-read-article-function').") + +(defvoo nnfeed-read-subject-function #'ignore + "Function returning the subject of an article (a string), or nil. + +It should accept a single argument, a Lisp object representing an article +\(as returned by `nnfeed-read-article-function').") + +;; Either this function or `nnfeed-read-update-date-function' is required. +(defvoo nnfeed-read-publish-date-function #'ignore + "Function returning the publish date of an article (a time value), or nil. + +It should accept a single argument, a Lisp object representing an article +\(as returned by `nnfeed-read-article-function').") + +;; Either this function or `nnfeed-read-publish-date-function' is required. +(defvoo nnfeed-read-update-date-function #'ignore + "Function returning the update date of an article (a time value), or nil. + +It should accept a single argument, a Lisp object representing an article +\(as returned by `nnfeed-read-article-function').") + +;; Either this function or `nnfeed-read-group-author-function' is required. +(defvoo nnfeed-read-author-function #'ignore + "Function returning the author of an article (a string), or nil. + +It should accept a single argument, a Lisp object representing an article +\(as returned by `nnfeed-read-article-function').") + +(defvoo nnfeed-read-headers-function #'ignore + "Function returning an alist of article-wide MIME headers. + +Each element of this alist maps a MIME header (a symbol, +i.e. `Content-Type') to its value. As a special case, `:boundary' +maps to a string which will serve as the boundary between article +parts. This must be supplied if a custom boundary is used in a +multipart content type header. The default boundary is \"-_nnfeed_-\", +and is automatically modified to match the name of the back end. +It should accept a single argument, a Lisp object representing an article +\(as returned by `nnfeed-read-article-function').") + +;; As mentioned in their docstrings, the last two parsing functions +;; can optionally return any Lisp representation they want, provided +;; an appropriate `nnfeed-print-content-function' is defined. This +;; means they are also not _strictly_ required. + +(defvoo nnfeed-read-links-function #'ignore + "Function returning all links contained in an article. + +With the default `nnfeed-print-content-function', it should return a +list of links, where each link is an alist mapping MIME content types +to links formatted for display in a part of that type. Each content +type may also be a list of content types. +Otherwise, it could return any Lisp object. +It should accept a single argument, a Lisp object representing an article +\(as returned by `nnfeed-read-article-function').") + +(defvoo nnfeed-read-parts-function #'ignore + "Function returning an alist associating parts of an article to their headers. + +With the default `nnfeed-print-content-function', each part should be a +string. Otherwise, it can be any Lisp object. The \"headers\" of +each part should be a list where each element is either a cons of a +MIME header (a symbol, i.e. `Content-Type') and its value (a string), +or any other Lisp object. MIME headers will be printed, the rest will +be passed on to `nnfeed-print-content-function', which recognizes the +following extra data by default: +- `links', if present, will cause links to be printed in the part. +It should accept a single argument, a Lisp object representing an article +\(as returned by `nnfeed-read-article-function').") + +;;;; Feed data storage: + +;; This section defines the data types used to store feed data, and +;; functions to read and write it. +;; All variables in this section are automatically defined by +;; `nnfeed-define-basic-backend-interface'. + +(defvoo nnfeed-servers (make-hash-table :test 'equal) + "Hash table mapping known servers to their groups. + +Each value in this table should itself be a hash table mapping known +group names to their data, which should be a vector of the form +[GROUP IDS ARTICLES MAX MIN DESCRIPTION], where: +- GROUP is the \"real\" group name (the name known to the server). +- IDS is a hash table mapping article IDs to their numbers. +- ARTICLES is a hash table mapping article numbers to articles and + their attributes (see `nnfeed-group-articles'). +- MAX is the maximum article number. +- MIN is the minimum article number. +- DESCRIPTION is the group description.") + +(defvoo nnfeed-group-names (make-hash-table :test 'equal) + "Hash table mapping real group names to their custom name.") + +(defun nnfeed--server-address (server) + "Return SERVER's real address." + (if (string-suffix-p "-ephemeral" server) + (setq server (or (cadr (assq (nnoo-symbol nnfeed-backend 'address) + (cddr (gnus-server-to-method + (concat + (symbol-name nnfeed-backend) ":" + server))))) + server)) + server)) + +(defun nnfeed--server-file (server) + "Return the file containing data for SERVER." + (expand-file-name (format "%s/%s.eld" + (string-trim (symbol-name nnfeed-backend) + "nn") + (gnus-newsgroup-savable-name + (nnfeed--server-address server))) + gnus-directory)) + +(defun nnfeed--read-server (server) + "Read SERVER's information from storage." + (if-let ((f (nnfeed--server-file server)) + ((file-readable-p f))) + (with-temp-buffer + (insert-file-contents f) + (goto-char (point-min)) + (puthash server (read (current-buffer)) nnfeed-servers)) + (nnheader-report nnfeed-backend "Can't read %s" server))) + +(defun nnfeed--write-server (server) + "Write SERVER's information to storage." + (if-let ((f (nnfeed--server-file server)) + ((file-writable-p f))) + (if-let ((s (gethash server nnfeed-servers)) + ((hash-table-p s))) + (with-temp-file f + (insert ";;;; -*- mode: lisp-data -*- DO NOT EDIT\n") + (prin1 s (current-buffer)) + (insert "\n") + t) + t) + (nnheader-report nnfeed-backend "Can't write %s" f))) + +;; The following function uses the parsing functions defined in the last +;; section to parse a feed (or just one group from it). +;; This is the only place where these parsing functions are used; the Gnus +;; backend interface extracts all required information from the parsed feed. + +(defun nnfeed--parse-feed (feed &optional group) + "Parse GROUP from FEED into a new or existing server. +If GROUP is omitted or nil, parse the entire FEED." + (let* ((feed (nnfeed--server-address feed)) + (s (or (gethash feed nnfeed-servers) (nnfeed--read-server feed) + (make-hash-table :test 'equal))) + (name group) ; (Maybe) fake name (or nil) + (group (aref (gethash group s `[,group]) 0)) ; Real name (or nil) + data) + (when (setq data (funcall nnfeed-read-feed-function feed group)) + (while-let ((cg (or (and name (cons data)) ; `data' is a single group + (funcall nnfeed-read-group-function data))) + (cg (prog1 (car cg) (setq data (cdr cg))))) + (let* ((name (funcall nnfeed-read-title-function cg)) ; Real name + (group (gethash name nnfeed-group-names name)) ; (Maybe) fake name + (info (gnus-get-info + (concat (symbol-name nnfeed-backend) "+" feed ":" group))) + (g (or (gethash group s) + `[ ,name ,(make-hash-table :test 'equal) + ,(make-hash-table :test 'eql) nil 1 ""])) + (desc (funcall nnfeed-read-description-function cg)) + (ids (aref g 1)) + (articles (aref g 2)) + (max (aref g 3)) + (max (if max max + (setq max 0) ; Find max article number + (dolist ; remembered by Gnus. + ( r (cons (gnus-info-read info) + (gnus-info-marks info)) + max) + (mapc (lambda (x) + (let ((x (if (consp x) + (if (< (car x) (cdr x)) + (cdr x) (car x)) + x))) + (when (< max x) (setq max x)))) + (if (symbolp (car r)) (cdr r) r))))) + (group-author (funcall nnfeed-read-group-author-function cg)) + stale) + (and desc (aset g 5 desc)) + (while-let ((article (funcall nnfeed-read-article-function cg stale)) + (article (prog1 (car article) (setq cg (cdr article))))) + (when-let ((id (funcall nnfeed-read-id-function article)) + (id (format "<%s@%s.%s>" id name nnfeed-backend))) + (let* ((num (gethash id ids)) + (update (funcall nnfeed-read-update-date-function article)) + (prev-update (aref (gethash num articles + '[nil nil nil nil nil]) + 4))) + (if (or (null num) ; New article ID. + (and (null prev-update) update) + (and prev-update update + (time-less-p prev-update update))) + (let* ((num (or num (aset g 3 (setq max (1+ max))))) + (publish (funcall nnfeed-read-publish-date-function + article))) + (setf + (gethash id (aref g 1)) num + (gethash num (aref g 2)) + `[ ,id + ,(or (funcall nnfeed-read-author-function article) + group-author group) + ,(or (funcall nnfeed-read-subject-function article) + "no subject") + ,(or publish update '(0 0)) ; published + ,(or update publish '(0 0)) ; updated + ,(funcall nnfeed-read-links-function article) + ,(funcall nnfeed-read-parts-function article) + ,(funcall nnfeed-read-headers-function article)] + stale nil)) + (setq stale t))))) + (puthash group g s))) + (puthash feed s nnfeed-servers)))) + +;;;; Gnus backend functions: + +;; The following two sections define a Gnus backend interface based on +;; the parsed data from the last section. +;; All server variables in this section are automatically defined by +;; `nnfeed-define-basic-backend-interface'. +;; For more information about these functions see the "Back End +;; Interface" section of the Gnus manual. + +(defvoo nnfeed-group nil + "Name of the current group.") + +(defvoo nnfeed-group-article-ids (make-hash-table :test 'equal) + "Hash table mapping article IDs to their article number.") + +(defvoo nnfeed-group-articles (make-hash-table :test 'eql) + "Hash table mapping article numbers to articles and their attributes. + +Each value in this table should be a vector of the form +[ID FROM SUBJECT DATE UPDATED LINKS PARTS HEADERS], where: +- ID is the ID of the article. +- FROM is the author of the article or group. +- SUBJECT is the subject of the article. +- DATE is the date the article was published, or last updated (time value). +- UPDATE is the date the article was last updated, or published (time value). +- LINKS is a collection of links (any Lisp object). +- PARTS is an alist associating the content of each part of the + article to its headers. +- HEADERS is an alist associating article-wide MIME headers to their value.") + +(defvoo nnfeed-group-article-max-num 0 + "Maximum article number for the current group.") + +(defvoo nnfeed-group-article-min-num 1 + "Minimum article number for the current group.") + +(nnoo-define-basics nnfeed) + +(defun nnfeed--current-server-no-prefix () + "Remove the \"<backend>+\" prefix from the current server." + (string-remove-prefix (concat (symbol-name nnfeed-backend) "+") + (nnoo-current-server nnfeed-backend))) + +(defun nnfeed--group-data (group server) + "Get parsed data for GROUP from SERVER." + (when-let ((server (nnfeed--server-address server)) + (s (gethash server nnfeed-servers)) + ((hash-table-p s))) + (gethash group s))) + +(defun nnfeed-retrieve-article (article group) + "Retrieve headers for ARTICLE from GROUP." + (if-let ((a (gethash article (aref group 2)))) + (insert (format "221 %s Article retrieved. +From: %s\nSubject: %s\nDate: %s\nMessage-ID: %s\n.\n" + article + (aref a 1) + (aref a 2) + (format-time-string "%F %H:%M" (aref a 3)) + (aref a 0))) + (insert "404 Article not found.\n.\n"))) + +(deffoo nnfeed-retrieve-headers (articles &optional group server _fetch-old) + (if-let ((server (or server (nnfeed--current-server-no-prefix))) + (g (or (nnfeed--group-data group server) + `[ nil ,nnfeed-group-article-ids ,nnfeed-group-articles + nil nil nil]))) + (with-current-buffer nntp-server-buffer + (erase-buffer) + (or (and (stringp (car articles)) + (mapc (lambda (a) + (nnfeed-retrieve-article + (gethash a (aref g 2)) g)) + articles)) + (and (numberp (car articles)) + (range-map (lambda (a) (nnfeed-retrieve-article a g)) + articles))) + 'headers) + (nnheader-report nnfeed-backend "Group %s not found" (or group "")))) + +(deffoo nnfeed-open-server (server &optional defs backend) + (let ((backend (or backend 'nnfeed)) + (a (nnfeed--server-address server)) + s) + (nnoo-change-server backend server defs) + (when (setq s (or (gethash a nnfeed-servers) (nnfeed--read-server server))) + (maphash (lambda (group g) + (setq g (aref g 0)) + (unless (string= group g) + (puthash group g nnfeed-group-names))) + s)) + (setq a (nnfeed--server-file server)) + (or s (condition-case _ (make-directory (file-name-parent-directory a) t) + (:success (file-writable-p a)) + (t nil)) + (and (nnoo-close-server nnfeed-backend server) + (nnheader-report + nnfeed-backend "Server file %s not readable or writable" + server))))) + +(deffoo nnfeed-request-close () + (when (hash-table-p nnfeed-servers) + (maphash (lambda (server _) (nnfeed--write-server server)) nnfeed-servers) + (setq nnfeed-servers (make-hash-table :test 'equal))) + (setq nnfeed-status-string nil) + t) + +;; The default content printing function, which should be suitable for +;; most inheriting backends. + +(defun nnfeed--print-content (content attributes links) + "Return CONTENT formatted according to ATTRIBUTES, with LINKS possibly added." + (let ((links (and (memq 'links attributes) links))) + (when (or content links) + (concat + (and content (format "%s\n\n" content)) + (mapconcat (lambda (link) + (cdr (assoc (cdr (assq 'Content-Type attributes)) link + (lambda (types type) + (if (stringp types) (string= types type) + (member type types)))))) + links))))) + +(defvoo nnfeed-print-content-function #'nnfeed--print-content + "Function returning a single piece of content for an article (a string). + +It should accept three arguments, a part and its attributes (as returned +by `nnfeed-read-parts-function'), and links (as returned by +`nnfeed-read-links-function').") + +(defun nnfeed--print-part (content headers mime links) + "Print part of an article using its CONTENT, HEADERS, and LINKS. +Only HEADERS of a type included in MIME are considered." + (concat + (mapconcat (lambda (header) + (when-let ((m (car-safe header)) + ((member m mime))) + (format "%s: %s\n" m (cdr header)))) + headers) + "\n" + (funcall nnfeed-print-content-function content headers links))) + +(deffoo nnfeed-request-article (article &optional group server to-buffer) + (if-let ((server (or server (nnfeed--current-server-no-prefix))) + (g (or (nnfeed--group-data group server) + (and (setq group nnfeed-group) + `[ nil ,nnfeed-group-article-ids + ,nnfeed-group-articles + ,nnfeed-group-article-max-num + ,nnfeed-group-article-min-num nil]))) + (num (or (and (stringp article) + (gethash article (aref g 1))) + (and (numberp article) article))) + ((and (<= num (aref g 3)) + (>= num (aref g 4)))) + (a (gethash num (aref g 2)))) + (with-current-buffer (or to-buffer nntp-server-buffer) + (erase-buffer) + (let* ((links (aref a 5)) + (parts (aref a 6)) + (headers (aref a 7)) + (boundary (or (cdr (assq :boundary headers)) + (format "-_%s_-" nnfeed-backend))) + (multi (length> parts 1)) + (mime '( Content-Type Content-Disposition + Content-Transfer-Encoding))) + (insert (format + "Subject: %s\nFrom: %s\nDate: %s\nMessage-ID: %s\n" + (aref a 2) (aref a 1) + (format-time-string + nnfeed-date-format (or (aref a 3) '(0 0))) + (aref a 0)) + (if (assq 'MIME-Version headers) "" "MIME-Version: 1.0\n") + (mapconcat (lambda (header) + (unless (keywordp (car header)) + (format "%s: %s\n" (car header) (cdr header)))) + headers) + (if multi + (if (assq 'Content-Type headers) "" + (format + "Content-Type: multipart/alternative; boundary=%s\n" + boundary)) + (prog1 (nnfeed--print-part + (caar parts) (cdar parts) mime links) + (setq parts nil))) + (mapconcat (lambda (part) + (format "--%s\n%s\n" boundary + (nnfeed--print-part + (car part) (cdr part) mime links))) + parts) + (if multi (format "--%s--" boundary) "\n"))) + `(,group . ,num)) + (nnheader-report nnfeed-backend "No such article"))) + +(deffoo nnfeed-request-group (group &optional server fast _info) + (with-current-buffer nntp-server-buffer + (erase-buffer) + (if-let ((server (or server (nnfeed--current-server-no-prefix))) + (g (or (if fast (nnfeed--group-data group server) + (setq server (nnfeed--parse-feed server group)) + (and (hash-table-p server) (gethash group server))) + `[ ,group ,(make-hash-table :test 'equal) + ,(make-hash-table :test 'eql) 0 1 ""]))) + (progn + (setq nnfeed-group group + nnfeed-group-article-ids (aref g 1) + nnfeed-group-articles (aref g 2) + nnfeed-group-article-max-num (aref g 3) + nnfeed-group-article-min-num (aref g 4)) + (insert (format "211 %s %s %s \"%s\"" + (hash-table-count nnfeed-group-article-ids) + nnfeed-group-article-min-num + nnfeed-group-article-max-num group)) + t) + (insert "404 group not found") + (nnheader-report nnfeed-backend "Group %s not found" group)))) + +(deffoo nnfeed-close-group (group &optional server) + (and (string= group nnfeed-group) + (setq nnfeed-group nil + nnfeed-group-article-ids (make-hash-table :test 'equal) + nnfeed-group-articles (make-hash-table :test 'eql) + nnfeed-group-article-max-num 0 + nnfeed-group-article-min-num 1)) + (setq server (or server (nnfeed--current-server-no-prefix))) + (nnfeed--write-server server)) + +(deffoo nnfeed-request-list (&optional server) + (with-current-buffer nntp-server-buffer + (erase-buffer) + (when-let ((p (point)) + (s (nnfeed--parse-feed + (or server (nnfeed--current-server-no-prefix)))) + ((hash-table-p s))) + (maphash (lambda (group g) + (insert (format "\"%s\" %s %s y\n" + group (aref g 3) (aref g 4)))) + s) + (not (= (point) p))))) + +(deffoo nnfeed-request-post (&optional _server) + (nnheader-report nnfeed-backend "%s is a read only backend" nnfeed-backend)) + +;;;; Optional back end functions: + +(deffoo nnfeed-retrieve-groups (_groups &optional server) + (nnfeed-request-list server) + 'active) + +(deffoo nnfeed-request-type (_group &optional _article) + 'unknown) + +(deffoo nnfeed-request-group-description (group &optional server) + (when-let ((server (or server (nnfeed--current-server-no-prefix))) + (g (nnfeed--group-data group server))) + (with-current-buffer nntp-server-buffer + (erase-buffer) + (insert group " " (aref g 5) "\n")))) + +(deffoo nnfeed-request-list-newsgroups (&optional server) + (when-let ((server (or server (nnfeed--current-server-no-prefix))) + (s (gethash (nnfeed--server-address server) nnfeed-servers)) + ((hash-table-p s))) + (with-current-buffer nntp-server-buffer + (erase-buffer) + (maphash (lambda (group g) + (insert group " " (aref g 5) "\n")) + s)))) + +(deffoo nnfeed-request-rename-group (group new-name &optional server) + (when-let ((server (or server (nnfeed--current-server-no-prefix))) + (a (nnfeed--server-address server)) + (s (or (gethash a nnfeed-servers) + (and ; Open the server to add it to `nnfeed-servers' + (save-match-data + (nnfeed-open-server + server + (cdr ; Get defs and backend. + (assoc a (cdr (assq nnfeed-backend nnoo-state-alist)) + (lambda (car key) + (and (stringp car) + (string-match + (concat + "\\`\\(\\(nn[[:alpha:]]+\\)\\+\\)?" + (regexp-quote key) "\\'") + car) + (setq server car))))) + (if (match-string 1 server) + (intern (match-string 2 server)) 'nnfeed))) + (gethash a nnfeed-servers)))) + (g (or (nnfeed--group-data group a) + `[ ,group ,(make-hash-table :test 'equal) + ,(make-hash-table :test 'eql) nil 1 ""]))) + (puthash new-name g s) + (puthash group new-name nnfeed-group-names) + (remhash group s) + (and (string= group nnfeed-group) + (setq nnfeed-group new-name)) + t)) + +(provide 'nnfeed) + +;;; nnfeed.el ends here -- 2.44.0
> Date: Mon, 18 Mar 2024 09:32:24 -0400
> From: Jon Levin via "Bug reports for GNU Emacs,
> the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
>
>
> When I update my installed packages on some version of emacs which
> is build with native-compilation enabled, most times I end up
> having to kill emacs and restart it in order to sidestep a problem
> where a single emacs process, seemingly running a compilation step
> (I think) uses 100% of a single virtual core and never completes.
>
> This is the process responsible:
>
> mhcat 12800 6874 99 09:10 pts/96 00:10:41 /usr/bin/emacs -no-comp-spawn -Q --batch --eval (setq w32-disable-abort-dialog t) -l /tmp/emacs-async-comp-seq-tests-znp6r0.el
>
> I am not sure how to go about reproducing this problem from a
> standing start (emacs -Q) because this seems to be part of an
> otherwise opaque series of steps, and I'm not sure how it starts.
>
> Perhaps the author of seq.el can help me put together such a test.
seq.el is preloaded, so it is native-compiled only during the build,
and should not be compiled when you update your packages. I think
what you see is compilation of seq-tests.el, not seq.el, and if that
is the case, the question is: why does your Emacs decide to compile
that file? Could you look through your installed packages and see
which one of them loads seq-tests.el? Is it possible that you have
seq.el as a separate package, which perhaps Emacs tries to use instead
of the built-in one?
Jon Levin via "Bug reports for GNU Emacs, the Swiss army knife of text
editors" <bug-gnu-emacs@gnu.org> writes:
> When I update my installed packages on some version of emacs which
> is build with native-compilation enabled, most times I end up
> having to kill emacs and restart it in order to sidestep a problem
> where a single emacs process, seemingly running a compilation step
> (I think) uses 100% of a single virtual core and never completes.
>
> This is the process responsible:
>
> mhcat 12800 6874 99 09:10 pts/96 00:10:41 /usr/bin/emacs -no-comp-spawn -Q --batch --eval (setq w32-disable-abort-dialog t) -l /tmp/emacs-async-comp-seq-tests-znp6r0.el
>
> I am not sure how to go about reproducing this problem from a
> standing start (emacs -Q) because this seems to be part of an
> otherwise opaque series of steps, and I'm not sure how it starts.
>
> Perhaps the author of seq.el can help me put together such a test.
>
> This is not a new problem, but I noticed that there is a plan to
> make native-comp part of the default emacs build, to which I have
> no objection, but feel that my experience is a data point which
> should not be overlooked. I usually end up building a
> non-native-comp version of emacs as a daily driver (I am lucky
> enough to have systems powerful enough that I notice no difference
> in performance with or without native-compilation enabled - aside
> from the initial compilation phases which in the case of
> native-comp, which are a minor inconvenience).
>
> Thanks!
Hi Jon,
I can reproduce on master with:
./src/emacs -batch -l comp -f batch-native-compile test/lisp/emacs-lisp/seq-tests.el
I'll try to have look.
I'm wondering as well why seq-tests is loaded in your system as well
being this a test file.
The change of performance of bytecode vs native really depends on the
workload so is no surprise that some of us experience noticable perf
uplifts and some less.
Bests
Andrea
[-- Attachment #1: Type: text/plain, Size: 25144 bytes --] --text follows this line-- For many years we had used LUCID scrollbars that didn't work very well (so nobody was really using them). Recently, we switched to the Motif scrollbars that are much nicer. However, there is an annoying menubar issue. Often X-windows emacs will freeze after emitting this on stderr when launched from the command line... $ emacs-29.2 & $ Warning: Name: menubar Class: XmRowColumn XtGrabPointer failed. Usually, this will lock-up emacs and you have to kill it from the window manager which seems to be the only option available. When there are unsaved files, you still get a prompt for that so it is not a crash, but just very annoying. However, I realized that this bug/feature had already been addressed for LUCID scrollbars in lwlib/xlwmenu.c but that code is inactive for Motif. So the simple solution is to uncomment this block from lines 2906 to 2913 for Motif as well... //#ifdef emacs if (x_had_errors_p (display)) { pointer_grabbed = 0; XtUngrabPointer ((Widget)mw, event->time); } x_uncatch_errors (); //#endif In GNU Emacs 29.2 (build 1, x86_64-pc-linux-gnu, Motif Version 2.3.4, cairo version 1.15.12) of 2024-03-18 built on gouda.biostat.mcw.edu Windowing system distributor 'The X.Org Foundation', version 11.0.12101006 System Description: CentOS Linux 7 (Core) Configured using: 'configure --prefix=/usr/local/emacs/29.2 --with-x-toolkit=motif --with-gnutls 'CFLAGS=-g -O2 -mtune=native'' Configured features: CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG LIBSELINUX LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG SOUND THREADS TIFF TOOLKIT_SCROLL_BARS X11 XDBE XIM XINPUT2 XPM MOTIF ZLIB Important settings: value of $LC_ALL: C value of $LANG: en_US.UTF-8 locale-coding-system: nil Major mode: C/* Minor modes in effect: bug-reference-prog-mode: t delete-selection-mode: t recentf-mode: t dired-omit-mode: t tabbar-mwheel-mode: t tabbar-mode: t shell-dirtrack-mode: t global-eldoc-mode: t show-paren-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t column-number-mode: t line-number-mode: t indent-tabs-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t abbrev-mode: t Load-path shadows: /home/rsparapa/.emacs.d/elpa/julia-mode-0.4/julia-mode-latexsubs hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/julia-mode-latexsubs /home/rsparapa/.emacs.d/elpa/julia-mode-0.4/julia-mode hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/julia-mode /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/test hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-markdown/targets/test /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/melpa hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-markdown/targets/melpa /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/melpa-init hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-markdown/targets/melpa-init /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/local hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-markdown/targets/local /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/lint hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-markdown/targets/lint /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/checkdoc hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-markdown/targets/checkdoc /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/test hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-noweb/targets/test /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/melpa hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-noweb/targets/melpa /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/melpa-init hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-noweb/targets/melpa-init /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/local hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-noweb/targets/local /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/lint hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-noweb/targets/lint /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/checkdoc hides /usr/local/emacs/29.2/share/emacs/site-lisp/poly-noweb/targets/checkdoc /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-autoloads hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-autoloads /home/rsparapa/.emacs.d/elpa/julia-mode-0.4/julia-mode hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/julia-mode /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/essd-els hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/essd-els /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-utils hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-utils /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-trns hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-trns /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-tracebug hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-tracebug /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-toolbar hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-toolbar /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-sp6-d hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-sp6-d /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-site hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-site /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-sas-l hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-sas-l /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-sas-d hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-sas-d /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-sas-a hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-sas-a /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-s-lang hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-s-lang /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-roxy hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-roxy /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-rdired hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-rdired /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-rd hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-rd /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-xref hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-r-xref /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-syntax hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-r-syntax /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-package hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-r-package /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-mode hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-r-mode /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-flymake hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-r-flymake /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-completion hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-r-completion /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-mode hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-mode /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-julia hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-julia /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-jags-d hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-jags-d /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-inf hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-inf /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-help hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-help /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-gretl hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-gretl /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-custom hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-custom /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-bugs-l hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-bugs-l /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-bugs-d hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/ess-bugs-d /usr/local/emacs/29.2/share/emacs/site-lisp/ess/targets/travis-install-package hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/targets/travis-install-package /usr/local/emacs/29.2/share/emacs/site-lisp/ess/targets/create-pkg-file hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/targets/create-pkg-file /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-roxy hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-roxy /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-rd hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-rd /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-r /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-utils hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-r-utils /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-token hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-r-token /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-syntax hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-r-syntax /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-package hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-r-package /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-fontification hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-r-fontification /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-eval hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-r-eval /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-edit hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-r-edit /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-org hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-org /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-inf hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-inf /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-indentation hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/test/ess-test-indentation /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/essd-els hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/essd-els /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-utils hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-utils /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-trns hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-trns /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-tracebug hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-tracebug /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-toolbar hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-toolbar /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-sp6-d hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-sp6-d /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-site hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-site /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-sas-l hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-sas-l /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-sas-d hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-sas-d /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-sas-a hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-sas-a /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-s-lang hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-s-lang /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-roxy hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-roxy /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-rdired hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-rdired /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-rd hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-rd /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-xref hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-r-xref /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-syntax hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-r-syntax /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-package hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-r-package /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-mode hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-r-mode /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-flymake hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-r-flymake /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-r-completion hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-r-completion /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-mode hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-mode /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-julia hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-julia /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-jags-d hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-jags-d /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-inf hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-inf /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-help hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-help /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-gretl hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-gretl /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-custom hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-custom /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-bugs-l hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-bugs-l /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/ess-bugs-d hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/ess-bugs-d /usr/local/emacs/29.2/share/emacs/site-lisp/ess/targets/travis-install-package hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/targets/travis-install-package /usr/local/emacs/29.2/share/emacs/site-lisp/ess/targets/create-pkg-file hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/targets/create-pkg-file /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-roxy hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-roxy /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-rd hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-rd /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-r /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-utils hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-r-utils /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-token hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-r-token /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-syntax hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-r-syntax /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-package hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-r-package /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-fontification hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-r-fontification /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-eval hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-r-eval /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-r-edit hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-r-edit /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-org hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-org /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-inf hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-inf /usr/local/emacs/29.2/share/emacs/site-lisp/ess/test/ess-test-indentation hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/test/ess-test-indentation /usr/local/emacs/29.2/share/emacs/site-lisp/poly-markdown/targets/utils hides /usr/local/emacs/29.2/share/emacs/site-lisp/polymode/template/targets/utils /usr/local/emacs/29.2/share/emacs/site-lisp/polymode/targets/poly-targets hides /usr/local/emacs/29.2/share/emacs/site-lisp/polymode/template/targets/poly-targets /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/msdos hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/obsolete/msdos /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/mouseme hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/obsolete/mouseme /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/ess-r-a hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/obsolete/ess-r-a /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/ess-mouse hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/obsolete/ess-mouse /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/ess-font-lock hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/obsolete/ess-font-lock /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/ess-eldoc hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0/lisp/obsolete/ess-eldoc /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/msdos hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/obsolete/msdos /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/mouseme hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/obsolete/mouseme /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/ess-r-a hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/obsolete/ess-r-a /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/ess-mouse hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/obsolete/ess-mouse /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/ess-font-lock hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/obsolete/ess-font-lock /usr/local/emacs/29.2/share/emacs/site-lisp/ess/lisp/obsolete/ess-eldoc hides /usr/local/emacs/29.2/share/emacs/site-lisp/ess/ess-24.01.0-git/lisp/obsolete/ess-eldoc /usr/local/emacs/29.2/share/emacs/site-lisp/ess-smart-equals/features/support/env hides /usr/local/emacs/29.2/share/emacs/29.2/lisp/env /usr/local/emacs/29.2/share/emacs/site-lisp/poly-R/targets/checkdoc hides /usr/local/emacs/29.2/share/emacs/29.2/lisp/emacs-lisp/checkdoc Features: (shadow sort mail-extr emacsbug message yank-media puny rfc822 mml mml-sec epa epg rfc6068 epg-config gnus-util mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils vc-hg vc-git diff-mode vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs log-view pcvs-util vc vc-dispatcher bug-reference ffap sh-script smie treesit executable ess-font-lock ess-site ess-toolbar ess-jags-d ess-bugs-d ess-bugs-l essd-els ess-sas-d ess-sas-l ess-sas-a ess-sp6-d doc-view filenotify jka-compr image-mode exif tex-site auto-loads delsel recentf tree-widget ps-print ps-print-loaddefs lpr dired-x dired dired-loaddefs tabbar poly-R poly-markdown poly-noweb polymode poly-lock polymode-base polymode-export polymode-weave polymode-compat advice polymode-methods polymode-core polymode-classes eieio-custom wid-edit eieio-base markdown-mode pcase color tsdh-dark-theme stan-snippets yasnippet easy-mmode stan-mode derived stan-keywords-lists cc-langs cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs word-count ess-smart-equals cl-extra help-mode ess-r-mode ess-r-flymake flymake-proc flymake warnings thingatpt ess-r-xref xref ess-trns ess-r-package ess-r-completion ess-roxy ess-r-syntax ess-rd noutline outline icons hideshow ess-s-lang ess-help info ess-mode ess-inf ess-tracebug tramp tramp-loaddefs trampver tramp-integration files-x tramp-compat rx shell pcomplete parse-time iso8601 time-date format-spec ess lisp-mnt ess-utils ess-custom project compile text-property-search comint ansi-osc ansi-color skeleton viper viper-cmd viper-macs viper-ex viper-mous viper-keym viper-util ring viper-init finder-inf julia-mode-autoloads package browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers 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 cl-loaddefs cl-lib rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads dbusbind inotify dynamic-setting system-font-setting font-render-setting cairo motif x-toolkit xinput2 x multi-tty make-network-process emacs) Memory information: ((conses 16 424569 26817) (symbols 48 28141 0) (strings 32 118699 4340) (string-bytes 1 3377763) (vectors 16 46213) (vector-slots 8 675841 13032) (floats 8 448 59) (intervals 56 668 0) (buffers 976 17) (heap 1024 29898 1935)) -- Rodney Sparapani, Associate Professor of Biostatistics, He/Him/His Vice President, Wisconsin Chapter of the American Statistical Association Institute for Health and Equity, Division of Biostatistics Medical College of Wisconsin, Milwaukee Campus If this is outside of working hours, then please respond when convenient. [-- Attachment #2: Type: text/html, Size: 37433 bytes --]
On 17/03/2024 20:09, Kévin Le Gouguec wrote: >> I would say that the local-tracking scenario is a minority, and so it's not as important to optimize, but the above makes sense. But the word "local" is very close to "master", while the latter is a special string which should probably somehow stand out. So the "unoptimized" version might still have its advantages: >> >> Branch: : vc-dir-bug (tracking master) >> Remote : none (local branch) > > That looks sensible. If I were to argue in favor of keeping "local" > juxtaposed to the tracking branch, I'd say that in the _absence_ of an > explicit qualifier in "Branch: vc-dir-bug (tracking master)", my brain > might "default" to assuming we are tracking the remote "master"; a > solution to let branch names stand out might then be faces: > e.g. vc-git-log-view-mode paints them with change-log-list… > > But I don't know if it's a very powerful argument. I figured that when "local" is on the next line already, it's easy enough to notice. Anyway, it's up to you, I think. >>>> Just a thought. Not something that needs to be addressed right now. And I might as well be off the mark here. >>> I agree it's worth thinking about. The Right Solution™ would probably >>> come with user options to let users fine-tune which details they care >>> about? It would be interesting to survey Git UIs to see how they >>> approach this (FWIW I am partial to Magit's presentation, but I have not >>> studied how it handles all the corner cases we considered). >> >> Magit, meaning just one line for Head: and another for Merge:? > > So, given > > 𝒷 ≔ current branch > 𝓂 ≔ branch.𝒷.merge > 𝓇 ≔ branch.𝒷.remote > 𝓅 ≔ branch.𝒷.pushRemote or remote.pushDefault > > By default, magit-status shows: > > "Head:" 𝒷, or the current commit when detached > "Merge:" (or "Rebase:") 𝓇/𝓂, or just 𝓂 if 𝓇 = "." > "Push:" 𝓅/𝒷, appending "does not exist" if applicable So Magit also prints just "master" is it's a local tracking branch and something like "origin/master" when it belongs to a remote? Going with that approach, we'd seem justified to print Branch: : vc-dir-bug (tracking master) in the former case and Branch: : vc-dir-bug (tracking origin/master) in the latter. > (And another header related to tags I'm going to ignore for now) > > Of note, Magit offers an option (magit-status-headers-hook) to let users > control which of these (and more) to display. > > One of the available headers that is disabled by default shows > > "Remote: ℛ <remote.ℛ.url>" > > where ℛ is 𝓇, or "origin" if this branch's remote is unset or ".", or > "the first remote in alphabetic order" if "origin" does not exist. Meaning it prepends the remote's url with remote's name, if that line is configured to be shown. We could do that too. > ( > Also of note, IMO, is the branch-variable-configuration menu (the > magit-branch-configure transient), which looks like this: > > Configure vc-dir-bug > d branch.vc-dir-bug.description unset > u branch.vc-dir-bug.merge refs/heads/master > branch.vc-dir-bug.remote . > r branch.vc-dir-bug.rebase [true|false|default:false] > p branch.vc-dir-bug.pushRemote [hirondell|origin|savannah-rw|vps|remote.pushDefault:vps] > > Configure repository defaults > R pull.rebase [true|false|default:false] > P remote.pushDefault [hirondell|origin|savannah-rw|vps] > b Update default branch > > Configure branch creation > a m branch.autoSetupMerge [always|true|false|default:true] > a r branch.autoSetupRebase [always|local|remote|never|default:never] > __ > (Not pictured: the currently active value in [foo|bar|baz] is > highlighted with a face; the keybindings on the left cycle between > alternatives) > > No idea how/where that would fit into VC, but golly is it a neat UI to > work with, so I thought it deserved a shout-out. > ) Magit is definitely a great UI to learn Git's capabilities. >>>>>> * maybe the new header deserves a NEWS entry. >>>>> Maybe? >>>> >>>> It wouldn't hurt. Up to you. >>>> >>>> Anyway, I think the patch is good to go. Please feel free to install it; whatever cosmetic changes we might like to add could be done later. >>> ACK. I might go a head and install then (after polishing the changelog, >>> i.e. re-filling and scrubbing Unicode ellipses) in the spirit of getting >>> the original issue fixed; perhaps worth holding off on the NEWS entry >>> until we decide how exactly things should look. >> >> I'm okay with that. > > (Pushed 📨) Thanks!
[-- Attachment #1: Type: text/plain, Size: 250 bytes --] Eli Zaretskii <eliz@gnu.org> writes: > I don't think this has been fixed, because I can reproduce this > variant of the bug with the current master branch: [...] Absolutely correct - I noticed that I had a fix in my local build. Here is a patch: [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-Correct-debug-body-edebug-specs.patch --] [-- Type: text/x-diff, Size: 2446 bytes --] From d0041aeef4b2f8aa9b31c075966c9c4ac5d3f5d5 Mon Sep 17 00:00:00 2001 From: Michael Heerdegen <michael_heerdegen@web.de> Date: Sun, 18 Sep 2022 12:26:08 +0200 Subject: [PATCH] Correct (debug body) edebug specs Fixes Bug#69865 among other things. * lisp/org/ob-exp.el (org-babel-exp--at-source): * test/lisp/dired-tests.el (dired-test-with-temp-dirs): * test/lisp/emacs-lisp/package-tests.el (with-fake-help-buffer): Fix broken edebug specs (debug body) -> (debug (body)). --- lisp/org/ob-exp.el | 2 +- test/lisp/dired-tests.el | 2 +- test/lisp/emacs-lisp/package-tests.el | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lisp/org/ob-exp.el b/lisp/org/ob-exp.el index 489ffdb330b..3c9395940ca 100644 --- a/lisp/org/ob-exp.el +++ b/lisp/org/ob-exp.el @@ -62,7 +62,7 @@ org-babel-exp--at-source Source is located in `org-babel-exp-reference-buffer'. The value returned is the value of the last form in BODY. Assume that point is at the beginning of the Babel block." - (declare (indent 1) (debug body)) + (declare (indent 1) (debug (body))) `(let ((source (get-text-property (point) 'org-reference))) ;; Source blocks created during export process (e.g., by other ;; source blocks) are not referenced. In this case, do not move diff --git a/test/lisp/dired-tests.el b/test/lisp/dired-tests.el index 651b77500a1..1a57d2da9e1 100644 --- a/test/lisp/dired-tests.el +++ b/test/lisp/dired-tests.el @@ -367,7 +367,7 @@ dired-test-bug59047 (defmacro dired-test-with-temp-dirs (just-empty-dirs &rest body) "Helper macro for Bug#27940 test." - (declare (indent 1) (debug body)) + (declare (indent 1) (debug (body))) (let ((dir (make-symbol "dir"))) `(ert-with-temp-directory ,dir (let* ((dired-deletion-confirmer (lambda (_) "yes")) ; Suppress prompts. diff --git a/test/lisp/emacs-lisp/package-tests.el b/test/lisp/emacs-lisp/package-tests.el index d95b94f2145..6d04850aeca 100644 --- a/test/lisp/emacs-lisp/package-tests.el +++ b/test/lisp/emacs-lisp/package-tests.el @@ -168,7 +168,7 @@ with-package-test (defmacro with-fake-help-buffer (&rest body) "Execute BODY in a temp buffer which is treated as the \"*Help*\" buffer." - (declare (debug body)) + (declare (debug (body))) `(with-temp-buffer (help-mode) ;; Trick `help-buffer' into using the temp buffer. -- 2.39.2 [-- Attachment #3: Type: text/plain, Size: 37 bytes --] Sorry for the confusion, Michael.
Nate Sandy <nsan@posteo.de> writes: > Hi, > > fringe bitmaps currently don't respect the frame parameter > 'alpha-background', i.e., their background is opaque. But since the > fringe itself *does* respect 'alpha-background', fringe bitmaps should > do the same. This patch fixes that. See attached screenshots for the > effect. > The alpha-background used here was set with: > (set-frame-parameter nil 'alpha-background 50) > > I am not sure which other platforms support 'alpha-background', and > unfortunately I am not able to test with those. PGTK and GTK 3 or no-toolkit X builds, with either Cairo or XRender. > > The change is altering the parameter 'respect_alpha_background' in > {pgtk,x}_cr_draw_image - while this name sounds quite generic, I didn't > find any other usages of this function than drawing fringe bitmaps. I > hope I didn't miss any. What about x_draw_image_foreground? > I hope that I'm following the conventions here correctly - please let me > know if I can improve anything! This patch is missing a ChangeLog entry. Though your other patch fails in several more significant respects, that can wait until the methodological concerns are resolved. Thanks for your interest in Emacs.
>> +@example >> +(object-type 1) >> + @result{} fixnum >> +@group >> +(object-type 'nil) >> + @result{} null >> +(object-type (record 'foo)) >> + @result{} foo > > "object-type"? Oops! thanks. >> DEFUN ("type-of", Ftype_of, Stype_of, 1, 1, 0, >> doc: /* Return a symbol representing the type of OBJECT. >> The symbol returned names the object's basic type; >> -for example, (type-of 1) returns `integer'. */) >> +for example, (type-of 1) returns `integer'. >> +Contrary to `cl-type-of' the returned type is not always the most > ^^ > I think we want a comma there. >> +DEFUN ("cl-type-of", Fcl_type_of, Scl_type_of, 1, 1, 0, >> + doc: /* Return a symbol representing the type of OBJECT. >> +The symbol returned names the most specific possible type of the object. > ^^^^^^^^^^^^^^^^^^^ > I think "The returned symbol" is better here, as it prevents a > possible confusion (whether "returned" alludes to "symbol" or to > "names"). Agreed. >> +for example, (object-type nil) returns `null'. > ^^^^^^^^^^^ > "object-type"? As you can see I had used `object-type` instead of `cl-type-of` in some prior version of the code :-) >> (defsubst subr-primitive-p (object) >> - "Return t if OBJECT is a built-in primitive function." >> + "Return t if OBJECT is a built-in primitive written in C." >> (declare (side-effect-free error-free)) >> (and (subrp object) >> (not (subr-native-elisp-p object)))) >> >> +(defsubst primitive-function-p (object) >> + "Return t if OBJECT is a built-in primitive function." >> + (declare (side-effect-free error-free)) >> + (and (subrp object) >> + (not (or (subr-native-elisp-p object) >> + (eq (cdr (subr-arity object)) 'unevalled))))) > > Should these doc strings mention the special case of special form, > which each one of them treats differently? OK. Pushed, thanks, Stefan
When I update my installed packages on some version of emacs which is build with native-compilation enabled, most times I end up having to kill emacs and restart it in order to sidestep a problem where a single emacs process, seemingly running a compilation step (I think) uses 100% of a single virtual core and never completes. This is the process responsible: mhcat 12800 6874 99 09:10 pts/96 00:10:41 /usr/bin/emacs -no-comp-spawn -Q --batch --eval (setq w32-disable-abort-dialog t) -l /tmp/emacs-async-comp-seq-tests-znp6r0.el I am not sure how to go about reproducing this problem from a standing start (emacs -Q) because this seems to be part of an otherwise opaque series of steps, and I'm not sure how it starts. Perhaps the author of seq.el can help me put together such a test. This is not a new problem, but I noticed that there is a plan to make native-comp part of the default emacs build, to which I have no objection, but feel that my experience is a data point which should not be overlooked. I usually end up building a non-native-comp version of emacs as a daily driver (I am lucky enough to have systems powerful enough that I notice no difference in performance with or without native-compilation enabled - aside from the initial compilation phases which in the case of native-comp, which are a minor inconvenience). Thanks! In GNU Emacs 29.2 (build 2, x86_64-pc-linux-gnu, X toolkit, cairo version 1.18.0, Xaw3d scroll bars) of 2024-03-09, modified by Debian built on x86-conova-01 Windowing system distributor 'The X.Org Foundation', version 11.0.12101011 System Description: Debian GNU/Linux trixie/sid Configured using: 'configure --build x86_64-linux-gnu --prefix=/usr --sharedstatedir=/var/lib --libexecdir=/usr/libexec --localstatedir=/var/lib --infodir=/usr/share/info --mandir=/usr/share/man --with-libsystemd --with-pop=yes --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/29.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/29.2/site-lisp:/usr/share/emacs/site-lisp --with-sound=alsa --without-gconf --with-mailutils --with-native-compilation --build x86_64-linux-gnu --prefix=/usr --sharedstatedir=/var/lib --libexecdir=/usr/libexec --localstatedir=/var/lib --infodir=/usr/share/info --mandir=/usr/share/man --with-libsystemd --with-pop=yes --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/29.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/29.2/site-lisp:/usr/share/emacs/site-lisp --with-sound=alsa --without-gconf --with-mailutils --with-native-compilation --with-x=yes --with-x-toolkit=lucid --with-toolkit-scroll-bars --without-gsettings 'CFLAGS=-g -O2 -ffile-prefix-map=/build/reproducible-path/emacs-29.2+1=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -Wall' 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' LDFLAGS=-Wl,-z,relro' Configured features: ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM HARFBUZZ JPEG JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XAW3D XDBE XIM XINPUT2 XPM LUCID ZLIB Important settings: value of $LANG: en_US.UTF-8 value of $XMODIFIERS: @im=ibus locale-coding-system: utf-8-unix Major mode: Fundamental Minor modes in effect: which-key-mode: t eros-mode: t minions-mode: t erc-services-mode: t erc-networks-mode: t eat-eshell-visual-command-mode: t eat-eshell-mode: t global-org-modern-mode: t denote-menu-bar-mode: t telega-root-auto-fill-mode: t telega-active-video-chats-mode: t telega-active-locations-mode: t telega-patrons-mode: t telega-active-stories-mode: t global-hl-todo-mode: t sly-symbol-completion-mode: t global-diff-hl-mode: t global-git-commit-mode: t shell-dirtrack-mode: t server-mode: t global-auto-revert-mode: t recentf-mode: t save-place-mode: t marginalia-mode: t global-corfu-mode: t minibuffer-electric-default-mode: t minibuffer-depth-indicate-mode: t vertico-buffer-mode: t vertico-mode: t savehist-mode: t pixel-scroll-precision-mode: t interaction-log-mode: t override-global-mode: t straight-use-package-mode: t straight-package-neutering-mode: t global-eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t file-name-shadow-mode: t global-font-lock-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 Load-path shadows: /home/mhcat/.config/emacs/straight/build/modus-themes/theme-loaddefs hides /home/mhcat/.config/emacs/straight/build/standard-themes/theme-loaddefs /home/mhcat/.config/emacs/straight/build/modus-themes/theme-loaddefs hides /home/mhcat/.config/emacs/straight/build/ef-themes/theme-loaddefs /home/mhcat/.config/emacs/straight/build/erlang/erldoc hides /usr/share/emacs/site-lisp/erlang/erldoc /home/mhcat/.config/emacs/straight/build/erlang/erlang hides /usr/share/emacs/site-lisp/erlang/erlang /home/mhcat/.config/emacs/straight/build/erlang/erlang-test hides /usr/share/emacs/site-lisp/erlang/erlang-test /home/mhcat/.config/emacs/straight/build/erlang/erlang-start hides /usr/share/emacs/site-lisp/erlang/erlang-start /home/mhcat/.config/emacs/straight/build/erlang/erlang-skels hides /usr/share/emacs/site-lisp/erlang/erlang-skels /home/mhcat/.config/emacs/straight/build/erlang/erlang-skels-old hides /usr/share/emacs/site-lisp/erlang/erlang-skels-old /home/mhcat/.config/emacs/straight/build/erlang/erlang-flymake hides /usr/share/emacs/site-lisp/erlang/erlang-flymake /home/mhcat/.config/emacs/straight/build/erlang/erlang-eunit hides /usr/share/emacs/site-lisp/erlang/erlang-eunit /home/mhcat/.config/emacs/straight/build/erlang/erlang-edoc hides /usr/share/emacs/site-lisp/erlang/erlang-edoc /usr/share/emacs/site-lisp/llvm-14/tablegen-mode hides /usr/share/emacs/site-lisp/llvm-15/tablegen-mode /usr/share/emacs/site-lisp/llvm-14/llvm-mode hides /usr/share/emacs/site-lisp/llvm-15/llvm-mode /usr/share/emacs/site-lisp/llvm-14/emacs hides /usr/share/emacs/site-lisp/llvm-15/emacs /usr/share/emacs/site-lisp/llvm-14/tablegen-mode hides /usr/share/emacs/site-lisp/llvm-16/tablegen-mode /usr/share/emacs/site-lisp/llvm-14/llvm-mode hides /usr/share/emacs/site-lisp/llvm-16/llvm-mode /usr/share/emacs/site-lisp/llvm-14/emacs hides /usr/share/emacs/site-lisp/llvm-16/emacs /usr/local/share/emacs/site-lisp/mu4e/mu4e hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e /usr/local/share/emacs/site-lisp/mu4e/mu4e-window hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-window /usr/local/share/emacs/site-lisp/mu4e/mu4e-view hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-view /usr/local/share/emacs/site-lisp/mu4e/mu4e-vars hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-vars /usr/local/share/emacs/site-lisp/mu4e/mu4e-update hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-update /usr/local/share/emacs/site-lisp/mu4e/mu4e-speedbar hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-speedbar /usr/local/share/emacs/site-lisp/mu4e/mu4e-server hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-server /usr/local/share/emacs/site-lisp/mu4e/mu4e-search hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-search /usr/local/share/emacs/site-lisp/mu4e/mu4e-query-items hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-query-items /usr/local/share/emacs/site-lisp/mu4e/mu4e-org hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-org /usr/local/share/emacs/site-lisp/mu4e/mu4e-obsolete hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-obsolete /usr/local/share/emacs/site-lisp/mu4e/mu4e-notification hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-notification /usr/local/share/emacs/site-lisp/mu4e/mu4e-modeline hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-modeline /usr/local/share/emacs/site-lisp/mu4e/mu4e-message hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-message /usr/local/share/emacs/site-lisp/mu4e/mu4e-mark hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-mark /usr/local/share/emacs/site-lisp/mu4e/mu4e-main hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-main /usr/local/share/emacs/site-lisp/mu4e/mu4e-lists hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-lists /usr/local/share/emacs/site-lisp/mu4e/mu4e-icalendar hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-icalendar /usr/local/share/emacs/site-lisp/mu4e/mu4e-helpers hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-helpers /usr/local/share/emacs/site-lisp/mu4e/mu4e-headers hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-headers /usr/local/share/emacs/site-lisp/mu4e/mu4e-folders hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-folders /usr/local/share/emacs/site-lisp/mu4e/mu4e-contrib hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-contrib /usr/local/share/emacs/site-lisp/mu4e/mu4e-context hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-context /usr/local/share/emacs/site-lisp/mu4e/mu4e-contacts hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-contacts /usr/local/share/emacs/site-lisp/mu4e/mu4e-config hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-config /usr/local/share/emacs/site-lisp/mu4e/mu4e-compose hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-compose /usr/local/share/emacs/site-lisp/mu4e/mu4e-bookmarks hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-bookmarks /usr/local/share/emacs/site-lisp/mu4e/mu4e-actions hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-actions /usr/local/share/emacs/site-lisp/mu4e/mu4e-pkg hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-pkg /usr/local/share/emacs/site-lisp/mu4e/mu4e-autoloads hides /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-autoloads /home/mhcat/.config/emacs/straight/build/notmuch/notmuch hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-wash hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-wash /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-tree hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-tree /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-tag hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-tag /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-show hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-show /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-query hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-query /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-print hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-print /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-parser hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-parser /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-mua hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-mua /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-message hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-message /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-maildir-fcc hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-maildir-fcc /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-lib hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-lib /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-jump hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-jump /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-hello hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-hello /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-draft hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-draft /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-crypto hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-crypto /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-compat hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-compat /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-company hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-company /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-address hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-address /home/mhcat/.config/emacs/straight/build/notmuch/coolj hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/coolj /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-autoloads hides /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-autoloads /usr/local/share/emacs/site-lisp/mu4e/mu4e hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e /usr/local/share/emacs/site-lisp/mu4e/mu4e-window hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-window /usr/local/share/emacs/site-lisp/mu4e/mu4e-view hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-view /usr/local/share/emacs/site-lisp/mu4e/mu4e-vars hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-vars /usr/local/share/emacs/site-lisp/mu4e/mu4e-update hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-update /usr/local/share/emacs/site-lisp/mu4e/mu4e-speedbar hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-speedbar /usr/local/share/emacs/site-lisp/mu4e/mu4e-server hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-server /usr/local/share/emacs/site-lisp/mu4e/mu4e-search hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-search /usr/local/share/emacs/site-lisp/mu4e/mu4e-query-items hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-query-items /usr/local/share/emacs/site-lisp/mu4e/mu4e-pkg hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-pkg /usr/local/share/emacs/site-lisp/mu4e/mu4e-org hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-org /usr/local/share/emacs/site-lisp/mu4e/mu4e-obsolete hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-obsolete /usr/local/share/emacs/site-lisp/mu4e/mu4e-notification hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-notification /usr/local/share/emacs/site-lisp/mu4e/mu4e-modeline hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-modeline /usr/local/share/emacs/site-lisp/mu4e/mu4e-message hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-message /usr/local/share/emacs/site-lisp/mu4e/mu4e-mark hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-mark /usr/local/share/emacs/site-lisp/mu4e/mu4e-main hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-main /usr/local/share/emacs/site-lisp/mu4e/mu4e-lists hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-lists /usr/local/share/emacs/site-lisp/mu4e/mu4e-icalendar hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-icalendar /usr/local/share/emacs/site-lisp/mu4e/mu4e-helpers hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-helpers /usr/local/share/emacs/site-lisp/mu4e/mu4e-headers hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-headers /usr/local/share/emacs/site-lisp/mu4e/mu4e-folders hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-folders /usr/share/emacs/site-lisp/elpa/mu4e-1.10.8/mu4e-draft hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-draft /usr/local/share/emacs/site-lisp/mu4e/mu4e-contrib hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-contrib /usr/local/share/emacs/site-lisp/mu4e/mu4e-context hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-context /usr/local/share/emacs/site-lisp/mu4e/mu4e-contacts hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-contacts /usr/local/share/emacs/site-lisp/mu4e/mu4e-config hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-config /usr/local/share/emacs/site-lisp/mu4e/mu4e-compose hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-compose /usr/local/share/emacs/site-lisp/mu4e/mu4e-bookmarks hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-bookmarks /usr/local/share/emacs/site-lisp/mu4e/mu4e-autoloads hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-autoloads /usr/local/share/emacs/site-lisp/mu4e/mu4e-actions hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.10.8/mu4e-actions /home/mhcat/.config/emacs/straight/build/notmuch/notmuch hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-wash hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-wash /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-version hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-version /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-tree hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-tree /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-tag hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-tag /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-show hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-show /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-query hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-query /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-print hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-print /usr/share/emacs/site-lisp/elpa/notmuch-0.38.3/notmuch-pkg hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-pkg /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-parser hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-parser /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-mua hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-mua /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-message hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-message /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-maildir-fcc hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-maildir-fcc /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-lib hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-lib /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-jump hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-jump /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-hello hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-hello /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-draft hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-draft /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-crypto hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-crypto /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-compat hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-compat /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-company hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-company /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-autoloads hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-autoloads /home/mhcat/.config/emacs/straight/build/notmuch/notmuch-address hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/notmuch-address /home/mhcat/.config/emacs/straight/build/notmuch/coolj hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.38.3/coolj /home/mhcat/.config/emacs/straight/build/transient/transient hides /usr/share/emacs/29.2/lisp/transient /home/mhcat/.config/emacs/straight/build/modus-themes/theme-loaddefs hides /usr/share/emacs/29.2/lisp/theme-loaddefs /home/mhcat/.config/emacs/straight/build/jsonrpc/jsonrpc hides /usr/share/emacs/29.2/lisp/jsonrpc /home/mhcat/.config/emacs/straight/build/external-completion/external-completion hides /usr/share/emacs/29.2/lisp/external-completion /home/mhcat/.config/emacs/straight/build/xref/xref hides /usr/share/emacs/29.2/lisp/progmodes/xref /home/mhcat/.config/emacs/straight/build/project/project hides /usr/share/emacs/29.2/lisp/progmodes/project /home/mhcat/.config/emacs/straight/build/flymake/flymake hides /usr/share/emacs/29.2/lisp/progmodes/flymake /home/mhcat/.config/emacs/straight/build/eglot/eglot hides /usr/share/emacs/29.2/lisp/progmodes/eglot /home/mhcat/.config/emacs/straight/build/org/ox hides /usr/share/emacs/29.2/lisp/org/ox /home/mhcat/.config/emacs/straight/build/org/ox-texinfo hides /usr/share/emacs/29.2/lisp/org/ox-texinfo /home/mhcat/.config/emacs/straight/build/org/ox-publish hides /usr/share/emacs/29.2/lisp/org/ox-publish /home/mhcat/.config/emacs/straight/build/org/ox-org hides /usr/share/emacs/29.2/lisp/org/ox-org /home/mhcat/.config/emacs/straight/build/org/ox-odt hides /usr/share/emacs/29.2/lisp/org/ox-odt /home/mhcat/.config/emacs/straight/build/org/ox-md hides /usr/share/emacs/29.2/lisp/org/ox-md /home/mhcat/.config/emacs/straight/build/org/ox-man hides /usr/share/emacs/29.2/lisp/org/ox-man /home/mhcat/.config/emacs/straight/build/org/ox-latex hides /usr/share/emacs/29.2/lisp/org/ox-latex /home/mhcat/.config/emacs/straight/build/org/ox-koma-letter hides /usr/share/emacs/29.2/lisp/org/ox-koma-letter /home/mhcat/.config/emacs/straight/build/org/ox-icalendar hides /usr/share/emacs/29.2/lisp/org/ox-icalendar /home/mhcat/.config/emacs/straight/build/org/ox-html hides /usr/share/emacs/29.2/lisp/org/ox-html /home/mhcat/.config/emacs/straight/build/org/ox-beamer hides /usr/share/emacs/29.2/lisp/org/ox-beamer /home/mhcat/.config/emacs/straight/build/org/ox-ascii hides /usr/share/emacs/29.2/lisp/org/ox-ascii /home/mhcat/.config/emacs/straight/build/org/org hides /usr/share/emacs/29.2/lisp/org/org /home/mhcat/.config/emacs/straight/build/org/org-version hides /usr/share/emacs/29.2/lisp/org/org-version /home/mhcat/.config/emacs/straight/build/org/org-timer hides /usr/share/emacs/29.2/lisp/org/org-timer /home/mhcat/.config/emacs/straight/build/org/org-tempo hides /usr/share/emacs/29.2/lisp/org/org-tempo /home/mhcat/.config/emacs/straight/build/org/org-table hides /usr/share/emacs/29.2/lisp/org/org-table /home/mhcat/.config/emacs/straight/build/org/org-src hides /usr/share/emacs/29.2/lisp/org/org-src /home/mhcat/.config/emacs/straight/build/org/org-refile hides /usr/share/emacs/29.2/lisp/org/org-refile /home/mhcat/.config/emacs/straight/build/org/org-protocol hides /usr/share/emacs/29.2/lisp/org/org-protocol /home/mhcat/.config/emacs/straight/build/org/org-plot hides /usr/share/emacs/29.2/lisp/org/org-plot /home/mhcat/.config/emacs/straight/build/org/org-persist hides /usr/share/emacs/29.2/lisp/org/org-persist /home/mhcat/.config/emacs/straight/build/org/org-pcomplete hides /usr/share/emacs/29.2/lisp/org/org-pcomplete /home/mhcat/.config/emacs/straight/build/org/org-num hides /usr/share/emacs/29.2/lisp/org/org-num /home/mhcat/.config/emacs/straight/build/org/org-mouse hides /usr/share/emacs/29.2/lisp/org/org-mouse /home/mhcat/.config/emacs/straight/build/org/org-mobile hides /usr/share/emacs/29.2/lisp/org/org-mobile /home/mhcat/.config/emacs/straight/build/org/org-macs hides /usr/share/emacs/29.2/lisp/org/org-macs /home/mhcat/.config/emacs/straight/build/org/org-macro hides /usr/share/emacs/29.2/lisp/org/org-macro /home/mhcat/.config/emacs/straight/build/org/org-loaddefs hides /usr/share/emacs/29.2/lisp/org/org-loaddefs /home/mhcat/.config/emacs/straight/build/org/org-list hides /usr/share/emacs/29.2/lisp/org/org-list /home/mhcat/.config/emacs/straight/build/org/org-lint hides /usr/share/emacs/29.2/lisp/org/org-lint /home/mhcat/.config/emacs/straight/build/org/org-keys hides /usr/share/emacs/29.2/lisp/org/org-keys /home/mhcat/.config/emacs/straight/build/org/org-inlinetask hides /usr/share/emacs/29.2/lisp/org/org-inlinetask /home/mhcat/.config/emacs/straight/build/org/org-indent hides /usr/share/emacs/29.2/lisp/org/org-indent /home/mhcat/.config/emacs/straight/build/org/org-id hides /usr/share/emacs/29.2/lisp/org/org-id /home/mhcat/.config/emacs/straight/build/org/org-habit hides /usr/share/emacs/29.2/lisp/org/org-habit /home/mhcat/.config/emacs/straight/build/org/org-goto hides /usr/share/emacs/29.2/lisp/org/org-goto /home/mhcat/.config/emacs/straight/build/org/org-footnote hides /usr/share/emacs/29.2/lisp/org/org-footnote /home/mhcat/.config/emacs/straight/build/org/org-fold hides /usr/share/emacs/29.2/lisp/org/org-fold /home/mhcat/.config/emacs/straight/build/org/org-fold-core hides /usr/share/emacs/29.2/lisp/org/org-fold-core /home/mhcat/.config/emacs/straight/build/org/org-feed hides /usr/share/emacs/29.2/lisp/org/org-feed /home/mhcat/.config/emacs/straight/build/org/org-faces hides /usr/share/emacs/29.2/lisp/org/org-faces /home/mhcat/.config/emacs/straight/build/org/org-entities hides /usr/share/emacs/29.2/lisp/org/org-entities /home/mhcat/.config/emacs/straight/build/org/org-element hides /usr/share/emacs/29.2/lisp/org/org-element /home/mhcat/.config/emacs/straight/build/org/org-duration hides /usr/share/emacs/29.2/lisp/org/org-duration /home/mhcat/.config/emacs/straight/build/org/org-datetree hides /usr/share/emacs/29.2/lisp/org/org-datetree /home/mhcat/.config/emacs/straight/build/org/org-cycle hides /usr/share/emacs/29.2/lisp/org/org-cycle /home/mhcat/.config/emacs/straight/build/org/org-ctags hides /usr/share/emacs/29.2/lisp/org/org-ctags /home/mhcat/.config/emacs/straight/build/org/org-crypt hides /usr/share/emacs/29.2/lisp/org/org-crypt /home/mhcat/.config/emacs/straight/build/org/org-compat hides /usr/share/emacs/29.2/lisp/org/org-compat /home/mhcat/.config/emacs/straight/build/org/org-colview hides /usr/share/emacs/29.2/lisp/org/org-colview /home/mhcat/.config/emacs/straight/build/org/org-clock hides /usr/share/emacs/29.2/lisp/org/org-clock /home/mhcat/.config/emacs/straight/build/org/org-capture hides /usr/share/emacs/29.2/lisp/org/org-capture /home/mhcat/.config/emacs/straight/build/org/org-attach hides /usr/share/emacs/29.2/lisp/org/org-attach /home/mhcat/.config/emacs/straight/build/org/org-attach-git hides /usr/share/emacs/29.2/lisp/org/org-attach-git /home/mhcat/.config/emacs/straight/build/org/org-archive hides /usr/share/emacs/29.2/lisp/org/org-archive /home/mhcat/.config/emacs/straight/build/org/org-agenda hides /usr/share/emacs/29.2/lisp/org/org-agenda /home/mhcat/.config/emacs/straight/build/org/ol hides /usr/share/emacs/29.2/lisp/org/ol /home/mhcat/.config/emacs/straight/build/org/ol-w3m hides /usr/share/emacs/29.2/lisp/org/ol-w3m /home/mhcat/.config/emacs/straight/build/org/ol-rmail hides /usr/share/emacs/29.2/lisp/org/ol-rmail /home/mhcat/.config/emacs/straight/build/org/ol-mhe hides /usr/share/emacs/29.2/lisp/org/ol-mhe /home/mhcat/.config/emacs/straight/build/org/ol-man hides /usr/share/emacs/29.2/lisp/org/ol-man /home/mhcat/.config/emacs/straight/build/org/ol-irc hides /usr/share/emacs/29.2/lisp/org/ol-irc /home/mhcat/.config/emacs/straight/build/org/ol-info hides /usr/share/emacs/29.2/lisp/org/ol-info /home/mhcat/.config/emacs/straight/build/org/ol-gnus hides /usr/share/emacs/29.2/lisp/org/ol-gnus /home/mhcat/.config/emacs/straight/build/org/ol-eww hides /usr/share/emacs/29.2/lisp/org/ol-eww /home/mhcat/.config/emacs/straight/build/org/ol-eshell hides /usr/share/emacs/29.2/lisp/org/ol-eshell /home/mhcat/.config/emacs/straight/build/org/ol-doi hides /usr/share/emacs/29.2/lisp/org/ol-doi /home/mhcat/.config/emacs/straight/build/org/ol-docview hides /usr/share/emacs/29.2/lisp/org/ol-docview /home/mhcat/.config/emacs/straight/build/org/ol-bibtex hides /usr/share/emacs/29.2/lisp/org/ol-bibtex /home/mhcat/.config/emacs/straight/build/org/ol-bbdb hides /usr/share/emacs/29.2/lisp/org/ol-bbdb /home/mhcat/.config/emacs/straight/build/org/oc hides /usr/share/emacs/29.2/lisp/org/oc /home/mhcat/.config/emacs/straight/build/org/oc-natbib hides /usr/share/emacs/29.2/lisp/org/oc-natbib /home/mhcat/.config/emacs/straight/build/org/oc-csl hides /usr/share/emacs/29.2/lisp/org/oc-csl /home/mhcat/.config/emacs/straight/build/org/oc-bibtex hides /usr/share/emacs/29.2/lisp/org/oc-bibtex /home/mhcat/.config/emacs/straight/build/org/oc-biblatex hides /usr/share/emacs/29.2/lisp/org/oc-biblatex /home/mhcat/.config/emacs/straight/build/org/oc-basic hides /usr/share/emacs/29.2/lisp/org/oc-basic /home/mhcat/.config/emacs/straight/build/org/ob hides /usr/share/emacs/29.2/lisp/org/ob /home/mhcat/.config/emacs/straight/build/org/ob-tangle hides /usr/share/emacs/29.2/lisp/org/ob-tangle /home/mhcat/.config/emacs/straight/build/org/ob-table hides /usr/share/emacs/29.2/lisp/org/ob-table /home/mhcat/.config/emacs/straight/build/org/ob-sqlite hides /usr/share/emacs/29.2/lisp/org/ob-sqlite /home/mhcat/.config/emacs/straight/build/org/ob-sql hides /usr/share/emacs/29.2/lisp/org/ob-sql /home/mhcat/.config/emacs/straight/build/org/ob-shell hides /usr/share/emacs/29.2/lisp/org/ob-shell /home/mhcat/.config/emacs/straight/build/org/ob-sed hides /usr/share/emacs/29.2/lisp/org/ob-sed /home/mhcat/.config/emacs/straight/build/org/ob-screen hides /usr/share/emacs/29.2/lisp/org/ob-screen /home/mhcat/.config/emacs/straight/build/org/ob-scheme hides /usr/share/emacs/29.2/lisp/org/ob-scheme /home/mhcat/.config/emacs/straight/build/org/ob-sass hides /usr/share/emacs/29.2/lisp/org/ob-sass /home/mhcat/.config/emacs/straight/build/org/ob-ruby hides /usr/share/emacs/29.2/lisp/org/ob-ruby /home/mhcat/.config/emacs/straight/build/org/ob-ref hides /usr/share/emacs/29.2/lisp/org/ob-ref /home/mhcat/.config/emacs/straight/build/org/ob-python hides /usr/share/emacs/29.2/lisp/org/ob-python /home/mhcat/.config/emacs/straight/build/org/ob-processing hides /usr/share/emacs/29.2/lisp/org/ob-processing /home/mhcat/.config/emacs/straight/build/org/ob-plantuml hides /usr/share/emacs/29.2/lisp/org/ob-plantuml /home/mhcat/.config/emacs/straight/build/org/ob-perl hides /usr/share/emacs/29.2/lisp/org/ob-perl /home/mhcat/.config/emacs/straight/build/org/ob-org hides /usr/share/emacs/29.2/lisp/org/ob-org /home/mhcat/.config/emacs/straight/build/org/ob-octave hides /usr/share/emacs/29.2/lisp/org/ob-octave /home/mhcat/.config/emacs/straight/build/org/ob-ocaml hides /usr/share/emacs/29.2/lisp/org/ob-ocaml /home/mhcat/.config/emacs/straight/build/org/ob-maxima hides /usr/share/emacs/29.2/lisp/org/ob-maxima /home/mhcat/.config/emacs/straight/build/org/ob-matlab hides /usr/share/emacs/29.2/lisp/org/ob-matlab /home/mhcat/.config/emacs/straight/build/org/ob-makefile hides /usr/share/emacs/29.2/lisp/org/ob-makefile /home/mhcat/.config/emacs/straight/build/org/ob-lua hides /usr/share/emacs/29.2/lisp/org/ob-lua /home/mhcat/.config/emacs/straight/build/org/ob-lob hides /usr/share/emacs/29.2/lisp/org/ob-lob /home/mhcat/.config/emacs/straight/build/org/ob-lisp hides /usr/share/emacs/29.2/lisp/org/ob-lisp /home/mhcat/.config/emacs/straight/build/org/ob-lilypond hides /usr/share/emacs/29.2/lisp/org/ob-lilypond /home/mhcat/.config/emacs/straight/build/org/ob-latex hides /usr/share/emacs/29.2/lisp/org/ob-latex /home/mhcat/.config/emacs/straight/build/org/ob-julia hides /usr/share/emacs/29.2/lisp/org/ob-julia /home/mhcat/.config/emacs/straight/build/org/ob-js hides /usr/share/emacs/29.2/lisp/org/ob-js /home/mhcat/.config/emacs/straight/build/org/ob-java hides /usr/share/emacs/29.2/lisp/org/ob-java /home/mhcat/.config/emacs/straight/build/org/ob-haskell hides /usr/share/emacs/29.2/lisp/org/ob-haskell /home/mhcat/.config/emacs/straight/build/org/ob-groovy hides /usr/share/emacs/29.2/lisp/org/ob-groovy /home/mhcat/.config/emacs/straight/build/org/ob-gnuplot hides /usr/share/emacs/29.2/lisp/org/ob-gnuplot /home/mhcat/.config/emacs/straight/build/org/ob-fortran hides /usr/share/emacs/29.2/lisp/org/ob-fortran /home/mhcat/.config/emacs/straight/build/org/ob-forth hides /usr/share/emacs/29.2/lisp/org/ob-forth /home/mhcat/.config/emacs/straight/build/org/ob-exp hides /usr/share/emacs/29.2/lisp/org/ob-exp /home/mhcat/.config/emacs/straight/build/org/ob-eval hides /usr/share/emacs/29.2/lisp/org/ob-eval /home/mhcat/.config/emacs/straight/build/org/ob-eshell hides /usr/share/emacs/29.2/lisp/org/ob-eshell /home/mhcat/.config/emacs/straight/build/org/ob-emacs-lisp hides /usr/share/emacs/29.2/lisp/org/ob-emacs-lisp /home/mhcat/.config/emacs/straight/build/org/ob-dot hides /usr/share/emacs/29.2/lisp/org/ob-dot /home/mhcat/.config/emacs/straight/build/org/ob-ditaa hides /usr/share/emacs/29.2/lisp/org/ob-ditaa /home/mhcat/.config/emacs/straight/build/org/ob-css hides /usr/share/emacs/29.2/lisp/org/ob-css /home/mhcat/.config/emacs/straight/build/org/ob-core hides /usr/share/emacs/29.2/lisp/org/ob-core /home/mhcat/.config/emacs/straight/build/org/ob-comint hides /usr/share/emacs/29.2/lisp/org/ob-comint /home/mhcat/.config/emacs/straight/build/org/ob-clojure hides /usr/share/emacs/29.2/lisp/org/ob-clojure /home/mhcat/.config/emacs/straight/build/org/ob-calc hides /usr/share/emacs/29.2/lisp/org/ob-calc /home/mhcat/.config/emacs/straight/build/org/ob-awk hides /usr/share/emacs/29.2/lisp/org/ob-awk /home/mhcat/.config/emacs/straight/build/org/ob-R hides /usr/share/emacs/29.2/lisp/org/ob-R /home/mhcat/.config/emacs/straight/build/org/ob-C hides /usr/share/emacs/29.2/lisp/org/ob-C /home/mhcat/.config/emacs/straight/build/seq/seq hides /usr/share/emacs/29.2/lisp/emacs-lisp/seq /home/mhcat/.config/emacs/straight/build/map/map hides /usr/share/emacs/29.2/lisp/emacs-lisp/map /home/mhcat/.config/emacs/straight/build/eldoc/eldoc hides /usr/share/emacs/29.2/lisp/emacs-lisp/eldoc Features: (shadow sort mail-extr loaddefs-gen vertico-directory rainbow-delimiters idle-highlight-mode cus-start which-key eros minions mhc-scheme irc erc-services erc-goodies erc erc-backend erc-networks erc-common erc-compat erc-loaddefs rss elfeed-show elfeed-search vc-git elfeed-csv elfeed elfeed-curl elfeed-log elfeed-db elfeed-lib url-queue xml-query elfeed-autoloads gudfns tree mail mu4e mu4e-org mu4e-notification mu4e-main smtpmail mu4e-view mu4e-mime-parts gnus-art mm-uu mml2015 gnus-sum gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail mail-source utf7 nnoo gnus-spec gnus-int gnus-range gnus-win gnus mu4e-headers mu4e-thread mu4e-actions mu4e-compose nnheader range mu4e-search mu4e-lists mu4e-bookmarks mu4e-mark mu4e-message flow-fill mule-util mu4e-contacts mu4e-update mu4e-folders mu4e-context mu4e-query-items mu4e-server mu4e-modeline mu4e-vars mu4e-helpers mu4e-config mu4e-window ido mu4e-obsolete notmuch notmuch-tree notmuch-jump notmuch-hello notmuch-show notmuch-print notmuch-crypto notmuch-mua notmuch-message notmuch-draft notmuch-maildir-fcc notmuch-address notmuch-company notmuch-parser notmuch-wash coolj goto-addr icalendar diary-lib diary-loaddefs notmuch-tag notmuch-lib notmuch-version notmuch-compat hl-line mm-view mml-smime smime dig notmuch-autoloads fonts fontaine fontaine-autoloads paredithacks 2048-game 2048-game-autoloads gruvbox-theme gruvbox gruvbox-theme-autoloads zenburn-theme zenburn-theme-autoloads solarized-theme solarized solarized-faces solarized-theme-autoloads almost-mono-themes almost-mono-themes-autoloads doom-themes doom-themes-base doom-themes-autoloads darktooth-theme darktooth autothemer darktooth-theme-autoloads autothemer-autoloads the-matrix-theme the-matrix-theme-autoloads dracula-theme dracula-theme-autoloads esh-var esh-mode esh-cmd esh-ext esh-opt esh-proc esh-io esh-arg esh-module esh-groups esh-util eat term/xterm xterm term disp-table ehelp eat-autoloads modus-themes modus-themes-autoloads standard-themes standard-themes-autoloads ef-themes ef-themes-autoloads spacious-padding spacious-padding-autoloads cyanapunk-neontrix-theme cyanapunk-neontrix-theme-autoloads mix mix-autoloads elixir-ts-mode elixir-ts-mode-autoloads heex-ts-mode-autoloads erlang erlang-autoloads haskell-mode haskell-cabal haskell-utils haskell-font-lock haskell-indentation haskell-string haskell-sort-imports haskell-lexeme haskell-align-imports haskell-complete-module haskell-ghc-support flymake-proc dabbrev haskell-customize haskell-mode-autoloads hare-ts-mode hare-ts-mode-autoloads cargo cargo-process cargo-autoloads rust-ts-mode c-ts-common org-modern org-modern-autoloads denote denote-autoloads ob-fennel fennel-proto-repl org-tempo tempo org-datetree ox-odt rng-loc rng-uri rng-parse rng-match rng-dt rng-util rng-pttrn nxml-parse nxml-ns nxml-enc xmltok nxml-util ox-latex ox-icalendar ox-html table ox-ascii ox-publish ox org-clock org-agenda fennel-mode inf-lisp fennel-mode-autoloads lua-mode lua-mode-autoloads telega-obsolete telega telega-tdlib-events telega-webpage telega-match telega-root telega-info telega-chat visual-fill-column telega-modes image-mode exif telega-company telega-emoji telega-user telega-notifications notifications dbus telega-voip telega-msg telega-story telega-tme telega-sticker telega-i18n telega-vvnote bindat telega-ffplay telega-sort telega-filter telega-ins telega-inline telega-util telega-folders telega-topic telega-media telega-tdlib rainbow-identifiers the-org-mode-expansions embark-org org-element org-persist xdg org-id org-refile org-element-ast inline avl-tree org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-src ob-comint org-pcomplete org-list org-footnote org-faces org-entities ob-emacs-lisp ob-core ob-eval org-cycle org-table ol org-fold org-fold-core org-keys oc org-loaddefs cal-menu calendar cal-loaddefs org-version org-compat org-macs dired-aux telega-server telega-core telega-customize emacsbug telega-autoloads rainbow-identifiers-autoloads visual-fill-column-autoloads sxhkdrc-mode sxhkdrc-mode-autoloads yaml-mode-expansions yaml-mode yaml-mode-autoloads hl-todo hl-todo-autoloads markdown-mode markdown-mode-autoloads dockerfile-mode sh-script smie treesit executable dockerfile-mode-autoloads rainbow-mode rainbow-mode-autoloads socks gnutls nsm elpher elpher-autoloads terraform-mode noutline outline hcl-mode terraform-mode-autoloads hcl-mode-autoloads pinentry pinentry-autoloads idle-highlight-mode-autoloads inf-janet inf-janet-autoloads janet-mode janet-mode-autoloads s s-autoloads geiser-gambit geiser-gambit-autoloads geiser-chez geiser-chez-autoloads geiser-chicken geiser-chicken-autoloads geiser-guile info-look geiser-debug geiser-repl geiser-image geiser-capf geiser-doc geiser-menu geiser-autodoc geiser-edit 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-guile-autoloads geiser-eros-autoloads geiser geiser-autoloads time minions-autoloads eros-autoloads which-key-autoloads cider-autoloads cider tramp-sh cider-debug cider-browse-ns cider-mode cider-xref-backend cider-find cider-inspector cider-completion cider-profile cider-eval cider-jar cider-repl-history pulse cider-repl cider-resolve cider-test cider-overlays cider-stacktrace cider-doc cider-browse-spec cider-clojuredocs cider-eldoc cider-docstring shr pixel-fill kinsoku url-file svg xml dom cider-client cider-common cider-completion-context cider-connection cider-popup sesman-browser nrepl-client cider-util color tramp tramp-loaddefs trampver tramp-integration files-x tramp-compat parse-time iso8601 sesman queue nrepl-dict spinner parseedn parseclj-parser parseclj-lex parseclj-alist sesman-autoloads spinner-autoloads queue-autoloads parseedn-autoloads map-autoloads parseclj-autoloads clojure-mode-expansions clojure-mode lisp-mnt align clojure-mode-autoloads sly-named-readtables sly-asdf grep sly-asdf-autoloads popup-autoloads sly-quicklisp sly-macrostep macrostep sly-macrostep-autoloads macrostep-autoloads sly sly-completion sly-buttons sly-messages sly-common apropos etags fileloop generator arc-mode archive-mode sly-autoloads hyperspec hyperspec-autoloads diff-hl log-view vc-dir vc vc-dispatcher diff-hl-autoloads 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 magit-diff smerge-mode git-commit log-edit message sendmail yank-media puny dired dired-loaddefs rfc822 mml mml-sec epa derived epg rfc6068 epg-config gnus-util time-date 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 shell pcomplete server magit-mode transient magit-git magit-base magit-section format-spec cursor-sensor crm dash magit-autoloads magit-section-autoloads git-commit-autoloads with-editor-autoloads transient-autoloads dash-autoloads advice browse-kill-ring delsel browse-kill-ring-autoloads rainbow-delimiters-autoloads expand-region text-mode-expansions er-basic-expansions expand-region-core expand-region-custom expand-region-autoloads mwim mwim-autoloads ibuffer ibuffer-loaddefs autorevert recentf tree-widget saveplace paredit edmacro kmacro paredit-autoloads marginalia marginalia-autoloads cape cape-autoloads corfu corfu-autoloads embark-consult consult bookmark embark-consult-autoloads consult-autoloads embark ffap embark-autoloads minibuf-eldef mb-depth orderless orderless-autoloads vertico-buffer vertico compat vertico-autoloads compat-autoloads exec-path-from-shell exec-path-from-shell-autoloads comp comp-cstr rx browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf mailcap savehist pixel-scroll cua-base yasnippet yasnippet-autoloads eglot-x eglot-x-autoloads eglot external-completion jsonrpc xref flymake thingatpt project seq-25 diff diff-mode ert ewoc debug backtrace find-func filenotify warnings compile text-property-search comint ansi-osc ansi-color ring pcase url-util url-parse auth-source eieio eieio-core password-cache json map byte-opt url-vars imenu eglot-autoloads external-completion-autoloads seq-autoloads flymake-autoloads project-autoloads xref-autoloads eldoc-autoloads jsonrpc-autoloads interaction-log interaction-log-autoloads finder-inf use-package use-package-ensure use-package-delight use-package-diminish use-package-bind-key bind-key easy-mmode use-package-core cus-edit pp cus-load icons wid-edit info straight-autoloads cl-seq cl-extra help-mode straight subr-x cl-macs gv cl-loaddefs cl-lib bytecomp byte-compile erlang-start rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads dbusbind inotify lcms2 dynamic-setting font-render-setting cairo x-toolkit xinput2 x multi-tty make-network-process native-compile emacs) Memory information: ((conses 16 1018972 111252) (symbols 48 69403 6) (strings 32 247003 24340) (string-bytes 1 9433259) (vectors 16 131572) (vector-slots 8 2611350 79535) (floats 8 1416 383) (intervals 56 10964 584) (buffers 984 17)) <#secure method=pgpmime mode=sign> -- In this world / we walk on the roof of hell / gazing at flowers - Kobayashi Issa
> Cc: 69865@debbugs.gnu.org
> Date: Mon, 18 Mar 2024 08:09:17 +0100
> From: Michael Heerdegen via "Bug reports for GNU Emacs,
> the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
>
> Damien Cassou <damien@cassou.me> writes:
>
> > $ emacs --batch -Q --eval "(require 'ob-exp)" --eval "(require 'edebug)" --eval "(edebug-instrument-function #'org-babel-exp-results)"
> >
> > Error: void-function (body)
> > mapbacktrace(#f(compiled-function (evald func args flags) #<bytecode 0xf735a912daef0d4>))
> > debug-early-backtrace()
> > debug-early(error (void-function body))
> > body((((org-babel-process-params (org-babel-merge-params (nth 2 info) `((:results \, (if silent "silent" "replace")))))) (18084 (18085 . 18109) (18115 (18116 . 18138) (18145 (18146 . 18149) (18150 . 18151) (18152 . 18156) . 18157) (18164 (18164 . 18165) (18165 (18166 (18167 . 18175) (18178 . 18179) (18179 (18180 . 18182) (18183 . 18189) (18190 . 18198) (18199 . 18208) . 18209) . 18210) . 18211) . 18211) . 18212) . 18213) . 18214))
> > …
> > edebug-read-and-maybe-wrap-form1()
> > edebug-read-and-maybe-wrap-form()
> > edebug-read-top-level-form()
> > edebug-eval-top-level-form()
> > edebug-instrument-function(org-babel-exp-results)
> > command-line-1(("--eval" "(require 'ob-exp)" "--eval" "(require 'edebug)" "--eval" "(edebug-instrument-function #'org-babel-exp-results)"))
> > command-line()
> > normal-top-level()
> > Symbol’s function definition is void: body
> >
> > In GNU Emacs 29.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.41,
> > cairo version 1.18.0)
>
> I can also reproduce this in 29.1, but not in master. Maybe this has
> been fixed with one of Stefan's latest changes of Edebug.
I don't think this has been fixed, because I can reproduce this
variant of the bug with the current master branch:
emacs -Q
M-x load-file RET lisp/org/ob-exp.el RET
C-x C-f lisp/org/ob-exp.el RET
C-u 430 M-g g
M-x edebug-defun RET
=> Symbol’s function definition is void: body
(I also can reproduce the original recipe with the current master.)