[{"date":"2026-03-07T23:57:40.328Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87y0k32o07.fsf@","message-id":"87y0k32o07.fsf@","config":false,"refs-count":1,"username":"Bj\u00f6rn Kettunen","references":["87bjgzfub3.fsf@localhost","87bjh3gzjx.fsf@localhost"],"related-refs":["87y0k32o07.fsf@"],"from":"bjorn.kettunen@thaodan.de","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87y0k32o07.fsf@","source-id":"emacs-orgmode@gnu.org","patch-body":"From 30cadf1c23ec70775103e8edb592770b8ef84a17 Mon Sep 17 00:00:00 2001\r\nFrom: =?UTF-8?q?Bj=C3=B6rn=20Kettunen?= <bjorn.kettunen@thaodan.de>\r\nDate: Tue, 3 Mar 2026 22:47:12 +0200\r\nSubject: [PATCH 1\/2] org-clock: clock-report be able to also take directories\r\n\r\n* lisp\/org-clock.el (org-dblock-write:clocktable): Expand\r\nfiles in directories if any of the entries in scope is a directory.\r\nJust like in org-agenda-files.\r\n\r\n* lisp\/org.el (org-file-list-expand):\r\n(org-agenda-files): Refactor file expansion into separate function.\r\n\r\n* doc\/org-manual.org: Document.\r\n* etc\/ORG-NEWS: Announce\r\n---\r\n doc\/org-manual.org |  2 +-\r\n etc\/ORG-NEWS       |  9 +++++++++\r\n lisp\/org-clock.el  | 45 +++++++++++++++++++++++++++------------------\r\n lisp\/org.el        | 20 +++++++++++++-------\r\n 4 files changed, 50 insertions(+), 26 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 9c4c27877..cfcf8994b 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -7109,7 +7109,7 @@ *** The clock table\r\n   | =treeN=                | the surrounding level N tree, for example =tree3=                   |\r\n   | =tree=                 | the surrounding level 1 tree                                        |\r\n   | =agenda=               | all agenda files                                                    |\r\n-  | =(\"file\" ...)=         | scan these files                                                    |\r\n+  | =(\"file\" \"dir\" \"...)=  | scan these files or files in directories                            |\r\n   | =FUNCTION=             | scan files returned by calling {{{var(FUNCTION)}}} with no argument |\r\n   | =file-with-archives=   | current file and its archives                                       |\r\n   | =agenda-with-archives= | all agenda files, including archives                                |\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 40fa1e6aa..ca18ab041 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -40,6 +40,11 @@ into a \"Tags\" section and a \"Priorities\" section.\r\n Priorities can now be increased, decreased, set to the default, and\r\n set interactively from the priority context menus.\r\n \r\n+*** Clocktable option =:scope (file)= list of files can now also include directories\r\n+\r\n+The scope option can now also include directories in the list of files.\r\n+Files are resolved just like in ~org-agenda-files~.\r\n+\r\n ** New and changed options\r\n \r\n # Changes dealing with changing default values of customizations,\r\n@@ -60,6 +65,10 @@ variable.\r\n Given the completed and total number of tasks, format the percent\r\n cookie =[N%]=.\r\n \r\n+*** New function ~org-agenda-directory-files-recursively~\r\n+\r\n+Expand list of flies according to ~org-agenda-file-regexp~.\r\n+\r\n ** Removed or renamed functions and variables\r\n \r\n ** Miscellaneous\r\ndiff --git a\/lisp\/org-clock.el b\/lisp\/org-clock.el\r\nindex ce2d23a9b..8b5cf64aa 100644\r\n--- a\/lisp\/org-clock.el\r\n+++ b\/lisp\/org-clock.el\r\n@@ -2677,22 +2677,20 @@ (defun org-dblock-write:clocktable (params)\r\n   (catch 'exit\r\n     (let* ((scope (plist-get params :scope))\r\n \t   (base-buffer (org-base-buffer (current-buffer)))\r\n+           (scope (or (and (functionp scope)\r\n+                           (funcall scope))\r\n+                      scope))\r\n \t   (files (pcase scope\r\n-\t\t    (`agenda\r\n+\t\t    ((or `agenda `agenda-with-archives)\r\n \t\t     (org-agenda-files t))\r\n-\t\t    (`agenda-with-archives\r\n-\t\t     (org-add-archive-files (org-agenda-files t)))\r\n-\t\t    (`file-with-archives\r\n-\t\t     (let ((base-file (buffer-file-name base-buffer)))\r\n-\t\t       (and base-file\r\n-\t\t\t    (org-add-archive-files (list base-file)))))\r\n-\t\t    ((or `nil `file `subtree `tree\r\n+\t\t    ((or `nil `file `subtree `tree `file-with-archives\r\n \t\t\t (and (pred symbolp)\r\n+                              (pred (not symbolp))\r\n \t\t\t      (guard (string-match \"\\\\`tree\\\\([0-9]+\\\\)\\\\'\"\r\n \t\t\t\t\t\t   (symbol-name scope)))))\r\n \t\t     base-buffer)\r\n-\t\t    ((pred functionp) (funcall scope))\r\n \t\t    ((pred consp) scope)\r\n+                    ((pred stringp) scope) ;; To not break previous function calls here\r\n \t\t    (_ (user-error \"Unknown scope: %S\" scope))))\r\n \t   (block (plist-get params :block))\r\n \t   (ts (plist-get params :tstart))\r\n@@ -2704,7 +2702,25 @@ (defun org-dblock-write:clocktable (params)\r\n \t   (formatter (or (plist-get params :formatter)\r\n \t\t\t  org-clock-clocktable-formatter\r\n \t\t\t  'org-clocktable-write-default))\r\n-\t   cc)\r\n+           (multifile\r\n+\t    ;; Even though `file-with-archives' can consist of\r\n+\t    ;; multiple files, we consider this is one extended file\r\n+\t    ;; instead.\r\n+\t    (and (not hide-files)\r\n+\t\t (consp files)\r\n+\t\t (not (eq scope 'file-with-archives))))\r\n+           cc)\r\n+\r\n+      (when (consp files)\r\n+        (when-let* ((cons-scope (car files))\r\n+                    (cons-scope (and (symbolp cons-scope)\r\n+                                     cons-scope)))\r\n+          (setq scope cons-scope)\r\n+          (setq files (cdr files)))\r\n+        (setq files (org-agenda-directory-files-recursively files)))\r\n+      (pcase scope ((or `agenda-with-archives `file-with-archives)\r\n+                     (setq files (org-add-archive-files files))))\r\n+\r\n       ;; Check if we need to do steps\r\n       (when block\r\n \t;; Get the range text for the header\r\n@@ -2750,14 +2766,7 @@ (defun org-dblock-write:clocktable (params)\r\n \t\t\t\t   level)\r\n \t\t\t   (throw 'exit nil))))\r\n \t\t     (org-narrow-to-subtree))))\r\n-\t\t (list (org-clock-get-table-data nil params)))))\r\n-\t    (multifile\r\n-\t     ;; Even though `file-with-archives' can consist of\r\n-\t     ;; multiple files, we consider this is one extended file\r\n-\t     ;; instead.\r\n-\t     (and (not hide-files)\r\n-\t\t  (consp files)\r\n-\t\t  (not (eq scope 'file-with-archives)))))\r\n+\t\t (list (org-clock-get-table-data nil params))))))\r\n \r\n \t(funcall formatter\r\n \t\t origin\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex fc51d4ba3..05607bd2c 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -15977,6 +15977,18 @@ (defun org-switchb (&optional arg)\r\n \t\t      (mapcar #'list (mapcar #'buffer-name blist))\r\n \t\t      nil t))))\r\n \r\n+\r\n+(defun org-agenda-directory-files-recursively (files)\r\n+  \"Expand list of FILES according to `org-agenda-file-regexp'.\"\r\n+  (apply 'append\r\n+\t (mapcar (lambda (f)\r\n+\t\t   (if (file-directory-p f)\r\n+\t\t       (directory-files\r\n+\t\t\tf t org-agenda-file-regexp)\r\n+\t\t     (list (expand-file-name f org-directory))))\r\n+\t\t files)))\r\n+\r\n+\r\n (defun org-agenda-files (&optional unrestricted archives)\r\n   \"Get the list of agenda files.\r\n Optional UNRESTRICTED means return the full list even if a restriction\r\n@@ -15990,13 +16002,7 @@ (defun org-agenda-files (&optional unrestricted archives)\r\n \t  ((stringp org-agenda-files) (org-read-agenda-file-list))\r\n \t  ((listp org-agenda-files) org-agenda-files)\r\n \t  (t (error \"Invalid value of `org-agenda-files'\")))))\r\n-    (setq files (apply 'append\r\n-\t\t       (mapcar (lambda (f)\r\n-\t\t\t\t (if (file-directory-p f)\r\n-\t\t\t\t     (directory-files\r\n-\t\t\t\t      f t org-agenda-file-regexp)\r\n-\t\t\t\t   (list (expand-file-name f org-directory))))\r\n-\t\t\t       files)))\r\n+    (setq files (org-agenda-directory-files-recursively files))\r\n     (when org-agenda-skip-unavailable-files\r\n       (setq files (delq nil\r\n \t\t\t(mapcar (lambda (file)\r\n-- \r\n2.53.0\r\n\r\n","subject":"Re: [PATCH] org-clock: clock-report be able to also take directories"},{"date":"2026-03-07T03:17:23.974Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CH3PR84MB3424224300D5CA4DAD56A302C57BA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","message-id":"CH3PR84MB3424224300D5CA4DAD56A302C57BA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","config":false,"refs-count":8,"username":"Morgan Smith","references":["CH3PR84MB3424616301FA8E3BE4F67DADC573A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","87o6l7uamf.fsf@localhost","CH3PR84MB3424D68D8BE54E9CBB3F1ACFC570A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","87ecm5ufq7.fsf@localhost"],"related-refs":["CH3PR84MB3424224300D5CA4DAD56A302C57BA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"from":"Morgan.J.Smith@outlook.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/CH3PR84MB3424224300D5CA4DAD56A302C57BA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","source-id":"emacs-orgmode@gnu.org","patch-body":"From 318bda0a3dd04824d69122a79363345f50f9516b Mon Sep 17 00:00:00 2001\r\nFrom: Morgan Smith <Morgan.J.Smith@outlook.com>\r\nDate: Wed, 25 Feb 2026 14:25:44 -0500\r\nSubject: [PATCH 1\/3] Testing: Refactor some tests\r\n\r\n* testing\/lisp\/test-org.el (test-org\/org-encode-time,\r\ntest-org\/toggle-comment, test-org\/closest-date,\r\ntest-org\/org-todo-prefix, test-org\/entry-blocked-p): Refactor\r\n---\r\n testing\/lisp\/test-org.el | 369 ++++++++++++++-------------------------\r\n 1 file changed, 133 insertions(+), 236 deletions(-)\r\n\r\ndiff --git a\/testing\/lisp\/test-org.el b\/testing\/lisp\/test-org.el\r\nindex e38d20d9c..ccbcf188b 100644\r\n--- a\/testing\/lisp\/test-org.el\r\n+++ b\/testing\/lisp\/test-org.el\r\n@@ -80,61 +80,26 @@ org-test-without-dow\r\n \r\n (ert-deftest test-org\/toggle-comment ()\r\n   \"Test `org-toggle-comment' specifications.\"\r\n-  ;; Simple headline.\r\n-  (should\r\n-   (equal \"* Test\"\r\n-\t  (org-test-with-temp-text \"* COMMENT Test\"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string))))\r\n-  (should\r\n-   (equal \"* COMMENT Test\"\r\n-\t  (org-test-with-temp-text \"* Test\"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string))))\r\n-  ;; Headline with a regular keyword.\r\n-  (should\r\n-   (equal \"* TODO Test\"\r\n-\t  (org-test-with-temp-text \"* TODO COMMENT Test\"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string))))\r\n-  (should\r\n-   (equal \"* TODO COMMENT Test\"\r\n-\t  (org-test-with-temp-text \"* TODO Test\"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string))))\r\n-  ;; Empty headline.\r\n-  (should\r\n-   (equal \"* \"\r\n-\t  (org-test-with-temp-text \"* COMMENT\"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string))))\r\n-  (should\r\n-   (equal \"* COMMENT\"\r\n-\t  (org-test-with-temp-text \"* \"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string))))\r\n-  ;; Headline with a single keyword.\r\n-  (should\r\n-   (equal \"* TODO \"\r\n-\t  (org-test-with-temp-text \"* TODO COMMENT\"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string))))\r\n-  (should\r\n-   (equal \"* TODO COMMENT\"\r\n-\t  (org-test-with-temp-text \"* TODO\"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string))))\r\n-  ;; Headline with a keyword, a priority cookie and contents.\r\n-  (should\r\n-   (equal \"* TODO [#A] Headline\"\r\n-\t  (org-test-with-temp-text \"* TODO [#A] COMMENT Headline\"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string))))\r\n-  (should\r\n-   (equal \"* TODO [#A] COMMENT Headline\"\r\n-\t  (org-test-with-temp-text \"* TODO [#A] Headline\"\r\n-\t    (org-toggle-comment)\r\n-\t    (buffer-string)))))\r\n+  (cl-flet ((test-toggle-comment (input expected)\r\n+              (should (equal expected\r\n+                             (org-test-with-temp-text input\r\n+                               (org-toggle-comment)\r\n+                               (buffer-string))))))\r\n+    ;; Simple headline.\r\n+    (test-toggle-comment \"* COMMENT Test\" \"* Test\")\r\n+    (test-toggle-comment \"* Test\" \"* COMMENT Test\")\r\n+    ;; Headline with a regular keyword.\r\n+    (test-toggle-comment \"* TODO COMMENT Test\" \"* TODO Test\")\r\n+    (test-toggle-comment \"* TODO Test\" \"* TODO COMMENT Test\")\r\n+    ;; Empty headline.\r\n+    (test-toggle-comment \"* COMMENT\" \"* \")\r\n+    (test-toggle-comment \"* \" \"* COMMENT\")\r\n+    ;; Headline with a single keyword.\r\n+    (test-toggle-comment \"* TODO COMMENT\" \"* TODO \")\r\n+    (test-toggle-comment \"* TODO\" \"* TODO COMMENT\")\r\n+    ;; Headline with a keyword, a priority cookie and contents.\r\n+    (test-toggle-comment \"* TODO [#A] COMMENT Headline\" \"* TODO [#A] Headline\")\r\n+    (test-toggle-comment \"* TODO [#A] Headline\" \"* TODO [#A] COMMENT Headline\")))\r\n \r\n (ert-deftest test-org\/comment-dwim ()\r\n   \"Test `comment-dwim' behaviour in an Org buffer.\"\r\n@@ -252,60 +217,44 @@ test-org\/comment-dwim\r\n \r\n (ert-deftest test-org\/org-encode-time ()\r\n   \"Test various ways to call `org-encode-time'\"\r\n-  (org-test-with-timezone \"UTC\"\r\n-    ;; list as the sole argument\r\n-    (should (string-equal\r\n-             \"2022-03-24 23:30:01\"\r\n-             (format-time-string\r\n-              \"%F %T\"\r\n-              (org-encode-time '(1 30 23 24 3 2022 nil -1 nil)))))\r\n-    ;; SECOND...YEAR\r\n-    (should (string-equal\r\n-             \"2022-03-24 23:30:02\"\r\n-             (format-time-string\r\n-              \"%F %T\"\r\n-              (org-encode-time 2 30 23 24 3 2022))))\r\n-    ;; SECOND...YEAR IGNORED DST ZONE\r\n-    (should (string-equal\r\n-             \"2022-03-24 23:30:03\"\r\n-             (format-time-string\r\n-              \"%F %T\"\r\n-              (org-encode-time 3 30 23 24 3 2022 nil -1 nil))))\r\n-    ;; function call\r\n-    (should (string-equal\r\n-             \"2022-03-24 23:30:04\"\r\n-             (format-time-string\r\n-              \"%F %T\"\r\n-              (org-encode-time (apply #'list 4 30 23 '(24 3 2022 nil -1 nil))))))\r\n-    ;; wrong number of arguments\r\n-    (if (not (version< emacs-version \"27.1\"))\r\n-        (should-error (string-equal\r\n-                       \"2022-03-24 23:30:05\"\r\n+  (cl-flet ((test-org-encode-time (input expected &optional (time-format-string \"%F %T\")\r\n+                                         zone)\r\n+              (should (string-equal\r\n+                       expected\r\n                        (format-time-string\r\n-                        \"%F %T\"\r\n-                        (org-encode-time 5 30 23 24 3 2022 nil))))))\r\n-  ;; daylight saving time\r\n-  (if (not (version< emacs-version \"27.1\"))\r\n-      ;; DST value is not ignored for multiple arguments unlike for `encode-time'\r\n-      (should (string-equal\r\n-               \"2022-04-01 00:30:06 +0200 CEST\"\r\n-               (format-time-string\r\n-                \"%F %T %z %Z\"\r\n-                (org-encode-time 6 30 23 31 3 2022 nil nil \"Europe\/Madrid\")\r\n-                \"Europe\/Madrid\")))\r\n-    (should (string-equal\r\n-             \"2022-03-31 23:30:07 +0200 CEST\"\r\n-             (format-time-string\r\n-              \"%F %T %z %Z\"\r\n-              (org-encode-time 7 30 23 31 3 2022 nil t \"Europe\/Madrid\")\r\n-              \"Europe\/Madrid\"))))\r\n-  (org-test-with-timezone \"Europe\/Madrid\"\r\n-    ;; Standard time is not forced when DST is not specified\r\n-    (should (string-equal\r\n-             \"2022-03-31 23:30:08\"\r\n-             (format-time-string\r\n-              \"%F %T\"\r\n-              (org-encode-time 8 30 23 31 3 2022))))))\r\n+                        time-format-string\r\n+                        input\r\n+                        zone)))))\r\n+    (org-test-with-timezone \"UTC\"\r\n+      ;; list as the sole argument\r\n+      (test-org-encode-time (org-encode-time '(1 30 23 24 3 2022 nil -1 nil))\r\n+                            \"2022-03-24 23:30:01\")\r\n+      ;; SECOND...YEAR\r\n+      (test-org-encode-time (org-encode-time 2 30 23 24 3 2022)\r\n+                            \"2022-03-24 23:30:02\")\r\n+      ;; SECOND...YEAR IGNORED DST ZONE\r\n+      (test-org-encode-time (org-encode-time 3 30 23 24 3 2022 nil -1 nil)\r\n+                            \"2022-03-24 23:30:03\")\r\n+      ;; function call\r\n+      (test-org-encode-time (org-encode-time (apply #'list 4 30 23 '(24 3 2022 nil -1 nil)))\r\n+                            \"2022-03-24 23:30:04\")\r\n+      ;; wrong number of arguments\r\n+      (if (not (version< emacs-version \"27.1\"))\r\n+          (should-error (org-encode-time 5 30 23 24 3 2022 nil))))\r\n+    ;; daylight saving time\r\n+    (if (not (version< emacs-version \"27.1\"))\r\n+        ;; DST value is not ignored for multiple arguments unlike for `encode-time'\r\n+        (test-org-encode-time (org-encode-time 6 30 23 31 3 2022 nil nil \"Europe\/Madrid\")\r\n+                              \"2022-04-01 00:30:06 +0200 CEST\"\r\n+                              \"%F %T %z %Z\"\r\n+                              \"Europe\/Madrid\")\r\n+      (test-org-encode-time (org-encode-time 7 30 23 31 3 2022 nil t \"Europe\/Madrid\")\r\n+                            \"2022-03-31 23:30:07 +0200 CEST\"\r\n+                            \"%F %T %z %Z\"\r\n+                            \"Europe\/Madrid\"))\r\n+    (org-test-with-timezone \"Europe\/Madrid\"\r\n+      ;; Standard time is not forced when DST is not specified\r\n+      (test-org-encode-time (org-encode-time 8 30 23 31 3 2022) \"2022-03-31 23:30:08\"))))\r\n \r\n (ert-deftest test-org\/org-time-string-to-time ()\r\n   \"Test `org-time-string-to-time' around DST transition.\"\r\n@@ -431,79 +380,47 @@ test-org\/closest-date\r\n   \"Test `org-closest-date' specifications.\"\r\n   (require 'calendar)\r\n   ;; Time stamps without a repeater are returned unchanged.\r\n-  (should\r\n-   (equal\r\n-    '(3 29 2012)\r\n-    (calendar-gregorian-from-absolute\r\n-     (org-closest-date \"<2012-03-29>\" \"<2014-03-04>\" nil))))\r\n-  ;; Time stamps with a null repeater are returned unchanged.\r\n-  (should\r\n-   (equal\r\n-    '(3 29 2012)\r\n-    (calendar-gregorian-from-absolute\r\n-     (org-closest-date \"<2012-03-29 +0d>\" \"<2014-03-04>\" nil))))\r\n-  ;; if PREFER is set to `past' always return a date before, or equal\r\n-  ;; to CURRENT.\r\n-  (should\r\n-   (equal\r\n-    '(3 1 2014)\r\n-    (calendar-gregorian-from-absolute\r\n-     (org-closest-date \"<2012-03-29 +1m>\" \"<2014-03-04>\" 'past))))\r\n-  (should\r\n-   (equal\r\n-    '(3 4 2014)\r\n-    (calendar-gregorian-from-absolute\r\n-     (org-closest-date \"<2012-03-04 +1m>\" \"<2014-03-04>\" 'past))))\r\n-  ;; if PREFER is set to `future' always return a date before, or equal\r\n-  ;; to CURRENT.\r\n-  (should\r\n-   (equal\r\n-    '(3 29 2014)\r\n-    (calendar-gregorian-from-absolute\r\n-     (org-closest-date \"<2012-03-29 +1m>\" \"<2014-03-04>\" 'future))))\r\n-  (should\r\n-   (equal\r\n-    '(3 4 2014)\r\n-    (calendar-gregorian-from-absolute\r\n-     (org-closest-date \"<2012-03-04 +1m>\" \"<2014-03-04>\" 'future))))\r\n-  ;; If PREFER is neither `past' nor `future', select closest date.\r\n-  (should\r\n-   (equal\r\n-    '(3 1 2014)\r\n-    (calendar-gregorian-from-absolute\r\n-     (org-closest-date \"<2012-03-29 +1m>\" \"<2014-03-04>\" nil))))\r\n-  (should\r\n-   (equal\r\n-    '(5 4 2014)\r\n-    (calendar-gregorian-from-absolute\r\n-     (org-closest-date \"<2012-03-04 +1m>\" \"<2014-04-28>\" nil))))\r\n-  ;; Test \"day\" repeater.\r\n-  (should\r\n-   (equal '(3 8 2014)\r\n-\t  (calendar-gregorian-from-absolute\r\n-\t   (org-closest-date \"<2014-03-04 +2d>\" \"<2014-03-09>\" 'past))))\r\n-  (should\r\n-   (equal '(3 10 2014)\r\n-\t  (calendar-gregorian-from-absolute\r\n-\t   (org-closest-date \"<2014-03-04 +2d>\" \"<2014-03-09>\" 'future))))\r\n-  ;; Test \"month\" repeater.\r\n-  (should\r\n-   (equal '(1 5 2015)\r\n-\t  (calendar-gregorian-from-absolute\r\n-\t   (org-closest-date \"<2014-03-05 +2m>\" \"<2015-02-04>\" 'past))))\r\n-  (should\r\n-   (equal '(3 29 2014)\r\n-\t  (calendar-gregorian-from-absolute\r\n-\t   (org-closest-date \"<2012-03-29 +2m>\" \"<2014-03-04>\" 'future))))\r\n-  ;; Test \"year\" repeater.\r\n-  (should\r\n-   (equal '(3 5 2014)\r\n-\t  (calendar-gregorian-from-absolute\r\n-\t   (org-closest-date \"<2014-03-05 +2y>\" \"<2015-02-04>\" 'past))))\r\n-  (should\r\n-   (equal '(3 29 2014)\r\n-\t  (calendar-gregorian-from-absolute\r\n-\t   (org-closest-date \"<2012-03-29 +2y>\" \"<2014-03-04>\" 'future)))))\r\n+  (cl-flet ((test-closest-date (input expected)\r\n+              (should (equal expected\r\n+                             (calendar-gregorian-from-absolute\r\n+                              (apply #'org-closest-date input))))))\r\n+    (test-closest-date '(\"<2012-03-29>\" \"<2014-03-04>\" nil)\r\n+                       '(3 29 2012))\r\n+    ;; Time stamps with a null repeater are returned unchanged.\r\n+    (test-closest-date '(\"<2012-03-29 +0d>\" \"<2014-03-04>\" nil)\r\n+                       '(3 29 2012))\r\n+    ;; if PREFER is set to `past' always return a date before, or equal\r\n+    ;; to CURRENT.\r\n+    (test-closest-date '(\"<2012-03-29 +1m>\" \"<2014-03-04>\" past)\r\n+                       '(3 1 2014))\r\n+    (test-closest-date '(\"<2012-03-04 +1m>\" \"<2014-03-04>\" past)\r\n+                       '(3 4 2014))\r\n+    ;; if PREFER is set to `future' always return a date before, or equal\r\n+    ;; to CURRENT.\r\n+    (test-closest-date '(\"<2012-03-29 +1m>\" \"<2014-03-04>\" future)\r\n+                       '(3 29 2014))\r\n+    (test-closest-date '(\"<2012-03-04 +1m>\" \"<2014-03-04>\" future)\r\n+                       '(3 4 2014))\r\n+    ;; If PREFER is neither `past' nor `future', select closest date.\r\n+    (test-closest-date '(\"<2012-03-29 +1m>\" \"<2014-03-04>\" nil)\r\n+                       '(3 1 2014))\r\n+    (test-closest-date '(\"<2012-03-04 +1m>\" \"<2014-04-28>\" nil)\r\n+                       '(5 4 2014))\r\n+    ;; Test \"day\" repeater.\r\n+    (test-closest-date '(\"<2014-03-04 +2d>\" \"<2014-03-09>\" past)\r\n+                       '(3 8 2014))\r\n+    (test-closest-date '(\"<2014-03-04 +2d>\" \"<2014-03-09>\" future)\r\n+                       '(3 10 2014))\r\n+    ;; Test \"month\" repeater.\r\n+    (test-closest-date '(\"<2014-03-05 +2m>\" \"<2015-02-04>\" past)\r\n+                       '(1 5 2015))\r\n+    (test-closest-date '(\"<2012-03-29 +2m>\" \"<2014-03-04>\" future)\r\n+                       '(3 29 2014))\r\n+    ;; Test \"year\" repeater.\r\n+    (test-closest-date '(\"<2014-03-05 +2y>\" \"<2015-02-04>\" past)\r\n+                       '(3 5 2014))\r\n+    (test-closest-date '(\"<2012-03-29 +2y>\" \"<2014-03-04>\" future)\r\n+                       '(3 29 2014))))\r\n \r\n (ert-deftest test-org\/deadline-close-p ()\r\n   \"Test `org-deadline-close-p' specifications.\"\r\n@@ -2752,46 +2669,29 @@ test-org\/in-archived-heading-p\r\n \r\n (ert-deftest test-org\/entry-blocked-p ()\r\n   ;; Check other dependencies.\r\n-  (should\r\n-   (org-test-with-temp-text \"* TODO Blocked\\n** DONE one\\n** TODO two\"\r\n-     (let ((org-enforce-todo-dependencies t)\r\n-\t   (org-blocker-hook\r\n-\t    '(org-block-todo-from-children-or-siblings-or-parent)))\r\n-       (org-entry-blocked-p))))\r\n-  (should-not\r\n-   (org-test-with-temp-text \"* TODO Blocked\\n** DONE one\\n** DONE two\"\r\n-     (let ((org-enforce-todo-dependencies t)\r\n-\t   (org-blocker-hook\r\n-\t    '(org-block-todo-from-children-or-siblings-or-parent)))\r\n-       (org-entry-blocked-p))))\r\n-  ;; Entry without a TODO keyword or with a DONE keyword cannot be\r\n-  ;; blocked.\r\n-  (should-not\r\n-   (org-test-with-temp-text \"* Blocked\\n** TODO one\"\r\n-     (let ((org-enforce-todo-dependencies t)\r\n-\t   (org-blocker-hook\r\n-\t    '(org-block-todo-from-children-or-siblings-or-parent)))\r\n-       (org-entry-blocked-p))))\r\n-  (should-not\r\n-   (org-test-with-temp-text \"* DONE Blocked\\n** TODO one\"\r\n-     (let ((org-enforce-todo-dependencies t)\r\n-\t   (org-blocker-hook\r\n-\t    '(org-block-todo-from-children-or-siblings-or-parent)))\r\n-       (org-entry-blocked-p))))\r\n-  ;; Follow :ORDERED: specifications.\r\n-  (should\r\n-   (org-test-with-temp-text\r\n-       \"* H\\n:PROPERTIES:\\n:ORDERED: t\\n:END:\\n** TODO one\\n** <point>TODO two\"\r\n-     (let ((org-enforce-todo-dependencies t)\r\n-\t   (org-blocker-hook\r\n-\t    '(org-block-todo-from-children-or-siblings-or-parent)))\r\n-       (org-entry-blocked-p))))\r\n-  (should-not\r\n-   (org-test-with-temp-text\r\n-       \"* H\\n:PROPERTIES:\\n:ORDERED: t\\n:END:\\n** <point>TODO one\\n** DONE two\"\r\n-     (let ((org-enforce-todo-dependencies t)\r\n-\t   (org-blocker-hook\r\n-\t    '(org-block-todo-from-children-or-siblings-or-parent)))\r\n+  (let ((org-enforce-todo-dependencies t))\r\n+    (should\r\n+     (org-test-with-temp-text \"* TODO Blocked\\n** DONE one\\n** TODO two\"\r\n+       (org-entry-blocked-p)))\r\n+    (should-not\r\n+     (org-test-with-temp-text \"* TODO Blocked\\n** DONE one\\n** DONE two\"\r\n+       (org-entry-blocked-p)))\r\n+    ;; Entry without a TODO keyword or with a DONE keyword cannot be\r\n+    ;; blocked.\r\n+    (should-not\r\n+     (org-test-with-temp-text \"* Blocked\\n** TODO one\"\r\n+       (org-entry-blocked-p)))\r\n+    (should-not\r\n+     (org-test-with-temp-text \"* DONE Blocked\\n** TODO one\"\r\n+       (org-entry-blocked-p)))\r\n+    ;; Follow :ORDERED: specifications.\r\n+    (should\r\n+     (org-test-with-temp-text\r\n+         \"* H\\n:PROPERTIES:\\n:ORDERED: t\\n:END:\\n** TODO one\\n** <point>TODO two\"\r\n+       (org-entry-blocked-p)))\r\n+    (should-not\r\n+     (org-test-with-temp-text\r\n+         \"* H\\n:PROPERTIES:\\n:ORDERED: t\\n:END:\\n** <point>TODO one\\n** DONE two\"\r\n        (org-entry-blocked-p)))))\r\n \r\n (ert-deftest test-org\/get-outline-path ()\r\n@@ -9171,21 +9071,18 @@ test-org\/org-todo-prefix\r\n   \"Test `org-todo' prefix arg behavior.\"\r\n   ;; FIXME: Add tests for all other allowed prefix arguments.\r\n   ;; -1 prefix arg should cancel repeater and mark DONE.\r\n-  (should\r\n-   (string-match-p\r\n-    \"DONE H\\\\(.*\\n\\\\)*<2012-03-29 Thu \\\\+0y>\"\r\n-    (let ((org-todo-keywords '((sequence \"TODO\" \"DONE\"))))\r\n-      (org-test-with-temp-text \"* TODO H\\n<2012-03-29 Thu +2y>\"\r\n-\t(org-todo -1)\r\n-\t(buffer-string)))))\r\n-  ;; - prefix arg should cancel repeater and mark DONE.\r\n-  (should\r\n-   (string-match-p\r\n-    \"DONE H\\\\(.*\\n\\\\)*<2012-03-29 Thu \\\\+0y>\"\r\n-    (let ((org-todo-keywords '((sequence \"TODO\" \"DONE\"))))\r\n-      (org-test-with-temp-text \"* TODO H\\n<2012-03-29 Thu +2y>\"\r\n-\t(org-todo '-)\r\n-\t(buffer-string)))))\r\n+  (cl-flet ((test-org-todo (input-text arg expected)\r\n+              (should\r\n+               (string-equal\r\n+                expected\r\n+                (let ((org-todo-keywords '((sequence \"TODO\" \"DONE\"))))\r\n+                  (org-test-with-temp-text input-text\r\n+                    (org-todo -1)\r\n+                    (buffer-string)))))))\r\n+    (test-org-todo \"* TODO H\\n<2012-03-29 Thu +2y>\" -1\r\n+                   \"* DONE H\\n<2012-03-29 Thu +0y>\")\r\n+    (test-org-todo \"* TODO H\\n<2012-03-29 Thu +2y>\" '-\r\n+                   \"* DONE H\\n<2012-03-29 Thu +0y>\"))\r\n   ;; C-u forces logging note.\r\n   ;; However, logging falls back to \"time\" when `org-inhibit-logging'\r\n   ;; is 'note.\r\n\r\nbase-commit: 1025e3b49a98f175b124dbccd774918360fe7e11\r\n-- \r\n2.52.0\r\n\r\n","subject":"Re: [PATCH] Improve test coverage of org.el"},{"date":"2026-03-02T06:25:41.308Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ecm2yck8.fsf@","message-id":"87ecm2yck8.fsf@","config":false,"refs-count":1,"username":"Bj\u00f6rn Kettunen","related-refs":["87ecm2yck8.fsf@"],"from":"bjorn.kettunen@thaodan.de","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Taking note from agena leaves window around with popup frames [9.8-pre (release_9.7.29-322-gccd0d1.dirty @ \/home\/bidar\/.local\/etc\/emacs\/lib\/org\/lisp\/)]"},{"date":"2026-03-01T19:56:58.165Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871pi3iasi.fsf@localhost","message-id":"871pi3iasi.fsf@localhost","config":false,"refs-count":23,"username":"Ihor Radchenko","references":["CAAWXJfc7GL30kSM3Wm6J0RKkNjJsJ3BEbe+FvjN6aTWGby4iFw@mail.gmail.com","87ms0tuhfc.fsf@localhost","CAAWXJfd2Yx1YYEO8LE8i30Xb3oOz1f3UQLCrscFZeWXuFsUYgQ@mail.gmail.com","877bs499uj.fsf@localhost","CAAWXJfduuOb-dvc2EfekTq-6tahz+JxpSBKvNw_je=huFXzrSA@mail.gmail.com"],"related-refs":["871pi3iasi.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] Pros and cons of using LLM for patches beyond simple copyright (was: [PATCH] ob: typed custom vars for org-babel-default-header-args (2 patches attached))"},{"date":"2026-02-21T20:34:46.989Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cy1xalan.fsf@localhost","message-id":"87cy1xalan.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","related-refs":["87cy1xalan.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nOrg 9.8, a major release, is out.\r\nOrg 9.8 will be a part of Emacs 31.\r\n\r\nYou can upgrade from GNU ELPA or install with M-x package-install RET org RET\r\n\r\nOrg 9.8 added a number of new features and customizations, all listed on\r\n<https:\/\/orgmode.org\/Changes.html>.\r\n\r\nIf you enjoy using Org, please consider supporting contributors via\r\n<https:\/\/liberapay.com\/org-mode\/>. Donations do help a lot and have\r\nbeen one of the important motivations for me personally.\r\n\r\n* Some highlights of user-facing additions\r\n\r\n- We have reworked the image preview system. Now, the\r\n  previews are asynchronous and can be implemented for any link types,\r\n  not just image file links. The custom link previews can be defined\r\n  using link parameters.\r\n\r\n  In addition, the old ~org-toggle-inline-images~ command is replaced\r\n  by ~org-link-preview~ that behaves closer to ~org-latex-preview~\r\n  command.\r\n\r\n  Thanks to Karthik Chikmagalur for contributing these features.\r\n  \r\n- Org mode now comes with built-in support for C# code blocks.\r\n  This is a completely new implementation that is using =.NET= SDK.\r\n  The old simplistic =ob-csharp.el= from =org-contrib= repository\r\n  is obsoleted by this new library.\r\n\r\n  Contributed by Maximilian Kueffner.\r\n\r\n- You can left-align, center, and right-align previewed links.\r\n  This has actually been added in Org 9.7, but not announced.\r\n\r\n  Contributed by Karthik Chikmagalur.\r\n\r\n- More flexible datetree entries for =org-capture=\r\n  You can now mix and match year, quarter, month, week, and day when\r\n  capturing datetrees.\r\n\r\n  Contributed by Jack Kamm.\r\n\r\n* Development updates\r\n\r\nI would like to welcome new maintainers of Org mode libraries:\r\n\r\n- Maximilian Kueffner is maintaining the new ob-csharp library\r\n- Ken Mankoff is maintaining ob-fortran\r\n- Rudolf Adamkovi\u010d is maintaining ox-texinfo\r\n\r\nAlso (just in case you missed earlier announcement), Ihor Radchenko (me)\r\nis maintaining Org mode as a whole :)\r\n\r\nI would also like to use this opportunity to ask interested people to\r\ntake the role of contributor stewards (see\r\n<https:\/\/orgmode.org\/worg\/org-maintenance.html#org073fcb4>). With the help\r\nfrom other volunteers, I (as a maintainer) can handle most of the\r\nreported bugs and patches. However, my current workload leaves me little\r\nfree time to work on Org mode internals and to implement new important\r\nfeatures. It would be great to have several people who can try to\r\nreproduce bugs and do initial feedback on the new patches. (We used to\r\nhave 2 contributor stewards, but they can no longer take this role). If\r\nyou are interested, please reply to this email or write directly to Org\r\nmailing list at emacs-orgmode@gnu.org.\r\n\r\nThis release was made possible thanks to many volunteer contributors:\r\n\r\nAbdurahman Itani, Aitenate, Al Haji-Ali, Anand Deopurkar,\r\nAndras Simonyi, Anoop G R, Arsen Arsenovi\u0107, Bastien Guerry,\r\nBen Siraphob, Benjamin McMillan, Bibek Panthi, Billy Lei, Bj\u00f6rn Bidar,\r\nCatsup4, Chris Perl, Christian Moe, Daanturo, Dan Milstein,\r\nDaniel M German, David Masterson, Derek Chen-Becker, Dominic Meiser,\r\nEarl Hyatt, Eli Zaretskii, Gr\u00e9goire Scano, Hugo Heagren, Ian Martins,\r\nIhor Radchenko, Ilya Chernyshov, Jack Kamm, Jacob S. Gordon,\r\nJarmo Hurri, Jens Lechtenb\u00f6rger, Jens Schmidt, John Wiegley,\r\nJules Tamagnan, Juri Linkov, Karl Eichwalder, Karthik Chikmagalur,\r\nKen Mankoff, Kenny Chen, Kyle Meyer, Lei Zhe, Leo Butler, Lockywolf,\r\nLukas Epple, Lukas Rudd Andersen, Marco Wahl, Mark A. Hershberger,\r\nMatthias Hetzenberger, Mattias Engdeg\u00e5rd, Max J. Herrmann,\r\nMax Nikulin, Maximilian Kueffner, Michael Brand, Michael Heerdegen,\r\nMomchil Ivanov, Morgan Smith, Morgan Willcock, Nafiz Islam,\r\nNate Nichols, Nick Dokos, Nikolaos Chatzikonstantinou, Owen Radcliffe,\r\nPaul Eggert, Pedro A. Aranda, Philip Kaludercic, Raffael Stocker,\r\nRalf, Rens Oliemans, Robert Pluim, Rodrigo Morales, Rohit Patnaik,\r\nRudolf Adamkovi\u010d, Sacha Chua, Sam, Sean Whitton, Shuo Shen,\r\nSlawomir Grochowski, Stefan Kangas, Stefan Monnier, Steven Allen,\r\nSuhail Singh, S\u00e9bastien Gendre, Thibaut Meyer, Thomas Ingram,\r\nTilmann Singer, Titus von der Malsburg, Trevor Murphy, Ulrich M\u00fcller,\r\nVisuwesh, William, Xi Lu, Xiaoduan Chang, Yue Yi, bruno, ndwarshuis,\r\nstardiviner.\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[ANN] Org mode 9.8 is out"},{"date":"2026-02-10T22:15:47.134Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CH3PR84MB3424E84B9F2B7252FE397885C562A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","message-id":"CH3PR84MB3424E84B9F2B7252FE397885C562A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","config":false,"refs-count":2,"username":"Morgan Smith","references":["878qgglqbv.fsf@localhost","820F0E20-4AB4-4437-9A73-0D5180EC02D6@gmail.com","874iqbzojs.fsf@localhost","878qk0lg5k.fsf@localhost","CH3PR84MB34243FB1BFCDBF5F39EC3016C5DDA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB342487A0383BD1628FD49A91C5C3A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"related-refs":["CH3PR84MB3424E84B9F2B7252FE397885C562A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","820F0E20-4AB4-4437-9A73-0D5180EC02D6@gmail.com","CH3PR84MB342487A0383BD1628FD49A91C5C3A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"from":"Morgan.J.Smith@outlook.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/CH3PR84MB3424E84B9F2B7252FE397885C562A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","source-id":"emacs-orgmode@gnu.org","patch-body":"From be6e3749954f3b6b6da7ca6c3b796dc5f8a11ca8 Mon Sep 17 00:00:00 2001\r\nFrom: Morgan Smith <Morgan.J.Smith@outlook.com>\r\nDate: Tue, 10 Feb 2026 16:37:40 -0500\r\nSubject: [PATCH 1\/3] lisp\/ox-latex.el (org-latex-make-preamble): Make Emacs 28\r\n compatible\r\n\r\nThe third argument to 'mapconcat' is not optional on Emacs 28.\r\n---\r\n lisp\/ox-latex.el | 3 ++-\r\n 1 file changed, 2 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/lisp\/ox-latex.el b\/lisp\/ox-latex.el\r\nindex 82828730b..d134b164f 100644\r\n--- a\/lisp\/ox-latex.el\r\n+++ b\/lisp\/ox-latex.el\r\n@@ -2033,7 +2033,8 @@ org-latex-make-preamble\r\n \t\t                 (if (not class-options) header\r\n \t\t                   (replace-regexp-in-string\r\n \t\t\t            \"^[ \\t]*\\\\\\\\documentclass\\\\(\\\\(\\\\[[^]]*\\\\]\\\\)?\\\\)\"\r\n-\t\t\t            class-options header t nil 1))))))\r\n+\t\t\t            class-options header t nil 1)))\r\n+                                nil)))\r\n \t      (user-error \"Unknown LaTeX class `%s'\" class))))\r\n     (org-latex-guess-polyglossia-language\r\n      (org-latex-guess-babel-language\r\n\r\nbase-commit: 008b16fc1cfd0f1efdb6314e19d5c8212c2bf3c0\r\n-- \r\n2.52.0\r\n\r\n","subject":"Re: [BUG] Not being able to sort deadline-up and scheduled-up in the same agenda-command [9.7.31 (9.7.31-??-4e6d38d @ \/Users\/jolofsson\/.config\/emacs\/.local\/straight\/build-29.4\/org\/)]"},{"date":"2026-02-08T19:54:40.498Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87v7g7qaex.fsf@localhost","message-id":"87v7g7qaex.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","related-refs":["87v7g7qaex.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] [WORG] https:\/\/orgmode.org\/worg\/exporters\/index.html is outdated [9.8-pre (release_9.7.39-685-g8da056 @ \/home\/yantar92\/.emacs.d\/straight\/build\/org\/)]"},{"date":"2026-02-08T11:07:45.367Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87343b1oky.fsf@localhost","message-id":"87343b1oky.fsf@localhost","config":false,"refs-count":8,"username":"Ihor Radchenko","related-refs":["87343b1oky.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] Rename :colnames header argument to :strip-colnames"},{"date":"2026-02-07T17:36:53.143Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cy2gwje2.fsf@mailbox.org","message-id":"87cy2gwje2.fsf@mailbox.org","config":false,"refs-count":8,"username":"Ignacio Casso","related-refs":["87h5rh3n55.fsf@mailbox.org","87cy2gwje2.fsf@mailbox.org","87ms1ikhkt.fsf@mailbox.org"],"from":"ignacio.casso@mailbox.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] [BUG] org-babel's cache doesn't work when block is evaluate indirectly [9.7.39 (release_9.7.39-1-gdf84ca @ \/home\/ignacio\/repos\/built-from-source\/org-mode\/lisp\/)]"},{"date":"2026-02-07T17:11:20.091Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87zf5kxyyn.fsf@christianmoe.com","message-id":"87zf5kxyyn.fsf@christianmoe.com","config":false,"refs-count":2,"username":"Christian Moe","references":["877bso4pfa.fsf@localhost","87y0l6yxs6.fsf@christianmoe.com"],"related-refs":["87zf5kxyyn.fsf@christianmoe.com"],"from":"mail@christianmoe.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87zf5kxyyn.fsf@christianmoe.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From ca611724a46766c21107a3469a32b889d2ba4f18 Mon Sep 17 00:00:00 2001\r\nFrom: Christian Moe <mail@christianmoe.com>\r\nDate: Sat, 7 Feb 2026 16:15:33 +0100\r\nSubject: [PATCH] org-odt-verse-block: Remove added leading spaces\r\n\r\n* lisp\/ox-odt.el (org-odt-verse-block): Remove newlines in ODT XML\r\nafter 'text:line-break' tags, because they add leading spaces.\r\n---\r\n lisp\/ox-odt.el | 9 ++++++---\r\n 1 file changed, 6 insertions(+), 3 deletions(-)\r\n\r\ndiff --git a\/lisp\/ox-odt.el b\/lisp\/ox-odt.el\r\nindex ccab1d280..d63888fa2 100644\r\n--- a\/lisp\/ox-odt.el\r\n+++ b\/lisp\/ox-odt.el\r\n@@ -3782,9 +3782,12 @@ contextual information.\"\r\n \t  (replace-regexp-in-string\r\n \t   ;; Replace leading tabs and spaces.\r\n \t   \"^[ \\t]+\" #'org-odt--encode-tabs-and-spaces\r\n-\t   ;; Add line breaks to each line of verse.\r\n-\t   (replace-regexp-in-string\r\n-\t    \"\\\\(<text:line-break\/>\\\\)?[ \\t]*$\" \"<text:line-break\/>\" contents))))\r\n+           (replace-regexp-in-string\r\n+            ;; Remove newlines after line breaks.\r\n+            \"<text:line-break\/>[\\n]\" \"<text:line-break\/>\"\r\n+\t    (replace-regexp-in-string\r\n+             ;; Add line breaks to each line of verse.\r\n+\t     \"\\\\(<text:line-break\/>\\\\)?[ \\t]*$\" \"<text:line-break\/>\" contents)))))\r\n \r\n \r\n \f\r\n-- \r\n2.43.0\r\n\r\n","subject":"Re: [BUG] Line breaks not preserved in verse blocks in ODT export [9.8-pre (release_9.7.39-670-g54aaaa @ \/home\/cm\/Code\/org-mode\/lisp\/)]"},{"date":"2026-02-04T19:57:41.983Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87jywsl1v6.fsf@localhost","message-id":"87jywsl1v6.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87qzrzc4b4.fsf@localhost"],"related-refs":["87jywsl1v6.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nHere are the last meeting notes.\r\n\r\nTL;DR: more whisper.el+org-capture; keyboard-driven browsers (glide);\r\nbrowsing web in Emacs and Org mode; captions for results of evaluation;\r\ntype-checking in Elisp; dynamic block for Google Docs; live code\r\nreview for LaTeX preview branch.\r\n\r\n- We started a bit late. That is - I came late. Others were hanging\r\n  out in the chat meanwhile.\r\n- Sacha shared her new setup to capture new notes by voice,\r\n  automatically, in the background, upon a single key press\r\n  - The idea is to press start key, start talking, press stop key, and\r\n    the recording is automatically captured as an Org task\/note\r\n  - She went even further, and made it so that the recording text is saved\r\n    to currently clocked in task, alongside with link to context where the\r\n    voice recording happens\r\n  - Moreover, when she says \"computer, remind me to\", the recording\r\n    text is saved as a task\r\n  - https:\/\/sachachua.com\/blog\/2026\/01\/using-whisper-el-to-capture-text-to-speech-in-emacs\/\r\n  - She simply uses default medium English model + CPU (GPU would be even faster)\r\n  - She showed her setup in action\r\n\r\n- I then finally posted what I usually post at the very beginning (when I am not late)\r\n  https:\/\/sachachua.com\/blog\/2026\/01\/2026-01-12-emacs-news\/\r\n  \r\n- Sacha also played around with Pipewire (Chrome feature). This is a speech recognition\r\n  built into Chrome browser API\r\n  - This API is not specific to Chrome: https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/SpeechRecognition\r\n  - Note that it requires connecting to Google (or other) server\r\n    (for free, so they likely get money from your data)\r\n    - Although Sacha later mentioned that \"Chrome 139 allow on-device-only recognition\"\r\n\r\n- Sacha announced during the meetup that she plans to play around with\r\n  queuing whisper results\r\n  - Ihor from future [2026-01-29 Thu], here is what she got\r\n    https:\/\/sachachua.com\/blog\/2026\/01\/queue-multiple-transcriptions-with-whisper-el-speech-recognition\/\r\n\r\n- Zororg shared a new keyboard-driven browser; this time, based on Firefox\r\n  It also has M-x-like commands.\r\n  - https:\/\/github.com\/glide-browser\/glide\/discussions\/25 (the link is to Emacs keybinding config)\r\n  - There are also https:\/\/github.com\/qutebrowser\/qutebrowser (chromium-based) and\r\n    https:\/\/github.com\/atlas-engineer\/nyxt (webkit\/webengine)\r\n    - Zororg commented that nyxt is not maintained - not the main browser\r\n      but attempted rewrite on electron (I'd say no electron is good\r\n      news - main branch has commits just 2 months ago).\r\n  - I personally use eww and extras to view everything in Emacs more and more\r\n    - The key to comfortable browsing with eww is enabling readable mode by default\r\n      : (setq eww-readable-urls '(\".+\"))\r\n    - Many website work just fine like that. Even some (although not\r\n      all) JS-heavy websites often do not really need all that JS\r\n      boilerplate to read what I want\r\n    - And I use emacs UI for mastodon, reddit, and (experimental) with github\r\n      - https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#reddit-client-reddiggel\r\n\t- There is also https:\/\/github.com\/thanhvg\/emacs-hnreader to read Hacker News in Emacs\r\n      - https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#mastodon-client-mastodonel\r\n      - https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#github-client-consult-gh\r\n    - And good old yt-dlp + mpv for youtube\r\n\r\n- yaca asked about adding caption to results of code evaluation on export\r\n  #+name: test\r\n  #+begin_src emacs-lisp :results value table\r\n    '((\"a\" \"b\" \"c\") hline (\"1\" \"2\" \"3\"))\r\n  #+end_src\r\n\r\n  # #+results: test should mirror code block #+name\r\n  # #+caption to be added manually, but will be retained after updating the results\r\n  #+RESULTS: test\r\n  #+caption: caption here\r\n  | a | b | c |\r\n  |---+---+---|\r\n  | 1 | 2 | 3 |\r\n\r\n- As a side, off-topic, note, zor mentioned that\r\n  we may eventually get multi-LSP support for eglot\r\n  - https:\/\/github.com\/joaotavora\/rassumfrassum (this is by the author of eglot)\r\n\r\n- Morgan asked why Elisp does not do much type checking\r\n  - The answer is mostly simple - Elisp is not statically typed language, so, naturally,\r\n    type checking is so widespread\r\n  - Moreover, it is a common pattern to allow values to have multiple\r\n    types (t\/nil, number, string, etc) with different meaning\r\n  - That said, all the Elisp primitives always do type-checking to avoid\r\n    low-level crashes\r\n  - Does it make things easier to debug? No. But that's an eternal argument\r\n    against dynamically typed languages. There are also pros of that.\r\n    That's a rather beaten programming topic.\r\n\r\n- I have been recently experimenting with Google Docs integration\r\n  (which I have to do for work)\r\n  - I wrote a dumb dynamic block that uses Google Docs API to download\r\n    Google Docs document, transform it into plain text, and insert right into\r\n    Org buffer\r\n  - https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#dynamic-block-to-retrieve-google-docs-contents-in-org-format\r\n    - It is not robust, but a good starting point for hacking, is someone is interested in this topic\r\n\r\n- Karthink then shared his screen, and we dived deep into Elisp code,\r\n  for over an hour, doing code review for his latex preview branch live\r\n  - It was rather technical as we dived into ob-latex and possible regressions\r\n    related to the new latex preview API, sometimes drifting too far away and\r\n    discussing cool features that would be nice to implement if karthik had more\r\n    time to work on the branch, but trying to keep the general course and not\r\n    sink into even more feature creep than what the branch (and Org) already has\r\n    - One example is our discussion about the design of asynchronous command queue\r\n      that the preview branch implements (and probably bike sheds), where I recalled\r\n      something similar being presented back in one of the EmacsConf talks several\r\n      years ago. We spend a bunch of time trying to find it, failed,\r\n      and then concluded that we are not going to use that anyway in\r\n      practice, and went back to actually discussing useful things to\r\n      change in the code\r\n      - One thing I thought it is was https:\/\/codeberg.org\/emacs-weirdware\/debase, but it was just a D-bus Elisp library, not job manager\r\n  - along the way, karthink shared https:\/\/github.com\/gggion\/visual-shorthands.el\r\n    that he uses\r\n\r\n:chat:\r\n[17:00] [yaca : VIEWER]: hello\r\n[17:00] [Sacha Chua : VIEWER]: Hello hello! =)\r\n[17:00] [Morgan : VIEWER]: Hello \ud83d\ude0a\r\n[17:01] [Jake : VIEWER]: Hello!\r\n[17:01] [Rudy : VIEWER]: Howdy, folks!\r\n[17:04] [Sacha Chua : VIEWER]: I figured out how to use natrys\/whisper to capture dictated notes to my currently-clocked-in org task =)\r\n[17:11] [yaca : VIEWER]: I need help dealing with tables generated from R source code in latex export\r\n[17:13] [Morgan : VIEWER]: I might be able to help\r\n[17:13] [Morgan : VIEWER]: what is the issue?\r\n[17:14] [yaca : VIEWER]: I need to give the resulting tables a label to be able to reference it on text\r\n[17:15] [Morgan : VIEWER]: I don't know the answer to that off hand but I can take a look\r\n[17:18] [yaca : VIEWER]: can I share my screen maybe?\r\n[17:18] yantar92 is now the presenter\r\n[17:19] [Sacha Chua : VIEWER]: ah good yantar92 is here, I was just about to dig up the modcode\r\n[17:19] [yaca : VIEWER]: sound is stuttering for me\r\n[17:19] [Sacha Chua : VIEWER]: Audio is choppy for me too\r\n[17:20] [Sacha Chua : VIEWER]: (CPU is fine on the server, probably memory is fine too)\r\n[17:20] [Christian Moe : VIEWER]: You're fine, Sacha\r\n[17:20] [Morgan : VIEWER]: Everything sounds good to me\r\n[17:21] [Sacha Chua : VIEWER]: Yes, sound is much better\r\n[17:22] [Sacha Chua : VIEWER]: yaca had an Org Babel and LaTeX export question\r\n[17:22] [Sacha Chua : VIEWER]: (probably already tried #+NAME:  before the source block?)\r\n[17:25] Sacha Chua is now the presenter, set by yantar92\r\n[17:27] [Sacha Chua : VIEWER]: https:\/\/sachachua.com\/blog\/2026\/01\/using-whisper-el-to-capture-text-to-speech-in-emacs\/\r\n[17:27] [yantar92 : MODERATOR]: https:\/\/sachachua.com\/blog\/2026\/01\/using-whisper-el-to-capture-text-to-speech-in-emacs\/\r\n[17:30] [karthink : VIEWER]: Sacha, which whisper model are you using?\r\n[17:31] [yantar92 : MODERATOR]: And Emacs news: https:\/\/sachachua.com\/blog\/2026\/01\/2026-01-12-emacs-news\/ (just in case)\r\n[17:32] [yaca : VIEWER]: yes i tried with no success\r\n[17:32] [karthink : VIEWER]: Thanks Sacha\r\n[17:32] [Sacha Chua : VIEWER]: Kiddo is out for lunch now, so I gotta go, thanks for letting me squeeze that in!\r\n[17:33] [Sacha Chua : VIEWER]: ooh also you can use Pipewire to direct other output streams into the Chrome that's doing the streaming speech recognition\r\n[17:33] [karthink : VIEWER]: Is it running locally in Chrome?\r\n[17:33] [karthink : VIEWER]: It looked like a localhost URL\r\n[17:33] [Sacha Chua : VIEWER]: looks like it uses an online service though https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/SpeechRecognition\r\n[17:34] yantar92 is now the presenter, set by yantar92\r\n[17:34] [Sacha Chua : VIEWER]: someday I might have a computer powerful enough to do fully local streaming speech recognition, but for now the whisper.el way of using whisper.cpp works for the offline stuff\r\n[17:35] [Sacha Chua : VIEWER]: sorry, what was that?\r\n[17:35] [karthink : VIEWER]: Does whisper have a real-time mode?\r\n[17:35] [Sacha Chua : VIEWER]: ah I haven't gotten my GPU set up on my Lenovo P52 and it's probably a potato GPU anyway\r\n[17:35] [karthink : VIEWER]: It doesn't work well because because of hardware requirements or is the model not good at it?\r\n[17:36] [Sacha Chua : VIEWER]: I tried SimulStreaming for the local streaming thing, but wasn't happy with base or medium\r\n[17:36] [karthink : VIEWER]: I can run whisper (at least the base model) with very little lag on my ~2019 integrated AMD GPU\r\n[17:37] [Sacha Chua : VIEWER]: My next step is probably to figure out how to get whisper.el to handle queuing so I can  queue intermediate results, since whisper-type recognition has a hard type with streaming because it wants 30-second context windows or something like that.\r\n[17:37] [Sacha Chua : VIEWER]: anyway, saving to clocked task is surprisingly awesome for quickly thinking out loud with links to whatever you're thinking about\r\n[17:37] [Zororg : VIEWER]: If you guys still use Firefox, you must try glide: https:\/\/github.com\/glide-browser\/glide\r\n[17:37] [Sacha Chua : VIEWER]: okay now I'm really out\r\n[17:38] [Zororg : VIEWER]: Its a soft fork, that add lots of configuring options and API\r\n[17:38] [yaca : VIEWER]: yup\r\n[17:38] [Zororg : VIEWER]: I added Emacs keybinding config as much a i can: https:\/\/github.com\/glide-browser\/glide\/discussions\/25\r\n[17:39] [Morgan : VIEWER]: for yaca\r\n\r\nthe relevent documentation:\r\n\r\n[[info:org#Exporting Code Blocks]]\r\n\r\nsnippet from that info page:\r\n\r\nResults of evaluation of a named block can also be explicitly named\r\nusing a separate \u2018NAME\u2019 keyword.  The name value set via \u2018NAME\u2019 keyword\r\nwill be preferred over the parent source block.\r\n\r\n#+NAME: code name\r\n#+BEGIN_SRC emacs-lisp :exports both value\r\n(+ 1 2)\r\n#+END_SRC\r\n\r\n#+NAME: results name\r\n#+RESULTS: code name\r\n3\r\n\r\nThis [[code name][link]] will point to the code block.\r\nAnother [[results name][link]] will point to the results.\r\n\r\n[17:40] [yaca : VIEWER]: I also want to add a caption, i have an example prepared\r\n[17:40] yaca is now the presenter, set by yantar92\r\n[17:44] yantar92 is now the presenter, set by yantar92\r\n[17:44] [yaca : VIEWER]: thank you very much\r\n[17:47] [Rudy : VIEWER]: This is similar to LibreWolf, which I use.\r\n[17:47] [Zororg : VIEWER]: But you can config all keymaps\r\n[17:47] [M. Page-Lieberman : VIEWER]: Nice! https:\/\/www.redbubble.com\/i\/t-shirt\/M-x-solves-everything-Emacs-by-themkat\/95142088.NL9AC\r\n[17:47] [Zororg : VIEWER]: And build M-x like commands\r\n[17:49] [Morgan : VIEWER]: https:\/\/nyxt-browser.com\/\r\n[17:49] [Zororg : VIEWER]: Not maintained anymore\r\n[17:50] [Morgan : VIEWER]: I never figured out how to use it.  Tried a couple times\r\n[17:50] [Zororg : VIEWER]: 4.0 was supposedly rewrite on electron, but its stall\r\n[17:51] [Morgan : VIEWER]: all the time\r\n[17:51] [M. Page-Lieberman : VIEWER]: Why would they want to rewrite it in Electron rather than Chromium? Electron is the Chromium backend for local apps, no?\r\n[17:51] [Rudy : VIEWER]: Any news on the new LaTeX export\/subsystem? \ud83d\ude0a\r\n[17:52] [M. Page-Lieberman : VIEWER]: I use w3m\r\n[17:53] [Morgan : VIEWER]: I also thought it was one way \ud83d\ude1c\r\n[17:53] [M. Page-Lieberman : VIEWER]: That is not vanilla eww, right?\r\n[17:54] [M. Page-Lieberman : VIEWER]: Wow. I'll have to give eww another try then.\r\n[17:54] [Zororg : VIEWER]: How are you going from agenda item -> reddig post?\r\n[17:55] [yantar92 : MODERATOR]: (add-to-list 'browse-url-handlers\r\n                 '(\"^https?:\/\/\\\\(www\\\\.\\\\)?\\\\(?:old\\\\.\\\\)?reddit\\\\.com\"\r\n                   . yant\/browse-url-reddit))\r\n[17:56] [Zororg : VIEWER]: Cool. Even same author has package for hackernews comments, stack exchange as well\r\n[17:58] [yantar92 : MODERATOR]: https:\/\/github.com\/thanhvg\/emacs-hnreader\r\n[18:01] [yantar92 : MODERATOR]: https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#automatically-redirect-from-eww-to-mastodonel\r\n[18:02] [Rudy : VIEWER]: Yes!\r\n[18:02] [Rudy : VIEWER]: \ud83d\ude0a\r\n[18:05] [zor : VIEWER]: In case anyone does not know, eglot author is writing a client to connect multi Lsp : https:\/\/github.com\/joaotavora\/rassumfrassum\r\n[18:08] [Morgan : VIEWER]: unrelated question: why don't we do more type checking?\r\n\r\nThe entire Emacs repository only has 140 hits for `cl-check-type' and 36 for\r\n`cl-the'.\r\n\r\nI seem to hit type problems often and wonder if more liberal use of these\r\nwouldn't make the code more robust and easier to debug?\r\n[18:11] [Morgan : VIEWER]: that makes sense\r\n[18:14] karthink is now the presenter, set by yantar92\r\n[18:29] [Jacob S. Gordon : VIEWER]: Minor point: doc strings unfortunately don\u2019t respect \u2018read-symbol-shorthands\u2019, so I think you need to spell out abbreviated references\r\n[18:29] [Jacob S. Gordon : VIEWER]: Sorry didn't catch that Ihor!\r\n[18:30] [Jacob S. Gordon : VIEWER]: Oh very cool, didn't know about either\r\n[18:30] [yantar92 : MODERATOR]: visual-shorthand-mode\r\n[18:31] [yantar92 : MODERATOR]: https:\/\/github.com\/gggion\/visual-shorthands.el\r\n[18:53] [M. Page-Lieberman : VIEWER]: I have to to. Happy new year and peace to all. Bless!\r\n[18:53] [Rudy : VIEWER]: Looking at all this code ... made me hungry.\r\n[18:54] [oylenshpeegul : VIEWER]: Yes, it's lunchtime here! \ud83d\ude0a\r\n[18:57] [Rudy : VIEWER]: Few things in life make me feel more stupid than hearing Yantar92 talking to Karthink.\r\n[19:01] [Sacha Chua : VIEWER]: Hahaha\r\n[19:01] [Sacha Chua : VIEWER]: I'm so glad the text makes it easy to skim\r\n[19:03] [yantar92 : MODERATOR]: https:\/\/codeberg.org\/emacs-weirdware\/debase\r\n[19:04] [Sacha Chua : VIEWER]: John Wiegley and async, maybe?\r\n[19:05] [karthink : VIEWER]: el-job\r\n[19:06] [Sacha Chua : VIEWER]: https:\/\/emacsconf.org\/talks\/ only mentions lsp-bridge as the other thing with async in its title\r\n[19:07] [Sacha Chua : VIEWER]: Oh, just as a follow-up, Chrome 139 allow on-device-only recognition\r\n[19:08] [Sacha Chua : VIEWER]: with .processLocally and downloading the language\r\n[19:09] [Sacha Chua : VIEWER]: I'm off to the library, thanks for working on all this cool stuff!\r\n[19:41] [karthink : VIEWER]: #+begin_src latex :results file :file \/tmp\/test.pdf\r\n\\[ \\int_0^1 x^2 \\mathrm{d}x \\]\r\n#+end_src\r\n\r\n[19:53] [Rudy : VIEWER]: Here.\r\n[19:53] [Rudy : VIEWER]: Two Xmas later, still here!\r\n[19:54] [Jacob S. Gordon : VIEWER]: I'm looking forward to it too! (also curious about the changes, seems like a huge job)\r\n[19:54] [Rudy : VIEWER]: So, Org 10 released this month? \ud83d\ude0a\r\n[19:54] [Jacob S. Gordon : VIEWER]: nope!\r\n[19:57] [Rudy : VIEWER]: Thank you everyone.\r\n[19:57] [Rudy : VIEWER]: Lovely session!\r\n[19:57] [Jacob S. Gordon : VIEWER]: Thanks!\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[BLOG] #26 bbb:OrgMeetup on Wed, January 14, 19:00 UTC+3"},{"date":"2026-01-29T18:56:07.475Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/861pjc0xin.fsf@DESKTOP-36R1VQU.mail-host-address-is-not-set","message-id":"861pjc0xin.fsf@DESKTOP-36R1VQU.mail-host-address-is-not-set","config":false,"refs-count":1,"username":"Chuck Yurek","related-refs":["861pjc0xin.fsf@DESKTOP-36R1VQU.mail-host-address-is-not-set"],"from":"cyurek@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] changing day on next [9.7.39 (9.7.39-b7bc0ed @ c:\/Users\/chuck\/AppData\/Roaming\/.emacs.d\/elpa\/org-9.7.39\/)]"},{"date":"2026-01-26T21:18:31.310Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2bjigcbyl.fsf@adamkovic.org","message-id":"m2bjigcbyl.fsf@adamkovic.org","config":false,"refs-count":2,"username":"Rudolf Adamkovi\u010d","references":["555CB3EE-8221-4BBA-BB7B-D744242098C0@gmail.com","m2zfasnqay.fsf@adamkovic.org","87ike1fw2s.fsf@localhost","37FB4812-2C2B-4E03-901D-98B7D22830E6@gmail.com","87o6mlo6rd.fsf@localhost"],"related-refs":["m2bjigcbyl.fsf@adamkovic.org"],"from":"rudolf@adamkovic.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/m2bjigcbyl.fsf@adamkovic.org","source-id":"emacs-orgmode@gnu.org","patch-body":"From 2890f464c60a6bfaee77240048880248fb147b0c Mon Sep 17 00:00:00 2001\r\nFrom: Ben Siraphob <bensiraphob@gmail.com>\r\nDate: Sat, 13 Sep 2025 18:26:09 +0700\r\nSubject: [PATCH] doc\/org-manual.org: Fix typos and improve readability\r\nMIME-Version: 1.0\r\nContent-Type: text\/plain; charset=UTF-8\r\nContent-Transfer-Encoding: 8bit\r\n\r\nCo-authored-by: Rudolf Adamkovi\u010d rudolf@adamkovic.org\r\nLink: https:\/\/orgmode.org\/list\/555CB3EE-8221-4BBA-BB7B-D744242098C0@gmail.com\r\n---\r\n doc\/org-manual.org | 326 +++++++++++++++++++++++----------------------\r\n 1 file changed, 164 insertions(+), 162 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 7e9756d09..3bde7855c 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -30,7 +30,7 @@ ** Summary\r\n provides exporting facilities.  Org files can also be used for literate\r\n programming and reproducible research.  As a TODO lists manager, Org\r\n helps you organize your tasks in a flexible way, from daily needs to\r\n-detailed project-planning, allowing logging, multiple views on your\r\n+detailed project planning, allowing logging, multiple views of your\r\n tasks, exporting your agendas, etc.\r\n \r\n Org mode is implemented on top of Outline mode, which makes it\r\n@@ -42,13 +42,13 @@ ** Summary\r\n \r\n Org develops organizational tasks around notes files that contain\r\n lists or information about projects as plain text.  Project planning\r\n-and task management make use of metadata which is part of an outline\r\n+and task management make use of metadata, which is part of an outline\r\n node.  Based on this data, specific entries can be extracted in\r\n-queries and create dynamic \/agenda views\/ that also integrate the Emacs\r\n+queries to create dynamic \/agenda views\/ that also integrate the Emacs\r\n calendar and diary.  Org can be used to implement many different\r\n project planning schemes, such as David Allen's GTD system.\r\n \r\n-Org files can serve as a single source authoring system with export to\r\n+Org files can serve as a single-source authoring system with export to\r\n many different formats such as HTML, LaTeX, Open Document, and\r\n Markdown.  New export backends can be derived from existing ones, or\r\n defined from scratch.\r\n@@ -60,7 +60,7 @@ ** Summary\r\n possible to create a single file reproducible research compendium.\r\n \r\n Org keeps simple things simple.  When first fired up, it should feel\r\n-like a straightforward, easy to use outliner.  Complexity is not\r\n+like a straightforward, easy-to-use outliner.  Complexity is not\r\n imposed, but a large amount of functionality is available when needed.\r\n Org is a toolbox.  Many users actually run only a---very\r\n personal---fraction of Org's capabilities, and know that there is more\r\n@@ -79,7 +79,8 @@ ** Summary\r\n \r\n #+cindex: print edition\r\n An earlier version (7.3) of this manual was available as a paperback\r\n-book from the Network Theory Ltd. publishing company, closed in 2009.\r\n+book from the Network Theory Ltd. publishing company, which closed\r\n+in 2009.\r\n \r\n ** Installation\r\n :PROPERTIES:\r\n@@ -87,13 +88,13 @@ ** Installation\r\n :END:\r\n #+cindex: installation\r\n \r\n-Org is included in distributions of GNU Emacs, you probably do not\r\n+Org is included in distributions of GNU Emacs, so you probably do not\r\n need to install it.  Most users will simply activate Org and begin\r\n exploring its features.\r\n \r\n-If, for one reason or another, you want to install Org on top of this\r\n+If, for one reason or another, you want to install Org on top of the\r\n pre-packaged version, you can use the Emacs package system or clone\r\n-Org's git repository.  We *strongly recommend* sticking to a single\r\n+Org's Git repository.  We *strongly recommend* sticking to a single\r\n installation method.\r\n \r\n When installing Org on top of the pre-packaged version, please note\r\n@@ -116,19 +117,19 @@ *** Using Emacs packaging system\r\n #+attr_texinfo: :tag Important\r\n #+begin_quote\r\n You need to do this in a session where no =.org= file has been\r\n-visited, i.e., where no Org built-in function have been loaded.\r\n-Otherwise, autoload Org functions will mess up the installation.\r\n+visited, i.e., where no Org built-in functions have been loaded.\r\n+Otherwise, autoloaded Org functions will mess up the installation.\r\n #+end_quote\r\n \r\n-To avoid interference with built-in Org mode, you can use command line\r\n-(you need Emacs 30 or later):\r\n+To avoid interference with the built-in Org mode, you can use the\r\n+command line (you need Emacs 30 or later):\r\n \r\n #+begin_src sh\r\n emacs -Q -batch -eval \"(progn (require 'package) (package-initialize) (package-refresh-contents) (package-upgrade 'org))\"\r\n #+end_src\r\n \r\n This approach has the advantage of isolating the upgrade process from\r\n-a running Emacs session, ensuring that version conflicts can not\r\n+a running Emacs session, ensuring that version conflicts cannot\r\n arise.\r\n \r\n *** Using Org's git repository\r\n@@ -170,14 +171,15 @@ *** Installing Org's contributed packages\r\n :UNNUMBERED: notoc\r\n :END:\r\n \r\n-Org's repository used to contain =contrib\/= directory for add-ons\r\n+Org's repository used to contain the =contrib\/= directory for add-ons\r\n contributed by others.  As of Org 9.5, the directory has been moved to\r\n the dedicated org-contrib [[https:\/\/git.sr.ht\/~bzg\/org-contrib][repository]], which you can install\r\n separately as a [[https:\/\/elpa.nongnu.org\/nongnu\/org-contrib.html][package]] from NonGNU ELPA.\r\n \r\n-There are enough valuable packages maintained outside the Org repository.\r\n-Worg has a list of [[https:\/\/orgmode.org\/worg\/org-contrib\/index.html][org-contrib and external packages]], certainly it is not\r\n-exhaustive.\r\n+There are many valuable packages maintained outside the Org\r\n+repository.  Worg has a list of\r\n+[[https:\/\/orgmode.org\/worg\/org-contrib\/index.html][org-contrib and\r\n+external packages]]; it is certainly not exhaustive.\r\n \r\n ** Activation\r\n :PROPERTIES:\r\n@@ -190,8 +192,8 @@ ** Activation\r\n #+cindex: key bindings, global\r\n \r\n Org mode buffers need Font Lock to be turned on: this is the default\r\n-in Emacs[fn:: If you do not use Font Lock globally turn it on in Org\r\n-buffer with =(add-hook 'org-mode-hook #'turn-on-font-lock)=.].\r\n+in Emacs[fn:: If you do not use Font Lock globally, turn it on in an\r\n+Org buffer with =(add-hook 'org-mode-hook #'turn-on-font-lock)=.].\r\n \r\n There are compatibility issues between Org mode and some other Elisp\r\n packages (see [[*Packages that conflict with Org mode]]).  Please take the\r\n@@ -250,13 +252,13 @@ ** Feedback\r\n [[mailto:emacs-orgmode@gnu.org]].  You can subscribe to the list\r\n [[https:\/\/lists.gnu.org\/mailman\/listinfo\/emacs-orgmode][from this web\r\n page]].  If you are not a member of the mailing list, your mail will\r\n-be passed to the list after a moderator has approved it[fn:: Please\r\n+be passed to the list after a moderator approves it[fn:: Please\r\n consider subscribing to the mailing list in order to minimize the work\r\n the mailing list moderators have to do.].  We ask you to read and\r\n respect the\r\n [[https:\/\/www.gnu.org\/philosophy\/kind-communication.html][GNU Kind\r\n Communications Guidelines]] when sending messages on this mailing\r\n-list.  Please allow up to one month for the response and follow up if\r\n+list.  Please allow up to one month for a response and follow up if\r\n no response is received on the bug report.\r\n \r\n #+findex: org-version\r\n@@ -267,22 +269,22 @@ ** Feedback\r\n persists, prepare a report and provide as much information as\r\n possible, including the version information of Emacs ({{{kbd(M-x\r\n emacs-version)}}}) and Org ({{{kbd(M-x org-version)}}}), as well as\r\n-the Org related setup in the Emacs init file.  The easiest way to do\r\n+the Org-related setup in the Emacs init file.  The easiest way to do\r\n this is to use the command\r\n \r\n : M-x org-submit-bug-report <RET>\r\n \r\n #+texinfo: @noindent\r\n which puts all this information into an Emacs mail buffer so that you\r\n-only need to add your description.  If you are not sending the Email\r\n-from within Emacs, please copy and paste the content into your Email\r\n+only need to add your description.  If you are not sending the email\r\n+from within Emacs, please copy and paste the content into your email\r\n program.\r\n \r\n Sometimes you might face a problem due to an error in your Emacs or\r\n Org mode setup.  Before reporting a bug, it is very helpful to start\r\n-Emacs with minimal customizations and reproduce the problem.  Doing so\r\n-often helps you determine if the problem is with your customization or\r\n-with Org mode itself.  You can start a typical minimal session with\r\n+Emacs with minimal customizations and to reproduce the problem.  Doing\r\n+so often helps you determine if the problem is with your customization\r\n+or with Org mode itself.  You can start a typical minimal session with\r\n a command like the example below.\r\n \r\n : $ emacs -Q -l \/path\/to\/minimal-org.el\r\n@@ -304,8 +306,8 @@ ** Feedback\r\n (add-to-list 'load-path (expand-file-name \"\/path\/to\/org-mode\/lisp\"))\r\n #+end_src\r\n \r\n-If you are using Org mode version from Git repository, you can start\r\n-minimal session using make.\r\n+If you are using Org mode version from the Git repository, you can\r\n+start a minimal session using =make=.\r\n \r\n : # Bare Emacs\r\n : make repro\r\n@@ -327,7 +329,7 @@ ** Feedback\r\n #+cindex: laggy\r\n #+cindex: not responsive\r\n If you experience degraded performance, you can record a \"profile\" and\r\n-share it on the Org mailing list.  See below for the instructions how\r\n+share it on the Org mailing list.  See below for instructions on how\r\n to record a useful profile.\r\n \r\n Thank you for helping to improve this program.\r\n@@ -372,14 +374,14 @@ *** How to profile Org performance\r\n :END:\r\n \r\n #+cindex: profiler\r\n-Sometimes, Org is becoming slow for no apparent reason.  Such slowdown\r\n+Sometimes, Org becomes slow for no apparent reason.  Such slowdown\r\n is often caused by interaction between third-party packages and Org\r\n mode.  However, identifying the root cause is not always straightforward.\r\n \r\n Emacs is able to record performance statistics, which can then be used\r\n-to find out which functions are taking most of the time to execute.\r\n-To record the statistics, one can use so-called profiler.  To use the\r\n-Emacs profiler, we recommend the following steps:\r\n+to find out which functions are taking the most time to execute.  To\r\n+record the statistics, one can use a profiler.  To use the Emacs\r\n+profiler, we recommend the following steps:\r\n \r\n 1. Make sure that no profiler is currently active:\r\n \r\n@@ -397,17 +399,17 @@ *** How to profile Org performance\r\n \r\n    This command will display a summary of the commands and functions\r\n    that have been executed between ~profiler-start~ and\r\n-   ~profiler-report~ invocations, with command taking most of the time\r\n-   displayed on top.\r\n+   ~profiler-report~ invocations, with the command taking the most\r\n+   time displayed on top.\r\n \r\n    =<TAB>= key can be used to fold and unfold lines in the profiler\r\n    buffer.  The child items revealed upon unfolding are the functions\r\n    and commands called by the unfolded parent.\r\n \r\n-   The root causes are often buried deep inside sub-children items in\r\n+   The root causes are often buried deep inside child items in\r\n    the profiler.  You can press =B= (~profiler-report-render-reversed-calltree~)\r\n-   to quickly reveal the actual function\/command that takes most of\r\n-   the time to run.\r\n+   to quickly reveal the actual function\/command that takes the most\r\n+   time to run.\r\n \r\n    Pressing =C= ~profiler-report-render-calltree~ will recover the\r\n    original view.\r\n@@ -420,8 +422,8 @@ *** How to profile Org performance\r\n    : \/path\/to\/profile-file-to-be-saved <RET>\r\n \r\n    Then, you can attach the saved file to your email to the Org\r\n-   mailing list, alongside with details about what you did to trigger\r\n-   the slowdown.\r\n+   mailing list, along with details about what you did to trigger the\r\n+   slowdown.\r\n \r\n    Note that the saved statistics will only contain the function names\r\n    and how long their execution takes.  No private data will be\r\n@@ -470,7 +472,7 @@ *** Key bindings and commands\r\n :END:\r\n \r\n The manual lists both the keys and the corresponding commands for\r\n-accessing a functionality.  Org mode often uses the same key for\r\n+accessing functionality.  Org mode often uses the same key for\r\n different functions, depending on context.  The command that is bound\r\n to such keys has a generic name, like ~org-metaright~.  In the manual\r\n we will, wherever possible, give the function that is internally\r\n@@ -492,8 +494,8 @@ * Document Structure\r\n is achieved by folding, i.e., hiding large parts of the document to\r\n show only the general document structure and the parts currently being\r\n worked on.  Org greatly simplifies the use of outlines by compressing\r\n-the entire show and hide functionalities into a single command,\r\n-~org-cycle~, which is bound to the {{{kbd(TAB)}}} key.\r\n+the show and hide functionalities into a single command, ~org-cycle~,\r\n+which is bound to the {{{kbd(TAB)}}} key.\r\n \r\n ** Headlines\r\n :PROPERTIES:\r\n@@ -524,8 +526,8 @@ ** Headlines\r\n as a title for your own headings.\r\n \r\n Some people find the many stars too noisy and would prefer an outline\r\n-that has whitespace followed by a single star as headline starters.\r\n-This can be achieved using an Org Indent minor mode.  See [[*A Cleaner\r\n+that has whitespace followed by a single star as headline markers.\r\n+This can be achieved using the Org Indent minor mode.  See [[*A Cleaner\r\n Outline View]] for more information.\r\n \r\n Headlines are not numbered.  However, you may want to dynamically\r\n@@ -717,7 +719,7 @@ *** Catching invisible edits\r\n #+vindex: org-fold-catch-invisible-edits\r\n #+vindex: org-fold-catch-invisible-edits-commands\r\n Sometimes you may inadvertently edit an invisible part of the buffer\r\n-and be confused on what has been edited and how to undo the mistake.\r\n+and be confused about what has been edited and how to undo the mistake.\r\n By default, Org prevents such edits for a limited set of user\r\n commands.  Users can control which commands are affected by\r\n customizing ~org-fold-catch-invisible-edits-commands~.\r\n@@ -783,7 +785,7 @@ ** Motion\r\n   | {{{kbd(\/)}}}              | Do a Sparse-tree search         |\r\n \r\n   #+texinfo: @noindent\r\n-  The following keys work if you turn off ~org-goto-auto-isearch~\r\n+  The following keys work if you turn off ~org-goto-auto-isearch~.\r\n \r\n   #+attr_texinfo: :columns 0.3 0.7\r\n   | {{{kbd(n)}}} \/ {{{kbd(p)}}}   | Next\/previous visible headline.    |\r\n@@ -912,7 +914,7 @@ ** Structure Editing\r\n \r\n   #+kindex: C-c @@\r\n   #+findex: org-mark-subtree\r\n-  Mark the subtree at point.  Hitting repeatedly marks subsequent\r\n+  Mark the subtree at point.  Hitting it repeatedly marks subsequent\r\n   subtrees of the same level as the marked subtree.\r\n \r\n - {{{kbd(C-c C-x C-w)}}} (~org-cut-subtree~) ::\r\n@@ -1061,7 +1063,7 @@ ** Sparse Trees\r\n   Prompts for a regexp (see [[*Regular Expressions]]) and shows a\r\n   sparse tree with all matches.  If the match is in a headline, the\r\n   headline is made visible.  If the match is in the body of an entry,\r\n-  headline and body are made visible.  In order to provide minimal\r\n+  the headline and body are made visible.  In order to provide minimal\r\n   context, also the full hierarchy of headlines above the match is\r\n   shown, as well as the headline following the match.  Each match is\r\n   also highlighted; the highlights disappear when the buffer is\r\n@@ -1145,18 +1147,18 @@ ** Plain Lists\r\n \r\n - \/Description\/ list items are unordered list items, and contain the\r\n   separator =::= to distinguish the description \/term\/ from the\r\n-  description.\r\n+  description text.\r\n \r\n Items belonging to the same list must have the same indentation on the\r\n first line.  In particular, if an ordered list reaches number =10.=,\r\n then the 2-digit numbers must be written left-aligned with the other\r\n-numbers in the list.  An item ends before the next line that is less\r\n-or equally indented than its bullet\/number.\r\n+numbers in the list.  An item ends before the next line that has an\r\n+indentation less than or equal to its bullet\/number.\r\n \r\n A list ends whenever every item has ended, which means before any line\r\n-less or equally indented than items at top level.  It also ends before\r\n-two blank lines.  In that case, all items are closed.  Here is an\r\n-example:\r\n+with an indentation less than or equal to that of the top-level items.\r\n+It also ends before two blank lines.  In that case, all items are\r\n+closed.  Here is an example:\r\n \r\n #+begin_example\r\n ,* Lord of the Rings\r\n@@ -1187,7 +1189,7 @@ ** Plain Lists\r\n If you find that using a different bullet for a sub-list---than that\r\n used for the current list-level---improves readability, customize the\r\n variable ~org-list-demote-modify-bullet~.  To get a greater difference\r\n-of indentation between items and theirs sub-items, customize\r\n+of indentation between items and their sub-items, customize\r\n ~org-list-indent-offset~.\r\n \r\n #+vindex: org-list-automatic-rules\r\n@@ -1227,7 +1229,7 @@ ** Plain Lists\r\n   in the middle of an item, that item is \/split\/ in two, and the\r\n   second part becomes the new item[fn:: If you do not want the item to\r\n   be split, customize the variable ~org-M-RET-may-split-line~.].  If\r\n-  this command is executed \/before item's body\/, the new item is\r\n+  this command is executed \/before the item's body\/, the new item is\r\n   created \/before\/ the current one.\r\n \r\n - {{{kbd(M-S-RET)}}} ::\r\n@@ -1321,8 +1323,8 @@ ** Plain Lists\r\n   #+vindex: org-support-shift-select\r\n   #+kindex: S-LEFT\r\n   #+kindex: S-RIGHT\r\n-  This command also cycles bullet styles when point is in on the\r\n-  bullet or anywhere in an item line, details depending on\r\n+  This command also cycles bullet styles when point is on the bullet\r\n+  or anywhere in an item line, details depending on\r\n   ~org-support-shift-select~.\r\n \r\n - {{{kbd(C-c ^)}}} ::\r\n@@ -1340,7 +1342,7 @@ ** Drawers\r\n #+cindex: visibility cycling, drawers\r\n \r\n Sometimes you want to keep information associated with an entry, but\r\n-you normally do not want to see it.  For this, Org mode has \/drawers\/.\r\n+you do not normally want to see it.  For this, Org mode has \/drawers\/.\r\n They can contain anything but a headline and another drawer.  Drawers\r\n look like this:\r\n \r\n@@ -1368,7 +1370,7 @@ ** Drawers\r\n {{{kbd(M-TAB)}}}[fn:6].\r\n \r\n Visibility cycling (see [[*Visibility Cycling]]) on the headline hides and\r\n-shows the entry, but keep the drawer collapsed to a single line.  In\r\n+shows the entry, but keeps the drawer collapsed to a single line.  In\r\n order to look inside the drawer, you need to move point to the drawer\r\n line and press {{{kbd(TAB)}}} there.\r\n \r\n@@ -1439,7 +1441,7 @@ ** Built-in Table Editor\r\n #+end_example\r\n \r\n A table is re-aligned automatically each time you press\r\n-{{{kbd(TAB)}}}, {{{kbd(RET)}}} or {{{kbd(C-c C-c)}}} inside the table.\r\n+{{{kbd(TAB)}}}, {{{kbd(RET)}}}, or {{{kbd(C-c C-c)}}} inside the table.\r\n {{{kbd(TAB)}}} also moves to the next field---{{{kbd(RET)}}} to the\r\n next row---and creates new table rows at the end of the table or\r\n before horizontal lines.  The indentation of the table is set by the\r\n@@ -1530,14 +1532,14 @@ *** Re-aligning and field motion\r\n \r\n   #+kindex: M-a\r\n   #+findex: org-table-beginning-of-field\r\n-  Move to beginning of the current table field, or on to the previous\r\n+  Move to beginning of the current table field, or onto the previous\r\n   field.\r\n \r\n - {{{kbd(M-e)}}} (~org-table-end-of-field~) ::\r\n \r\n   #+kindex: M-e\r\n   #+findex: org-table-end-of-field\r\n-  Move to end of the current table field, or on to the next field.\r\n+  Move to end of the current table field, or onto the next field.\r\n \r\n *** Column and row editing\r\n :PROPERTIES:\r\n@@ -1566,7 +1568,7 @@ *** Column and row editing\r\n \r\n   #+kindex: M-S-RIGHT\r\n   #+findex: org-table-insert-column\r\n-  Insert a new column at point position.  Move the recent column and\r\n+  Insert a new column at point position.  Move the current column and\r\n   all cells to the right of this column to the right.\r\n \r\n - {{{kbd(M-UP)}}} (~org-table-move-row-up~) ::\r\n@@ -1779,7 +1781,7 @@ *** Miscellaneous\r\n   #+findex: org-table-header-line-mode\r\n   #+vindex: org-table-header-line-p\r\n   Turn on the display of the first data row of the table at point in\r\n-  the window header line when this first row is not visible anymore in\r\n+  the window header line when this first row is not visible any more in\r\n   the buffer.  You can activate this minor mode by default by setting\r\n   the option ~org-table-header-line-p~ to ~t~.\r\n \r\n@@ -1800,7 +1802,7 @@ ** Column Width and Alignment\r\n fraction of number-like versus non-number fields in the column.\r\n \r\n #+vindex: org-table-automatic-realign\r\n-Editing a field may modify alignment of the table.  Moving\r\n+Editing a field may modify the alignment of the table.  Moving\r\n a contiguous row or column---i.e., using {{{kbd(TAB)}}} or\r\n {{{kbd(RET)}}}---automatically re-aligns it.  If you want to disable\r\n this behavior, set ~org-table-automatic-realign~ to ~nil~.  In any\r\n@@ -1867,7 +1869,7 @@ ** Column Width and Alignment\r\n   Expand all columns.\r\n \r\n To see the full text of a shrunk field, hold the mouse over it:\r\n-a tool-tip window then shows the full contents of the field.\r\n+a tooltip window then shows the full contents of the field.\r\n Alternatively, {{{kbd(C-h .)}}} (~display-local-help~) reveals them,\r\n too.  For convenience, any change near the shrunk part of a column\r\n expands it.\r\n@@ -2005,12 +2007,12 @@ **** Field references\r\n separator lines, or \"hlines\".  Like with columns, you can use absolute\r\n row numbers =@1=, =@2=, ..., =@N=, and row numbers relative to the\r\n current row like =@+3= or =@-1=.  =@<= and =@>= are immutable\r\n-references the first and last row in the table, respectively.  You may\r\n-also specify the row relative to one of the hlines: =@I= refers to the\r\n-first hline, =@II= to the second, etc.  =@-I= refers to the first such\r\n-line above the current line, =@+I= to the first such line below the\r\n-current line.  You can also write =@III+2= which is the second data\r\n-line after the third hline in the table.\r\n+references to the first and last row in the table, respectively.  You\r\n+may also specify the row relative to one of the hlines: =@I= refers to\r\n+the first hline, =@II= to the second, etc.  =@-I= refers to the first\r\n+such line above the current line, =@+I= to the first such line below\r\n+the current line.  You can also write =@III+2= which is the second\r\n+data line after the third hline in the table.\r\n \r\n =@0= and =$0= refer to the current row and column, respectively, i.e.,\r\n to the row\/column for the field being computed.  Also, if you omit\r\n@@ -2099,7 +2101,7 @@ **** Field coordinates in formulas\r\n For the second and third examples, table {{{var(FOO)}}} must have at\r\n least as many rows or columns as the current table.  Note that this is\r\n inefficient[fn:: The computation time scales as O(N^2) because table\r\n-{{{var(FOO)}}} is parsed for each field to be copied.] for large\r\n+{{{var(FOO)}}} is parsed for each field to be copied.] for a large\r\n number of rows.\r\n \r\n **** Named references\r\n@@ -2161,7 +2163,7 @@ **** Remote references\r\n When {{{var(NAME)}}} has the format =@ROW$COLUMN=, it is substituted\r\n with the name or ID found in this field of the current table.  For\r\n example =remote($1, @@>$2)= \\Rightarrow =remote(year_2013, @@>$1)=.  The format\r\n-=B3= is not supported because it can not be distinguished from a plain\r\n+=B3= is not supported because it cannot be distinguished from a plain\r\n table name or ID.\r\n \r\n *** Formula syntax for Calc\r\n@@ -2249,17 +2251,17 @@ *** Formula syntax for Calc\r\n to reformat the Calc result after it has been passed back to Org\r\n instead of letting Calc handle the formatting.  A few examples:\r\n \r\n-| =$1+$2=            | Sum of first and second field                    |\r\n-| =$1+$2;%.2f=       | Same, format result to two decimals              |\r\n-| =exp($2)+exp($1)=  | Math functions can be used                       |\r\n-| =$0;%.1f=          | Reformat current cell to 1 decimal               |\r\n-| =($3-32)*5\/9=      | Degrees F \\to C conversion                         |\r\n-| =$c\/$1\/$cm=        | Hz \\to cm conversion, using =constants.el=         |\r\n-| =tan($1);Dp3s1=    | Compute in degrees, precision 3, display SCI 1   |\r\n-| =sin($1);Dp3%.1e=  | Same, but use ~format~ specifier for display     |\r\n-| =vmean($2..$7)=    | Compute column range mean, using vector function |\r\n-| =vmean($2..$7);EN= | Same, but treat empty fields as 0                |\r\n-| =taylor($3,x=7,2)= | Taylor series of $3, at x=7, second degree       |\r\n+| =$1+$2=            | Sum of first and second field                       |\r\n+| =$1+$2;%.2f=       | Same, format result to two decimals                 |\r\n+| =exp($2)+exp($1)=  | Math functions can be used                          |\r\n+| =$0;%.1f=          | Reformat current cell to 1 decimal                  |\r\n+| =($3-32)*5\/9=      | Fahrenheit to Celsius conversion                    |\r\n+| =$c\/$1\/$cm=        | Herz to centimeter conversion, using =constants.el= |\r\n+| =tan($1);Dp3s1=    | Compute in degrees, precision 3, display SCI 1      |\r\n+| =sin($1);Dp3%.1e=  | Same, but use ~format~ specifier for display        |\r\n+| =vmean($2..$7)=    | Compute column range mean, using vector function    |\r\n+| =vmean($2..$7);EN= | Same, but treat empty fields as 0                   |\r\n+| =taylor($3,x=7,2)= | Taylor series of $3, at x=7, second degree          |\r\n \r\n Calc also contains a complete set of logical operations (see [[info:calc#Logical Operations][Logical\r\n Operations]]).  For example\r\n@@ -2272,7 +2274,7 @@ *** Formula syntax for Calc\r\n - =if(\"$1\" =\u200b= \"nan\" || \"$2\" =\u200b= \"nan\", string(\"\"), $1 + $2); E f-1= ::\r\n \r\n   Sum of the first two columns.  When at least one of the input fields\r\n-  is empty the Org table result field is set to empty.  =E= is\r\n+  is empty, the Org table result field is set to empty.  =E= is\r\n   required to not convert empty fields to 0.  =f-1= is an optional\r\n   Calc format string similar to =%.1f= but leaves empty results empty.\r\n \r\n@@ -2280,7 +2282,7 @@ *** Formula syntax for Calc\r\n \r\n   Mean value of a range unless there is any empty field.  Every field\r\n   in the range that is empty is replaced by =nan= which lets =vmean=\r\n-  result in =nan=.  Then =typeof == 12= detects the =nan= from ~vmean~\r\n+  return =nan=.  Then =typeof == 12= detects the =nan= from ~vmean~\r\n   and the Org table result field is set to empty.  Use this when the\r\n   sample set is expected to never have missing values.\r\n \r\n@@ -2294,7 +2296,7 @@ *** Formula syntax for Calc\r\n \r\n - =vmean($1..$7); EN= ::\r\n \r\n-  To complete the example before: Mean value of a range with empty\r\n+  To complete the previous example: Mean value of a range with empty\r\n   fields counting as samples with value 0.  Use this only when\r\n   incomplete sample sets should be padded with 0 to the full size.\r\n \r\n@@ -2367,7 +2369,7 @@ *** Emacs Lisp forms as formulas\r\n : '(concat $1 \";\")\r\n \r\n #+texinfo: @noindent\r\n-You can put an extra tailing =;= to indicate that all the earlier\r\n+You can put an extra trailing =;= to indicate that all the earlier\r\n instances of =;= belong to the formula itself:\r\n \r\n : '(concat $1 \";\");\r\n@@ -2499,7 +2501,7 @@ *** Column formulas\r\n result.  If the field contains only ===, the previously stored formula\r\n for this column is used.  For each column, Org only remembers the most\r\n recently used formula.  In the =TBLFM= keyword, column formulas look\r\n-like =$4=$1+$2=.  The left-hand side of a column formula can not be\r\n+like =$4=$1+$2=.  The left-hand side of a column formula cannot be\r\n the name of column, it must be the numeric column reference or =$>=.\r\n \r\n Instead of typing an equation into the field, you may also use the\r\n@@ -2553,7 +2555,7 @@ *** Lookup functions\r\n   #+findex: org-lookup-all\r\n   Similar to ~org-lookup-first~, but searches for \/all\/ elements for\r\n   which {{{var(PREDICATE)}}} is non-~nil~, and returns \/all\/\r\n-  corresponding values.  This function can not be used by itself in\r\n+  corresponding values.  This function cannot be used by itself in\r\n   a formula, because it returns a list of values.  However, powerful\r\n   lookups can be built when this function is combined with other Emacs\r\n   Lisp functions.\r\n@@ -2787,7 +2789,7 @@ **** Debugging formulas\r\n during variable substitution and calculation in order to find a bug,\r\n turn on formula debugging in the Tbl menu and repeat the calculation,\r\n for example by pressing {{{kbd(C-u C-u C-c = RET)}}} in a field.\r\n-Detailed information are displayed.\r\n+Detailed information is displayed.\r\n \r\n *** Updating the table\r\n :PROPERTIES:\r\n@@ -3134,7 +3136,7 @@ *** ASCII bar plots\r\n {{{var(VALUE)}}} is the value to plot.\r\n \r\n {{{var(MIN)}}} is the value displayed as an empty bar.  {{{var(MAX)}}}\r\n-is the value filling all the {{{var(WIDTH)}}}.  Sources values outside\r\n+is the value filling all the {{{var(WIDTH)}}}.  Source values outside\r\n this range are displayed as =too small= or =too large=.\r\n \r\n {{{var(WIDTH)}}} is the number of characters of the bar plot.  It\r\n@@ -3176,8 +3178,7 @@ ** Link Format\r\n #+cindex: backslashes, in links\r\n Some =\\=, =[= and =]= characters in the {{{var(LINK)}}} part need to\r\n be \"escaped\", i.e., preceded by another =\\= character.  More\r\n-specifically, the following characters, and only them, must be\r\n-escaped:\r\n+specifically, only the following characters must be escaped:\r\n \r\n 1. all =[= and =]= characters,\r\n 2. every =\\= character preceding either =]= or =[=,\r\n@@ -3211,7 +3212,7 @@ ** Link Format\r\n Inserting the missing bracket hides the link internals again.  To show\r\n the internal structure of all links, use the menu: Org \\rarr\r\n Hyperlinks \\rarr Literal links, customize ~org-link-descriptive~, or use\r\n-=literallinks= [[*Summary of In-Buffer Settings][startup option]].\r\n+the =literallinks= [[*Summary of In-Buffer Settings][startup option]].\r\n \r\n ** Internal Links\r\n :PROPERTIES:\r\n@@ -3682,8 +3683,8 @@ ** Handling Links\r\n   a {{{kbd(C-u C-u)}}} prefix.\r\n \r\n   #+vindex: org-link-frame-setup\r\n-  If point is on a headline, but not on a link, offer all links in the\r\n-  headline and entry text.  If you want to set up the frame\r\n+  If point is on a headline, but not on a link, Org offers all links\r\n+  in the headline and entry text.  If you want to set up the frame\r\n   configuration for following links, customize ~org-link-frame-setup~.\r\n \r\n - {{{kbd(RET)}}} ::\r\n@@ -3734,7 +3735,7 @@ ** Handling Links\r\n   #+kindex: C-c C-x C-n\r\n   #+findex: org-next-link\r\n   #+cindex: links, finding next\/previous\r\n-  Move forward\/backward to the next link in the buffer.  At the limit\r\n+  Move forward\/backward to the next\/previous link in the buffer.  At the limit\r\n   of the buffer, the search fails once, and then wraps around.  The\r\n   key bindings for this are really too long; you might want to bind\r\n   this also to {{{kbd(M-n)}}} and {{{kbd(M-p)}}}.\r\n@@ -3995,7 +3996,7 @@ ** Basic TODO Functionality\r\n   #+vindex: org-todo-keywords\r\n   #+findex: org-show-todo-tree\r\n   View TODO items in a \/sparse tree\/ (see [[*Sparse Trees]]).  Folds the\r\n-  entire buffer, but shows all TODO items---with not-DONE state---and\r\n+  entire buffer, but shows all TODO items---with a not-DONE state---and\r\n   the headings hierarchy above them.  With a prefix argument, or by\r\n   using {{{kbd(C-c \/ T)}}}, search for a specific TODO.  You are\r\n   prompted for the keyword, and you can also give a list of keywords\r\n@@ -4102,9 +4103,9 @@ *** TODO keywords as types\r\n #+end_src\r\n \r\n In this case, different keywords do not indicate states, but rather\r\n-different types.  So the normal work flow would be to assign a task to\r\n+different types.  So the normal workflow would be to assign a task to\r\n a person, and later to mark it DONE.  Org mode supports this style by\r\n-adapting the workings of the command {{{kbd(C-c C-t)}}}[fn:: This is\r\n+adapting the working of the command {{{kbd(C-c C-t)}}}[fn:: This is\r\n also true for the {{{kbd(t)}}} command in the agenda buffer.].  When\r\n used several times in succession, it still cycles through all names,\r\n in order to first select the right type for a task.  But when you\r\n@@ -4395,7 +4396,7 @@ *** Closing items\r\n after the headline.  If you turn the entry back into a TODO item\r\n through further state cycling, that line is removed again.  If you\r\n turn the entry back to a non-TODO state (by pressing {{{kbd(C-c C-t\r\n-SPC)}}} for example), that line is also removed, unless you set\r\n+SPC)}}}, for example), that line is also removed, unless you set\r\n ~org-closed-keep-when-no-todo~ to non-~nil~.  If you want to record a\r\n note along with the timestamp, use[fn:: The corresponding in-buffer\r\n setting is: =#+STARTUP: lognotedone=.]\r\n@@ -4451,9 +4452,9 @@ *** Tracking TODO state changes\r\n entering the state, a timestamp should be recorded when \/leaving\/ the\r\n =WAIT= state, if and only if the \/target\/ state does not configure\r\n logging for entering it.  So it has no effect when switching from\r\n-=WAIT= to =DONE=, because =DONE= is configured to record a timestamp\r\n-only.  But when switching from =WAIT= back to =TODO=, the =\/!= in the\r\n-=WAIT= setting now triggers a timestamp even though =TODO= has no\r\n+=WAIT= to =DONE=, because =DONE= is configured to record only a\r\n+timestamp.  But when switching from =WAIT= back to =TODO=, the =\/!= in\r\n+the =WAIT= setting now triggers a timestamp even though =TODO= has no\r\n logging configured.\r\n \r\n You can use the exact same syntax for setting logging preferences local\r\n@@ -4617,7 +4618,7 @@ ** Priorities\r\n #+vindex: org-priority-faces\r\n By default, Org mode supports three priorities: =A=, =B=, and =C=.\r\n =A= is the highest priority.  An entry without a cookie is treated as\r\n-equivalent if it had priority =B=.  Priorities make a difference only\r\n+if it had priority =B=.  Priorities make a difference only\r\n for sorting in the agenda (see [[*Weekly\/daily agenda]]).  Outside the\r\n agenda, they have no inherent meaning to Org mode.  The cookies are\r\n displayed with the face defined by the variable ~org-priority-faces~,\r\n@@ -4707,7 +4708,7 @@ ** Breaking Down Tasks into Subtasks\r\n \r\n #+cindex: @samp{COOKIE_DATA}, property\r\n If a heading has both checkboxes and TODO children below it, the\r\n-meaning of the statistics cookie become ambiguous.  Set the property\r\n+meaning of the statistics cookie becomes ambiguous.  Set the property\r\n =COOKIE_DATA= to either =checkbox= or =todo= to resolve this issue.\r\n \r\n #+vindex: org-hierarchical-todo-statistics\r\n@@ -5314,12 +5315,12 @@ ** Tag Searches\r\n   only TODO items.\r\n \r\n These commands all prompt for a match string which allows basic\r\n-Boolean logic like =+boss+urgent-project1=, to find entries with tags\r\n-=boss= and =urgent=, but not =project1=, or =Kathy|Sally= to find\r\n-entries which are tagged, like =Kathy= or =Sally=.  The full syntax of\r\n-the search string is rich and allows also matching against TODO\r\n-keywords, entry levels and properties.  For a complete description\r\n-with many examples, see [[*Matching tags and properties]].\r\n+Boolean logic, such as =+boss+urgent-project1= to find entries with\r\n+tags =boss= and =urgent=, but not =project1= or =Kathy|Sally= to find\r\n+entries tagged with either =Kathy= or =Sally=.  The full syntax of the\r\n+search string is rich and allows also matching against TODO keywords,\r\n+entry levels and properties.  For a complete description with many\r\n+examples, see [[*Matching tags and properties]].\r\n \r\n * Properties and Columns\r\n :PROPERTIES:\r\n@@ -6809,14 +6810,14 @@ *** Repeated tasks\r\n #+begin_example\r\n ,** TODO Call Father\r\n    DEADLINE: <2008-02-10 Sun ++1w>\r\n-   Marking this DONE shifts the date by at least one week, but also\r\n+   Marking this as DONE shifts the date by at least one week, but also\r\n    by as many weeks as it takes to get this date into the future.\r\n    However, it stays on a Sunday, even if you called and marked it\r\n    done on Saturday.\r\n \r\n ,** TODO Empty kitchen trash\r\n    DEADLINE: <2008-02-08 Fri 20:00 ++1d>\r\n-   Marking this DONE shifts the date by at least one day, and also\r\n+   Marking this as DONE shifts the date by at least one day, and also\r\n    by as many days as it takes to get the timestamp into the future.\r\n    Since there is a time in the timestamp, the next deadline in the\r\n    future will be on today's date if you complete the task before\r\n@@ -6824,11 +6825,11 @@ *** Repeated tasks\r\n \r\n ,** TODO Check the batteries in the smoke detectors\r\n    DEADLINE: <2005-11-01 Tue .+1m>\r\n-   Marking this DONE shifts the date to one month after today.\r\n+   Marking this as DONE shifts the date to one month after today.\r\n \r\n ,** TODO Wash my hands\r\n    DEADLINE: <2019-04-05 08:00 Fri .+1h>\r\n-   Marking this DONE shifts the date to exactly one hour from now.\r\n+   Marking this as DONE shifts the date to exactly one hour from now.\r\n #+end_example\r\n \r\n #+vindex: org-agenda-skip-scheduled-repeats-after-deadline\r\n@@ -6910,8 +6911,8 @@ *** Clocking commands\r\n   #+vindex: org-clock-in-prepare-hook\r\n   While the clock is running, Org shows the current clocking time in\r\n   the mode line, along with the title of the task.  The clock time\r\n-  shown is all time ever clocked for this task and its children.  If\r\n-  the task has an effort estimate (see [[*Effort Estimates]]), the\r\n+  shown is all time ever clocked in for this task and its children.\r\n+  If the task has an effort estimate (see [[*Effort Estimates]]), the\r\n   mode line displays the current clocking time against it[fn:: To add\r\n   an effort estimate \"on the fly\", hook a function doing this to\r\n   ~org-clock-in-prepare-hook~.].  If the task is a repeating one (see\r\n@@ -7011,7 +7012,7 @@ *** Clocking commands\r\n \r\n   #+kindex: C-c C-x C-j\r\n   #+findex: or-clock-goto\r\n-  Jump to the headline of the currently clocked in task.  With\r\n+  Jump to the headline of the currently clocked-in task.  With\r\n   a {{{kbd(C-u)}}} prefix argument, select the target task from a list\r\n   of recently clocked tasks.\r\n \r\n@@ -7207,7 +7208,7 @@ *** The clock table\r\n \r\n   An integer to limit the width of the headline column in the Org\r\n   table.  If you write it like =50!=, then the headline is also\r\n-  shortened in export.\r\n+  shortened during export.\r\n \r\n - =:indent= ::\r\n \r\n@@ -7731,7 +7732,7 @@ *** Moving a tree to an archive file\r\n #+cindex: external archiving\r\n \r\n The most common archiving action is to move a project tree to another\r\n-file, the archive file.\r\n+file, called the archive file.\r\n \r\n - {{{kbd(C-c C-x C-s)}}} or short {{{kbd(C-c $)}}} (~org-archive-subtree~) ::\r\n \r\n@@ -7781,7 +7782,7 @@ *** Moving a tree to an archive file\r\n #+vindex: org-archive-save-context-info\r\n When a subtree is moved, it receives a number of special properties\r\n that record context information like the file from where the entry\r\n-came, its outline path the archiving time etc.  Configure the variable\r\n+came, its outline path, the archiving time etc.  Configure the variable\r\n ~org-archive-save-context-info~ to adjust the amount of information\r\n added.\r\n \r\n@@ -7922,9 +7923,9 @@ *** Using capture\r\n   #+findex: org-capture\r\n   Display the capture templates menu.  If you have templates defined\r\n   (see [[*Capture templates]]), it offers these templates for\r\n-  selection.  It inserts the template into the target file and switch\r\n-  to an indirect buffer narrowed to this new node.  You may then\r\n-  insert the information you want.\r\n+  selection.  It inserts the template into the target file and\r\n+  switches to an indirect buffer narrowed to this new node.  You may\r\n+  then insert the information you want.\r\n \r\n - {{{kbd(C-c C-c)}}} (~org-capture-finalize~) ::\r\n \r\n@@ -8516,8 +8517,8 @@ ** Attachments\r\n project.\r\n \r\n Another method is \/attachments\/, which are files located in a\r\n-directory belonging to heading\/subtree.  Org uses directories either\r\n-named by =ID= property of a heading, or by a =DIR= property.\r\n+directory belonging to heading\/subtree.  Org uses directories named\r\n+either by the =ID= property of a heading or by a =DIR= property.\r\n \r\n *** Attachment defaults and dispatcher\r\n :PROPERTIES:\r\n@@ -13244,7 +13245,7 @@ *** Frames and Blocks in Beamer\r\n   environment.\r\n \r\n   #+cindex: @samp{BEAMER_SUBTITLE}, property\r\n-  If =BEAMER_SUBTITLE= is set, org exports its value as the subtitle\r\n+  If =BEAMER_SUBTITLE= is set, Org exports its value as the subtitle\r\n   for the headline's frame. This property has no effect on headlines\r\n   which are not exported as frames.\r\n \r\n@@ -17300,7 +17301,7 @@ *** Publishing action\r\n \r\n - ~:htmlized-source~ ::\r\n \r\n-  Non-~nil~ means, publish htmlized source.\r\n+  Non-~nil~ means, publish an htmlized version of the source.\r\n \r\n The function must accept three arguments: a property list containing\r\n at least a ~:publishing-directory~ property, the name of the file to\r\n@@ -17606,7 +17607,7 @@ ** Uploading Files\r\n definition since the third-party tool syncs them.\r\n \r\n Publishing to a local directory is also much faster than to a remote\r\n-one, so that you can afford more easily to republish entire projects.\r\n+one, so that you can more easily afford to republish entire projects.\r\n If you set ~org-publish-use-timestamps-flag~ to ~nil~, you gain the\r\n main benefit of re-including any changed external files such as source\r\n example files you might include with =INCLUDE= keyword.  The timestamp\r\n@@ -17756,7 +17757,7 @@ * Citation handling\r\n : Org mode is used by various communities [cite:teaching: @orgteaching;\r\n : and TeX: @orgtex].  [cite\/author\/caps:@orgtex] uses Org mode to simplify\r\n : writing scientific publications, while [cite\/author\/caps:@orgteaching]\r\n-: experiment with Org babel to improve teaching.\r\n+: experiments with Org babel to improve teaching.\r\n :\r\n : #+print_bibliography:\r\n \r\n@@ -18132,7 +18133,7 @@ ** Structure of Code Blocks\r\n ,#+END_SRC\r\n #+end_example\r\n \r\n-Do not be put-off by having to remember the source block syntax.  Org\r\n+Do not be put off by having to remember the source block syntax.  Org\r\n mode offers a command for wrapping existing text in a block (see\r\n [[*Structure Templates]]).  Org also works with other completion systems\r\n in Emacs, some of which predate Org and have custom domain-specific\r\n@@ -18267,7 +18268,7 @@ *** System-wide header arguments\r\n             (assq-delete-all :noweb org-babel-default-header-args)))\r\n #+end_src\r\n \r\n-#+cindex: language specific default header arguments\r\n+#+cindex: language-specific default header arguments\r\n #+cindex: default header arguments per language\r\n Each language can have separate default header arguments by\r\n customizing the variable ~org-babel-default-header-args:<LANG>~, where\r\n@@ -18316,7 +18317,7 @@ *** Header arguments in Org mode properties\r\n {{{kbd(C-c C-x p)}}}, apply to all active languages.  They override\r\n properties set in ~org-babel-default-header-args~.\r\n \r\n-#+cindex: language specific header arguments properties\r\n+#+cindex: language-specific header arguments properties\r\n #+cindex: header arguments per language\r\n Language-specific header arguments are also read from properties\r\n =header-args:<LANG>= where {{{var(<LANG>)}}} is the language\r\n@@ -18867,9 +18868,9 @@ ** Evaluating Code Blocks\r\n #+cindex: @samp{RESULTS}, keyword\r\n \r\n A note about security: With code evaluation comes the risk of harm.\r\n-Org safeguards by prompting for user's permission before executing any\r\n-code in the source block.  To customize this safeguard, or disable it,\r\n-see [[*Code Evaluation and Security Issues]].\r\n+Org provides safeguards by prompting for the user's permission before\r\n+executing any code.  To customize this safeguard, or disable it, see\r\n+[[*Code Evaluation and Security Issues]].\r\n \r\n *** How to evaluate source code\r\n :PROPERTIES:\r\n@@ -19775,7 +19776,7 @@ ** Languages\r\n #+cindex: code block, languages\r\n \r\n Code blocks in dozens of languages are supported.  See Worg website\r\n-for [[https:\/\/orgmode.org\/worg\/org-contrib\/babel\/languages\/index.html][language specific documentation]].\r\n+for [[https:\/\/orgmode.org\/worg\/org-contrib\/babel\/languages\/index.html][language-specific documentation]].\r\n \r\n #+vindex: org-babel-load-languages\r\n By default, only Emacs Lisp is enabled for evaluation.  To enable or\r\n@@ -20491,11 +20492,11 @@ ** A Cleaner Outline View\r\n #+cindex: odd-levels-only outlines\r\n #+cindex: clean outline view\r\n \r\n-Org's outline with stars and no indents can look cluttered for short\r\n-documents.  For \/book-like\/ long documents, the effect is not as\r\n-noticeable.  Org provides an alternate stars and indentation scheme,\r\n-as shown on the right in the following table.  It displays only one\r\n-star and indents text to line up with the heading:\r\n+Org's outline, with its stars and lack of indents, can look cluttered\r\n+in short documents. For \/book-like\/ long documents, the effect is not\r\n+as noticeable.  Org provides an alternate stars and indentation\r\n+scheme, as shown on the right in the following table.  It displays\r\n+only one star and indents text to line up with the heading:\r\n \r\n #+begin_example\r\n ,* Top level headline             |    * Top level headline\r\n@@ -20669,7 +20670,7 @@ ** The Very Busy {{{kbd(C-c C-c)}}} Key\r\n \r\n - If point is in one of the special =KEYWORD= lines, scan the buffer\r\n   for these lines and update the information.  Also reset the Org file\r\n-  cache used to temporary store the contents of URLs used as values\r\n+  cache used to temporarily store the contents of URLs used as values\r\n   for keywords like =SETUPFILE=.\r\n \r\n - If point is inside a table, realign the table.\r\n@@ -21350,7 +21351,7 @@ *** Packages that conflict with Org mode\r\n   #+cindex: @file{yasnippet.el}\r\n   The way Org mode binds the {{{kbd(TAB)}}} key (binding to ~[tab]~\r\n   instead of ~\"\\t\"~) overrules YASnippet's access to this key.  The\r\n-  following code fixed this problem:\r\n+  following code fixes this problem:\r\n \r\n   #+begin_src emacs-lisp\r\n   (add-hook 'org-mode-hook\r\n@@ -23003,13 +23004,14 @@ ** From Carsten\r\n and intuitive editing features, and to incorporate project planning\r\n functionality directly into a notes file.\r\n \r\n-Since the first release, literally thousands of emails to me or to the\r\n-[[mailto:emacs-orgmode@gnu.org][mailing list]] have provided a constant stream of bug reports, feedback,\r\n-new ideas, and sometimes patches and add-on code.  Many thanks to\r\n-everyone who has helped to improve this package.  I am trying to keep\r\n-here a list of the people who had significant influence in shaping one\r\n-or more aspects of Org.  The list may not be complete, if I have\r\n-forgotten someone, please accept my apologies and let me know.\r\n+Since the first release, thousands of emails to me or to the\r\n+[[mailto:emacs-orgmode@gnu.org][mailing list]] have provided a\r\n+constant stream of bug reports, feedback, new ideas, and sometimes\r\n+patches and add-on code.  Many thanks to everyone who has helped to\r\n+improve this package.  Below is a list of the people who had\r\n+significant influence in shaping one or more aspects of Org.  The list\r\n+may not be complete, if I have forgotten someone, please accept my\r\n+apologies and let me know.\r\n \r\n Before I get to this list, a few special mentions are in order:\r\n \r\n@@ -23110,9 +23112,9 @@ ** From Bastien\r\n be fair when shortlisting a few of them, but Org's history would not\r\n be complete if the ones above were not mentioned in this manual.\r\n \r\n-Of course, I'm also grateful grateful to Carsten for his trust while\r\n-handing me over the maintainership of Org.  His unremitting support is\r\n-what really helped me getting more confident over time, with both the\r\n+Of course, I'm also grateful to Carsten for his trust while handing\r\n+over the maintainership of Org to me.  His unremitting support is what\r\n+really helped me getting more confident over time, with both the\r\n community and the code.\r\n \r\n ** List of Contributions\r\n@@ -23188,7 +23190,7 @@ ** List of Contributions\r\n - Eric Fraga drove the development of Beamer export with ideas and\r\n   testing.\r\n \r\n-- Barry Gidden did proofreading the manual in preparation for the book\r\n+- Barry Gidden proofread the manual in preparation for the book\r\n   publication through Network Theory Ltd.\r\n \r\n - Niels Giesen had the idea to automatically archive DONE trees.\r\n-- \r\n2.50.1 (Apple Git-155)\r\n\r\n","subject":"Re: [PATCH] doc\/org-manual.org: Fix typos and improve readability"},{"date":"2026-01-17T07:53:55.262Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/6f0a8b8c-f3e7-448c-abc6-aac2d3f1629c@app.fastmail.com","message-id":"6f0a8b8c-f3e7-448c-abc6-aac2d3f1629c@app.fastmail.com","config":false,"refs-count":3,"username":"noa","related-refs":["6f0a8b8c-f3e7-448c-abc6-aac2d3f1629c@app.fastmail.com"],"from":"noa@meanwhiling.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] ensure that org-support-shift-select can conform fully to emacs defaults"},{"date":"2026-01-10T10:54:34.820Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/874ioteo2e.fsf@localhost","message-id":"874ioteo2e.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87v7iinmnb.fsf@localhost"],"related-refs":["874ioteo2e.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nHere are the meetup notes.\r\n\r\nTL;DR: whisper.el + org-capture; multi-line table cells; page-view package;\r\n\"double-capture\" meeting notes workflow; export flow; performance of Org export.\r\n\r\n- As usual, we started from Emacs News\r\n  https:\/\/sachachua.com\/blog\/2025\/12\/2025-12-08-emacs-news\/\r\n- I had some connection issues at the beginning. Had to re-connect and\r\n  switch to mobile network.\r\n- Sacha shared her current tinkering with making use of whisper.el to\r\n  quickly record org-capture notes\r\n  - She ideally wants to use streaming to get things typed as she talks\r\n    - https:\/\/github.com\/ufal\/SimulStreaming\/tree\/main\/whisper_streaming\r\n    - Ihor: There is also built-in streaming, but my personal experience\r\n      is not great with it (quality of recognition drops)\r\n  - One of the problems with non-streaming is that it is quite slow\r\n    - We quickly figured that setting ~whisper-use-threads~\r\n      can help a lot. The default is using no more than 4\r\n      cores. Ramping it up to something closer to what CPU can handle\r\n      can speed up recognition to levels that are comfortable.\r\n    - In theory, one may also use GPU for even better performance\r\n    - Ihor: I personally feel comfortable with whisper-use-threads=7\r\n      on my 5+ years old laptop without proper GPU (only built-in\r\n      Intel that shares CPU resources)\r\n      #+begin_src emacs-lisp\r\n\t(use-package whisper\r\n\t  :straight (whisper :host github :repo \"natrys\/whisper.el\")\r\n\t  :bind\r\n\t  (\"<f6>\" . whisper-run)\r\n\t  :config\r\n\t  (setq whisper-install-directory \"~\/Dist\/\"\r\n\t  \twhisper-model \"base\"\r\n\t        whisper-language \"en\"\r\n\t        whisper-translate nil\r\n\t        whisper-use-threads (- (num-processors) 1)))\r\n      #+end_src\r\n  - One interesting feature of whisper is --prompt\r\n    \"you can give it a hint about whether you want punctuation and\r\n    capitalization, skip filler words or include them, etc.\" -- Sacha\r\n    not fully trained on\r\n    - Ihor: I just pass the output through LLM to fix recognition issues\r\n      See ~yant\/gptel-cleanup-voice-recognition~ in https:\/\/github.com\/yantar92\/emacs-config\/blob\/4309703807d6af547db6c9d304e5ceb21fd79cd4\/config.org?plain=1#L8522-L8562\r\n\r\n- org-user asked about working with Org tables that have very wide columns\r\n  - There is indeed setting column width + collapsing columns via overlays (built-in)\r\n  - Other solution is https:\/\/github.com\/misohena\/phscroll, although it is a bit of a hack\r\n    and may be finicky when Org buffer is open in multiple windows\r\n  - There is also M-x org-table-edit-field to edit field in separate table.\r\n    Does not help with display, but editing is easier then.\r\n  - We have also been discussing adding multiline cells to Org tables, but\r\n    we haven't found a satisfactory and backwards-compatible syntax\r\n    See https:\/\/list.orgmode.org\/orgmode\/878rkyarvm.fsf@localhost\/\r\n    - If someone has ideas, feel free to write to the mailing list (reply to the linked thread or just post a new email; whatever is easier)\r\n  - Org mode also supports Emacs' built-in table.el tables that do support\r\n    multiline cells. Export will also work there. But not formulas.\r\n    - Standard commands like M-left\/right will not work there. You will need\r\n      C-c ' to switch to table.el major mode buffer for editing. See\r\n      documentation inside table.el file for more details about that\r\n      major mode. It is fairly powerful.\r\n    - Example table\r\n       +---------------+---------------+---------------+\r\n       | just write    |               |               |\r\n       |here and it is |               |               |\r\n       |multiline      |               |               |\r\n       +---------------+---------------+---------------+\r\n       |               |               |               |\r\n       |               |               |               |\r\n       |               |               |               |\r\n       +---------------+---------------+---------------+\r\n\r\n- org-user also asked karthink about timeline for landing Org latex preview\r\n  - karthink is short on free time to work on it, so no timelines\r\n  - (he also has gptel backlog on top of other things)\r\n  - I want a bit astray and recalled one of the gptel feature\r\n    requests: calling ~gptel-send~ synchronously (useful to implement agents)\r\n    https:\/\/github.com\/karthink\/gptel\/issues\/1158\r\n    - I have an ad-hoc solution to this - simply call gptel-send asynchronously\r\n      followed by ~sleep-for~ loop. The callback for gptel will set a\r\n      flag when the loop ends.\r\n\r\n- org-user asked about in-buffer completion dropdown I use.\r\n  It is https:\/\/github.com\/minad\/corfu\r\n\r\n- We also briefly looked into https:\/\/github.com\/bradmont\/page-view\r\n  - It looked fancy, but ruined my margin setup :)\r\n\r\n- Nick Anderson has a very specific capture workflow for meetings\r\n  He has two separate place to clock meeting time and meeting notes\r\n  #+begin_quote\r\n  I have different capture templates for each meeting.  \r\n  I have a capture template for my \"worklog\" which goes to a note for\r\n  today and clocks time.  When I capture or meetings, it's an\r\n  immediate finish and then i want to capture to my worklog so that\r\n  from worklog I have a link to that meeting and then my time is\r\n  clocked in worklog.  \r\n  I capture to the meeting and immediately capture to worklog (it's\r\n  clocking time) yes, I follow the backlink back to the meeting note\r\n  and keep taking notes.\r\n  Each day I have a new worklog file. It links to all the other notes\r\n  for things I did in the day, all worklog is for is holding clock\r\n  time. (worklog\/YYYY-MM-DD.org, meetings\/org-meetup\/YYYY-MM-DD.org)\r\n  #+end_quote\r\n  #+begin_src org\r\n    ,* IN_PROGRESS Org Meetup :meeting:\r\n     :properties:\r\n     :prior_context: [[id:82a41521-2267-4c4d-bca4-e79d5ab6f6ee][Org meetup 2025-12-10]]\r\n     :ID:       edeb7194-1c2d-4e4a-a7ef-0ccd8066b2b0\r\n     :end:\r\n     :LOGBOOK:\r\n     CLOCK: [2025-12-10 Wed 10:39]\r\n     CLOCK: [2025-12-10 Wed 10:19]--[2025-12-10 Wed 10:38] =>  0:19\r\n     :END:\r\n\r\n    Then that prior_context links to this node in the meeting specific file.\r\n\r\n    ,** Org meetup 2025-12-10\r\n     :PROPERTIES:\r\n     :ID:       82a41521-2267-4c4d-bca4-e79d5ab6f6ee\r\n     :END:\r\n\r\n  #+end_src\r\n  - He does not use agenda, so I had a bit of a hard time getting the\r\n    workflow :)\r\n  - In any case, his workflow requires nested captures, which might be\r\n    finicky\r\n  - I did not suggest anything non-obvious other than generic\r\n    (blindly) info about capture hooks.\r\n\r\n- karthink asked whether ~org-export-before-processing-functions~\r\n  runs in original Org buffer or in the working copy\r\n  - All the details about export process are described in [[info:org#Advanced Export Configuration][org#Advanced\r\n    Export Configuration]], step by step\r\n  - Answer: in the copy\r\n\r\n- karthink also asked about performance of Org export.\r\n  He is particularly concerned about storing ~buffer-string~ in\r\n  variable + ~insert~ than in other place vs primitive and fast\r\n  ~insert-buffer-substring~ (in ~org-element--generate-copy-script~)\r\n  - ~insert-buffer-substring~ is indeed faster\r\n  - But the question is whether ~buffer-string~ is the real bottleneck\r\n    in the existing code. I'd say that there is little point trying\r\n    small speed-ups randomly. We should rather focus on real\r\n    performance bottlenecks. For me, it draws analogies with\r\n    https:\/\/en.wikipedia.org\/wiki\/Amdahl's_law. The results of\r\n    optimizing non-critical parts of the code may not worth the\r\n    effort.\r\n\r\n- karthink that asked about an update on refactoring branch\r\n  - it did not move at all as I just have enough time to keep up with\r\n    bug reports and patches\r\n  - The previous update still relevant: https:\/\/list.orgmode.org\/orgmode\/874j6zlhpu.fsf@localhost\/ (more details)\r\n\r\n:chat:\r\n[17:04] yantar92 is now the presenter\r\n[17:04] [Sacha Chua : VIEWER]: Yay! Happy to see you. =)\r\n[17:04] [Sacha Chua : VIEWER]: (I was beginning to worry that I got my crontab wrong =) )\r\n[17:09] [yantar92 : MODERATOR]: The latest Emacs News: https:\/\/sachachua.com\/blog\/2025\/12\/2025-12-08-emacs-news\/\r\n[17:10] [Nick Anderson : VIEWER]: Not sure if it's some kind of noise suppression but your audio is terribly choppy\r\n[17:10] [Sacha Chua : VIEWER]: your audio is choppy for me too =(\r\n[17:10] [Dave Marquardt : VIEWER]: Can confirm \ud83d\ude0a\r\n[17:11] [Nick Anderson : VIEWER]: works fine there\r\n[17:11] [Sacha Chua : VIEWER]: Yeah the server seems to have reasonable CPU load and memory\r\n[17:11] yantar92 is now the presenter\r\n[17:12] [Sacha Chua : VIEWER]: I can hear you better now\r\n[17:12] [Nick Anderson : VIEWER]: its better now\r\n[17:12] [Sacha Chua : VIEWER]: Also there were a bunch of Org-related talks at EmacsConf, fun! =)\r\n[17:13] [Sacha Chua : VIEWER]: I'm mulling over how to use whisper.el and org-capture to stick speech-to-text notes into an Org file =)\r\n[17:14] [Nick Anderson : VIEWER]: I use whisper.el\r\n[17:14] [Sacha Chua : VIEWER]: Yeah it should be pretty straightforward\r\n[17:14] [Nick Anderson : VIEWER]: every day\r\n[17:14] [Nick Anderson : VIEWER]: It's slow, but serviceable. \r\n[17:15] [Sacha Chua : VIEWER]: Nick: If you come across something that works with streaming output so that it's easier to keep track of what I was talking about, I'd love to hear about it! =)\r\n[17:15] [Nick Anderson : VIEWER]: thats what i am looking for too, there are somethings out but i haven't seen things stiched together\r\n[17:15] [Nick Anderson : VIEWER]: There was a new msft thing that i mean to look more into i think\r\n[17:16] [Sacha Chua : VIEWER]: I checked out SimulStreaming and that might be interesting but I haven't integrated it into Emacs yet. \r\n[17:17] [Nick Anderson : VIEWER]: 30 sec windows\r\n[17:17] [Sacha Chua : VIEWER]: Oooh, I think ideally I would press an org-capture-like key, start recording, press C-c C-c or something similar to finish the note, and have the transcription and saving happen asynchronously so I can get back to working on stuff.\r\n[17:18] [Nick Anderson : VIEWER]: yeah \r\n[17:18] [Nick Anderson : VIEWER]: i just want it to happen in real time \ud83d\ude01\r\n[17:21] [Nick Anderson : VIEWER]: when i go rambling for a while i dont enjoy waiting for the transcription to finish. whisper.el works pretty well for short things.\r\n[17:21] [Nick Anderson : VIEWER]: 10s of seconds or minutes \r\n[17:21] [Nick Anderson : VIEWER]: is \"long\" for me\r\n[17:22] [Nick Anderson : VIEWER]: right now it seems to take about as long as i speak\r\n[17:23] [Sacha Chua : VIEWER]: I was also thinking of exploring a client-server model that can keep the language model in memory\r\n[17:23] [Nick Anderson : VIEWER]: hum im using base and language\r\n[17:23] [Nick Anderson : VIEWER]: OOOOOOH\r\n[17:23] [Nick Anderson : VIEWER]: yeah it's nil\r\n[17:23] [Sacha Chua : VIEWER]: oooooh I should try whisper-use-threads\r\n[17:23] [yantar92 : MODERATOR]: (use-package whisper\r\n    :straight (whisper :host github :repo \"natrys\/whisper.el\")\r\n    :bind\r\n    (\"\" . whisper-run)\r\n    :config\r\n    (setq whisper-install-directory \"~\/Dist\/\"\r\n  \twhisper-model \"base\"\r\n          whisper-language \"en\"\r\n          whisper-translate nil\r\n          whisper-use-threads (- (num-processors) 1)))\r\n[17:23] [Sacha Chua : VIEWER]: Oh it says default is whisper.cpp default (number of cores but max 4)\r\n[17:24] [Nick Anderson : VIEWER]: ok much better\r\n[17:24] [Nick Anderson : VIEWER]: Thanks \r\n[17:24] [Sacha Chua : VIEWER]: Ooooh, faster\r\n[17:25] [Nick Anderson : VIEWER]: ioll have to re-check for gpu\r\n[17:26] [Nick Anderson : VIEWER]: nice\r\n[17:26] [Sacha Chua : VIEWER]: Hmm, neat\r\n[17:27] [Sacha Chua : VIEWER]: (you probably mean speech recognition artefacts instead of speed recognition artefacts in your prompt)\r\n[17:28] [Sacha Chua : VIEWER]: Yeah, this year I learned how to use the initial_prompt for whisper to get it to more often spell Emacs correctly when transcribing the talks =)\r\n[17:28] [Sacha Chua : VIEWER]: Maybe it's in one of the arguments\r\n[17:28] [Nick Anderson : VIEWER]: yant\/gptel-cleanup-voice-recognition: https:\/\/github.com\/yantar92\/emacs-config\/blob\/4309703807d6af547db6c9d304e5ceb21fd79cd4\/config.org?plain=1#L8522-L8562\r\n[17:29] [Sacha Chua : VIEWER]: Yeah, it does!\r\n[17:29] [Sacha Chua : VIEWER]: So you can give it a hint about whether you want punctuation and capitalization, skip filler words or include them, etc.\r\n[17:30] [Sacha Chua : VIEWER]: and technical terms\r\n[17:32] [org-user : VIEWER]: Any tips for Org tables that have wide columns, other than setting the width?\r\n[17:33] [Sacha Chua : VIEWER]: phscroll?\r\n[17:33] [Sacha Chua : VIEWER]: https:\/\/github.com\/misohena\/phscroll\r\n[17:34] [org-user : VIEWER]: phscroll looks interesting. Thanks!\r\n[17:34] [Sacha Chua : VIEWER]: Oh, it could be fun to have a records-like view of a single row\r\n[17:34] [org-user : VIEWER]: Exactly\r\n[17:34] [Sacha Chua : VIEWER]: so like, you pop the row out into a different buffer that has the headers and the row values, with shortcuts for going to the next\/previous rows...\r\n[17:35] [Sacha Chua : VIEWER]: ... what, we have multiline tables now?\r\n[17:35] [Sacha Chua : VIEWER]: Neat!\r\n[17:36] [org-user : VIEWER]: Thanks, Ihor!\r\n[17:44] [yantar92 : MODERATOR]: https:\/\/list.orgmode.org\/orgmode\/878rkyarvm.fsf@localhost\/\r\n[17:46] [org-user : VIEWER]: Any timelines on the latex preview revamp?\r\n[17:49] [karthink : VIEWER]: Waiting for free time to work on it again, probably later this month\r\n[17:49] [karthink : VIEWER]: Yeah, there's also a gptel backlog\r\n[17:50] [karthink : VIEWER]: Yes, I think you were running sleep in a loop\r\n[17:51] [Nick Anderson : VIEWER]: I've got this thing that I've been thinking about for a while to do a double capture for helping my inter-linking.\r\n\r\nI have different capture templates for each meeting.\r\nI have a capture template for my \"worklog\" which goes to a note for today and clocks time.\r\n\r\nWhen I capturef or meetings, it's an immediate finish and then i want to capture to my worklog so that from worklog I have a link to that meeting and then my time is clocked in worklog.\r\n\r\nI guess probably use org-capture-after-finalize-hook\r\n\r\n\r\n[17:52] [Nick Anderson : VIEWER]: emacs news is more interesting \ud83d\ude01\r\n[17:56] [org-user : VIEWER]: Ihor, what was providing the completion when you were editing the \"straight\" invocation (completion for the supported keywords etc)\r\n[17:59] [Nick Anderson : VIEWER]: \/meetings\/org-meetup-DATE.org and \/worklog\/YYYY-MM-DD.org with entries for things I do, one for example links to the org-meetup for this date.\r\n[17:59] [Nick Anderson : VIEWER]: all clocked time is in worklog\/*.org files \r\n[17:59] [Nick Anderson : VIEWER]: yes, because I use %%a to link back to where i just was\r\n[18:00] [Nick Anderson : VIEWER]: so then worklog has an id link to the meeting\r\n[18:00] [Nick Anderson : VIEWER]: ? I dont understand what you mean in sequence\r\n[18:00] [Nick Anderson : VIEWER]: Right now it's manual yeah i capture for one, then i trigger captuer again\r\n[18:01] [Nick Anderson : VIEWER]: yeah thats what i was thinking after finalize hook but fishing for better ideas.\r\n[18:01] [Nick Anderson : VIEWER]: humm thanks\r\n[18:04] [yantar92 : MODERATOR]: https:\/\/github.com\/minad\/corfu\r\n[18:06] [yantar92 : MODERATOR]: https:\/\/github.com\/bradmont\/page-view\r\n[18:08] [Nick Anderson : VIEWER]: Just for trying to explain ... but doesn't need covered more I think  ... Basically in my worklog I want this:\r\n\r\n# ```\r\n# * IN_PROGRESS Org Meetup                                            :meeting:\r\n# :properties:\r\n# :prior_context: [[id:82a41521-2267-4c4d-bca4-e79d5ab6f6ee][Org meetup 2025-12-10]]\r\n# :ID:       edeb7194-1c2d-4e4a-a7ef-0ccd8066b2b0\r\n# :end:\r\n# :LOGBOOK:\r\n# CLOCK: [2025-12-10 Wed 10:39]\r\n# CLOCK: [2025-12-10 Wed 10:19]--[2025-12-10 Wed 10:38] =>  0:19\r\n# :END:\r\n\r\n# ```\r\n\r\nThen that prior_context links to this node in the meeting specific file.\r\n\r\n\r\n# ```\r\n# ** Org meetup 2025-12-10\r\n# :PROPERTIES:\r\n# :ID:       82a41521-2267-4c4d-bca4-e79d5ab6f6ee\r\n# :END:\r\n# ```\r\n\r\n\r\nAll I get from that is the link to this meeting file which happened today where I was clocking time without having to trigger another capture manually.\r\n[18:08] [yantar92 : MODERATOR]: https:\/\/orgmode.org\/worg\/org-contrib\/babel\/intro.html\r\n[18:09] [Nick Anderson : VIEWER]: yeop\r\n[18:10] [Nick Anderson : VIEWER]: yes, yes \r\n[18:11] [Nick Anderson : VIEWER]: I captrue to the meeting and immediately capture to worklog (it's clocking time) yes, i follow the backlink back to the meeting note and keep taking notes.\r\n[18:11] [Nick Anderson : VIEWER]: its just so that i can navigate around to specific context\r\n[18:11] [Nick Anderson : VIEWER]: im apparently bad ad explaining it shortly \r\n[18:12] [Nick Anderson : VIEWER]: its my custom workflow yes indeed\r\n[18:12] [Nick Anderson : VIEWER]: Each day i have a new worklog file.\r\n[18:13] [Nick Anderson : VIEWER]: it links to all the other notes for things i did in the day, all worklog is for is holidng clock time\r\n[18:13] [Nick Anderson : VIEWER]: and a short overview of all i did that day in the one file\r\n[18:13] [Nick Anderson : VIEWER]: in the worklog file\r\n[18:13] [Nick Anderson : VIEWER]: its just a heading \r\n[18:13] [Nick Anderson : VIEWER]: yep\r\n[18:13] [Nick Anderson : VIEWER]: worklog\/YYYY-MM-DD.org\r\n[18:14] [Nick Anderson : VIEWER]: meetgins\/org-meetup\/YYYY-MM-DD.org \r\n[18:14] [Nick Anderson : VIEWER]: yes \r\n[18:14] [Nick Anderson : VIEWER]: something like that\r\n[18:16] [Nick Anderson : VIEWER]: yeah thats like backwards from what im doing\r\n[18:16] [Nick Anderson : VIEWER]: but also useful and something i also have and use\r\n[18:16] [Nick Anderson : VIEWER]: anyway, thank you\r\n[18:17] [Nick Anderson : VIEWER]: As I get interrupted I open new captures and then have to eventually unwind and finish them off\r\n[18:18] [Nick Anderson : VIEWER]: Which is probably related to why my notes are in a different file from the active captrue that is clocking the time\r\n[18:19] [Nick Anderson : VIEWER]: yeah i still dont use agenda \ud83d\ude01\r\n[18:20] [karthink : VIEWER]: Quick question about org-export-before-processing-functions: Does this run in the current buffer or in the export buffer (copy of current Org buffer)?\r\n[18:21] [karthink : VIEWER]: Got it, thanks.\r\n[18:21] [yantar92 : MODERATOR]: [[info:org#Advanced Export Configuration][org#Advanced Export Configuration]]\r\n[18:22] [karthink : VIEWER]: Also,  I was wondering: is insert-buffer-substring more efficient than running (buffer-string) and inserting the string into another buffer?  It looks like it might be, in which case org-export's memory usage can be decreased a little\r\n[18:23] [karthink : VIEWER]: Since insert-buffer-substring copies bytes directly and doesn't create an intermediate string object -- at least that's my impression from a cursory look at the source.\r\n[18:25] [karthink : VIEWER]: org-element--generate-copy-script\r\n[18:25] [karthink : VIEWER]: Look for str in this function\r\n[18:26] [karthink : VIEWER]: It triggers once per export, right?\r\n[18:27] [karthink : VIEWER]: export is memory usage heavy, so I thought we could reduce some GC pressure\r\n[18:28] [karthink : VIEWER]: Essentially one `(buffer-string)` worth of memory\r\n[18:28] [karthink : VIEWER]: Yeah, just a thought for now\r\n[18:33] [karthink : VIEWER]: Any news on your Org refactoring attempt, Ihor?\r\n[18:34] [karthink : VIEWER]: I can relate\r\n[18:34] [org-user : VIEWER]: What would the refactoring achieve?\r\n[18:36] [org-user : VIEWER]: I can see why this would be time-consuming, but useful when done\r\n[18:36] [org-user : VIEWER]: Heh\r\n[18:39] [yantar92 : MODERATOR]: https:\/\/list.orgmode.org\/orgmode\/874j6zlhpu.fsf@localhost\/\r\n[18:39] [yantar92 : MODERATOR]: more details on refactoring\r\n[18:41] [oylenshpeegul : VIEWER]: Thank you!\r\n[18:41] [Dave Marquardt : VIEWER]: Thanks!\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[BLOG] #25 bbb:OrgMeetup on Wed, December 10, 19:00 UTC+3"},{"date":"2026-01-07T05:20:08.903Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/e58aa11e-3c80-42a5-8204-5755e35472fe@gmail.com","message-id":"e58aa11e-3c80-42a5-8204-5755e35472fe@gmail.com","config":false,"refs-count":3,"username":"Jacob S. Gordon","related-refs":["e58aa11e-3c80-42a5-8204-5755e35472fe@gmail.com"],"from":"jacob.as.gordon@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] Behaviour of \u2018org-agenda-clock-goto\u2019 with \u2018repeated\u2019 tasks"},{"date":"2026-01-02T05:51:49.793Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CABvCZ42dZahYsE0CLQ=jTUDeG_3=8ru3Q5W_r5g+zghgJ43hqQ@mail.gmail.com","message-id":"CABvCZ42dZahYsE0CLQ=jTUDeG_3=8ru3Q5W_r5g+zghgJ43hqQ@mail.gmail.com","config":false,"refs-count":1,"username":"Troy Brown via General discussions about Org-mode.","related-refs":["CABvCZ42dZahYsE0CLQ=jTUDeG_3=8ru3Q5W_r5g+zghgJ43hqQ@mail.gmail.com"],"from":"emacs-orgmode@gnu.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org Source Blocks Don't Respect User's Major Mode Configuration"},{"date":"2025-12-26T10:52:06.639Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87secxh5wt.fsf@localhost","message-id":"87secxh5wt.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","references":["87zf94oe0y.fsf@localhost"],"related-refs":["87secxh5wt.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nHere are (finally) the meetup notes.\r\n\r\nTL;DR: EmacsConf, FSF40 hackathon, Org&GSoC, literate config pros\/cons, LLM contributions\r\nto Org, LLM usefulness beyond generating code, installing Git version of Org mode,\r\norg-social, Org LaTeX export CJK, plans for Org 9.8 and Org 10.0, rx notation,\r\ndigging across refactorings via magit-file-dispatch, Woof! status,\r\nwhisper.el speech-to-text, office hours of WORG maintainer.\r\n\r\n- We started from me coming a bit late. Oh, well. This time of the year, time zone\r\n  make it a bit harder for me to make back from work in time. Still, I do not\r\n  want to make changes in the meetup schedules. Otherwise, people will be confused.\r\n- Anyway... we started from the latest Emacs News https:\/\/sachachua.com\/blog\/2025\/11\/2025-11-10-emacs-news\/\r\n- Sacha Chua reminded that EmacsConf is around the corner, with (as usual), a number of\r\n  talk related to Org mode coming.\r\n  - See https:\/\/emacsconf.org\/2025\/talks\/\r\n  - I started scrolling through, but none of the talks became a topic-starter\r\n\r\n- Sacha also reminded about the FSF 40-year anniversary hackathon (Nov 21-23)\r\n  - At the time of the meetup, a couple of people expressed interest\r\n    participating, so I shared some links to make them connect easier\r\n    https:\/\/old.reddit.com\/r\/orgmode\/comments\/1olysbt\/ann_contribute_to_org_mode_during_fsf40_hackathon\/nnl35oa\/\r\n  - By the time of me writing this, the hackathon ended\r\n  - The Org mode participated with one task:\r\n    https:\/\/orgmode.org\/worg\/fsf40-hackathon-org.html\r\n  - That was pretty exciting (the team working on Org mode's task got\r\n    a prize), but I am getting away from what has happened during the\r\n    meetup, so let's move on\r\n\r\n- Morgan asked about previous hackathons\r\n  - I do not know about hackathons, but Org mode previously\r\n    participated in similar event - Google Summer of Code\r\n  - There were several projects that are described in now-archived WORG pages\r\n    https:\/\/git.sr.ht\/~bzg\/worg\/tree\/master\/item\/archive\/gsoc2012\r\n  - Unlike short-term hackathon Google Summer of Code is, well..., summer of code\r\n  - AFAIK, the projects did get substantial progress, but none\r\n    yielded final working code that got widely used. Alas.\r\n\r\n- Matthias asked about my literate Emacs configuration\r\n  - It is public, available at https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org\r\n  - System config at https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/system-config.org\r\n  - Christian noticed my old opening of the config with \"I do not do\r\n    much programming\". It was indeed the case in the past, when I\r\n    mostly did Elisp\/bash\/gnuplot. Not so much these days - I do a lot\r\n    more programming than before. Still, I am not a professional\r\n    developer. My background is materials science, although I was into\r\n    algorithms at school and early during my bachelor.\r\n    - Sacha: Python and shell scripts are totally programming\r\n  - We then moved to discussing the benefits of literate configuration\r\n    - Literate config is not really needed when the config is short and simple\r\n    - But everyone knows about the horrors of Emacs bankruptcy, and well-documented\r\n      literate config can save from it. (And not-so-well-documented may delay it.)\r\n    - My config is a bit too complex (17+k lines) to keep track of\r\n      everything in my head (and in comments), it is a must-have for\r\n      me, with many notes being notes to future self.\r\n    - Sacha Chua likes literate config as it can be published and can have\r\n      handy hyperlinks.\r\n      - Published config can be useful as people may give feedback\r\n        that improves things\r\n      - Ihor: Of course, that would only work if many people go and\r\n        read that config :)\r\n    - Ihor: The peak of popularity of literate configs was a few years\r\n      ago (on Reddit), when people were publishing their own literate\r\n      configs left and right. Not as much these days, with people who\r\n      do find value, using it quietly.\r\n\r\n- Morgan asked whether contributions written by LLM can be accepted to Org mode\r\n  - Currently not. Mostly because copyright status of such contributions\r\n    is not clear - there is a legal risk that accepting such patches\r\n    may endanger GPL license enforcement.\r\n  - There was a long discussion on private GNU lists about this, and\r\n    the only practical outcome is that we \"wait and see\" until ongoing\r\n    lawsuits clear\r\n    - There were many arguments for and against, but no agreement yet.\r\n  - Also, see https:\/\/list.orgmode.org\/87sed5dj2l.fsf@localhost\/T\/#m27be3d7533b961db1ad8bf14c85a32633cfd76ad\r\n  - Morgan also asked about ethical stance on materials used to train LLMs\r\n    - AFAIK, RMS indeed suggests that LLMs should be trained on free\r\n      software and not proprietary - mostly to make sure that there is no risk\r\n      of copyright infringement when LLM accidentally produces parts of\r\n      training materials\r\n  - *but it does not mean that LLMs should be ignored*\r\n    - LLMs can be still extremely valuable to assist with code analysis,\r\n      suggesting improvements (in words), identifying bugs, even trivial\r\n      (and no so trivial) grammar checks.\r\n    - I showcased how one can use gptel package in Emacs to load Org\r\n      source code file into LLM context and do talk about possible\r\n      code improvements -- not to suggest specific code, but to spell out\r\n      problematic points and possible ideas\r\n      - LLMs have pretty wide context windows these days\r\n\tRoughly in order of 0.5MB context for the latest models and\r\n\troughly 128kB for newer local models. 0.5MB is enough to load\r\n\tmany codebases in full (and there are tricks to load even\r\n        larger, via tools).\r\n    - I'd say that ignoring LLMs is a plain oversight these days.\r\n      They can really save a lot of time when using appropriately.\r\n      For example, they can very accurately suggest which function\/library\r\n      is more suitable for a given task, tailored for *your* task\r\n      specifics, especially when enough context is provided.\r\n      - Of course, mistakes do happen (some people just blindly trust\r\n        LLMs, which is also a mistake), but the newest generation of\r\n        agentic loops that involve search and linking to sources can\r\n        be easily fact-checked while still achieving good time\r\n        savings.\r\n\r\n- Rudy had an issue with git version of Org mode. He tried to use it, but\r\n  kept getting built-in Org mode loaded\r\n  - We debugged a bit, and things boiled down to setting up load-path\r\n    early enough, so that nothing ever triggers Org loading before load-path is\r\n    appropriately set (that would load built-in Org version)\r\n  - Also, he used ~make native~, which is not really the correct way to\r\n    get native-compiled Org into actual Emacs session. ~make native~ creates\r\n    =.eln= files locally, inside Org folder, which is not what Emacs expects.\r\n    That target is rather designed to diagnose native compilation\r\n    warnings, not to install things (which is why Org mode manual\r\n    simply suggests make compile)\r\n    - Instead, you should rely on Emacs itself auto-compiling things\r\n      and storing into =~\/.emacs.d\/eln-cache=. But need to make sure\r\n      that ~load-path~ is set early to use the correct Org version.\r\n    - There is ~comp-num-cpus~ to control the number of parallel native compilation\r\n      threads. By default, Emacs uses half of CPUs. You can change it using\r\n      ~native-comp-async-jobs-number~\r\n\r\n- Morgan asked about org-social\r\n  https:\/\/github.com\/tanrax\/org-social\r\n  - org-social is a text-based social network based on pure .org files\r\n    - with comments and reactions :)\r\n  - org-social author recently reached out to Org mailing list\r\n    proposing Org devs to have dedicated org-social feed\r\n    https:\/\/yhetil.org\/orgmode\/f137a13a-8c9d-4a52-a6fb-6ac92b69f7f5@andros.dev\/\r\n    - I would not mind, as long as the process does not add\r\n      maintenance burden (on top of existing Reddit\/mastodon\/email\r\n      mess). In other words, I am after automation - say, auto-feeding org-social from\r\n      https:\/\/tracker.orgmode.org\/news.org (that is built from mailing list emails)\r\n\r\n- Pedro A. Aranda presented his work on Org LaTeX export improvements\r\n  for non-English documents. His talk during EmacsConf:\r\n  https:\/\/emacsconf.org\/2025\/talks\/latex\/\r\n  - He was specifically talking about supporting Chinese\/CJK\r\n    which requires specialized setup. We got suggestions from Chinese\r\n    Emacs users\r\n    https:\/\/emacs-china.org\/t\/help-implementing-better-out-of-the-box-xelatex-export-in-org\/30405\r\n\r\n- karthink asked about merging Org mode to upstream Emacs master\r\n  - We merge on minor\/major releases, not bugfix releases\r\n  - So, nothing planned soon\r\n  - But I do want to time the release no later than next Emacs version\r\n    branch is frozen\r\n  - karthink asked in the context of his work on merging the async\r\n    LaTeX preview branch\r\n    - My tentative thinking is to make a minor release soonish (Org 9.8),\r\n      and leave the LaTeX preview and a number of other planned major\r\n      changes to next release, which will tentatively be Org 10.0 -\r\n      actual major release after many years\r\n      - kathink commented that timeline for LaTeX preview is unclear,\r\n\tmostly because of his workload with gptel and the annoyingly\r\n\tdifficult ob-latex changes. ob-latex is partially broken even\r\n\ton main, let alone adapting it to the new preview system\r\n    - Also, I've got issues with Org parser on the latest Emacs master,\r\n      need to investigate before thinking about the release.\r\n      - Morgan commented that some issues might be caused by the code\r\n        he contributed, but it is unlikely, or rather not directly\r\n\t1. Parser problem is totally unrelated\r\n\t2. Another problem I mentioned with clock tables handling is likely\r\n\t   something to do with a known bug in ~org-element-cache-map~,\r\n\t   which can now be trigerred more frequently as the newest\r\n           clocktable code uses parser\r\n\r\n- Morgan asked about one of his patches, where he is using rx regexps\r\n  - It was related to re-writing one of the regexp from pure string\r\n    (with backslash hell) to (rx ...). What he was referring to is my\r\n    comment that going full on better readability means that we may as\r\n    well use more verbose rx constructs like ~(rx (optional ...))~ vs\r\n    ~(rx (? ...))~.\r\n    - See 35.3.3.1 Constructs in \u2018rx\u2019 regexps in Elisp manual\r\n  - Context: https:\/\/list.orgmode.org\/orgmode\/871pm78hvp.fsf@localhost\/\r\n\r\n- Along the way, I was looking into history of some pieces of code in Org\r\n  - I typically use ~M-x magit-file-dispatch~ (=C-x M-g=) with region active\r\n    to get access to git history (similar, but built-in - ~vc-region-history~)\r\n  - Sometimes, the git history spans beyond current file or region; for example,\r\n    when code snippet got moved during refactoring\r\n    - Then, in magit log buffer, I can hit <RET> on relevant commit,\r\n      navigate to the old diff chunk and press <RET> there - it will\r\n      resurrect the old version of the file the region was originally\r\n      located. I can then repeat the process with =C-x M-g= right from that\r\n      file, to dig even further into the history.\r\n\r\n- Morgan asked about the state of our bug tracker (it lists some closed bugs)\r\n  - Well. It is waiting for a rewrite. See warning message in\r\n    https:\/\/orgmode.org\/worg\/org-contribute.html#org3db9b95\r\n  - Bastien has been developing the bug tracker, but he has job\r\n    changes and other personal matters that make it difficult for him\r\n    to find spare time for extra dev work.\r\n    Do remember that https:\/\/codeberg.org\/bzg\/woof\/ is there, with all the\r\n    source code available, and hackable. Patches will likely be welcome.\r\n  - I am mostly ignoring that tracker, except making sure that announcements\r\n    and requests for comments are passing through, as they are used by automated\r\n    bots that re-distribute these announcements to rss\/matrix chat\r\n  - For bugs that are not properly closed,  I can try using admin access to re-trigger\r\n    closure, but I will probably do it closer to the next Org release as a part\r\n    of spring-cleaning\r\n  - Morgan asked whether bugs can be categorized vs. specific library\r\n    - We discussed such feature in the past, but it is not implemented\r\n      (Bastien has very limited time these days)\r\n\r\n- Nick Anderson asked about using whispter.el to input text into Org files by voice\r\n  - He is particularly interested in real-time input\r\n  - I have seen\r\n    https:\/\/github.com\/ggml-org\/whisper.cpp?tab=readme-ov-file#real-time-audio-input-example\r\n    - However, in my tests, that did not work very well, likely because it uses small\r\n      chunks of voice as input, that loses broader context, making the quality of\r\n      voice recognition degrade significantly\r\n  - I personally use <record start> \/ <record stop> (M-x whisper-run) to explicitly mark\r\n    beginning\/end of recording. This works fairly well.\r\n  - Someone also mentioned https:\/\/github.com\/vndee\/local-talking-llm\r\n    to play back the text (opposite to whisper recognizing speech)\r\n\r\n- We then went a bit into tangent - gptel (LLM UI for Emacs)\r\n  - My usage of whisper.cpp is combined with gptel\r\n    - I have whisper output directly fed into gptel to clean up inaccuracies\r\n    - I use @voice preset for this:\r\n      https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#voice-input\r\n    - I recently got some errors with that preset, but karthink (the author or gptel)\r\n      said that nothing changed in the APIs I am using to implement the preset.\r\n      [2025-12-22 Mon] I narrowed this down to tools being enabled. Not sure what\r\n      happened with tool calls, but disabling those fixed the problem.\r\n    - Continuing the topic of agents (my voice prompt filter as a simple agent),\r\n      Nick Anderson mentioned agent-shell\r\n      - Karthink shared that he recently released https:\/\/github.com\/karthink\/gptel-agent\r\n\t- That reminded me of agent APIs out there like https:\/\/www.kaggle.com\/code\/kaggle5daysofai\/day-1b-agent-architectures\r\n\t- Karthink said that gptel-agent is much simpler though:\r\n\t  \"Just tools + prompts for gptel, no connection to ACP or agent SDKs\"\r\n\r\n- Morgan asked about \"office hours\" from our WORG maintainer (Christian Moe)\r\n  https:\/\/list.orgmode.org\/878qn3h98b.fsf@christianmoe.com\r\n  - I am not sure if those office hours are something akin meetup. My\r\n    reading of that message is rather \"work on worg actively\", but one\r\n    can of course ask Christian.\r\n  - Note that there is a number of online and offline Emacs-related meetups\r\n    You can follow https:\/\/emacslife.com\/calendar\/\r\n\r\n:chat:\r\n[17:04] yantar92 is now the presenter\r\n[17:05] [yantar92 : MODERATOR]: The latest Emacs News: https:\/\/sachachua.com\/blog\/2025\/11\/2025-11-10-emacs-news\/\r\n[17:09] [Sacha Chua : VIEWER]: There are a few Org-related talks at the upcoming EmacsConf (Dec 6-7) =) https:\/\/emacsconf.org\/2025\/talks\/  Just letting people know in case that's not on their radar yet!\r\n[17:09] [Sacha Chua : VIEWER]: Also FSF Hackathon Nov 21-23\r\n[17:09] [Morgan : VIEWER]: Has anyone expressed interest in working on org-mode stuff during the fsf hackathon?  I would be interested in joining a team\r\n[17:12] [yantar92 : MODERATOR]: https:\/\/old.reddit.com\/r\/orgmode\/comments\/1olysbt\/ann_contribute_to_org_mode_during_fsf40_hackathon\/nnl35oa\/\r\n[17:13] [Morgan : VIEWER]: have there been previous hackathons like this?  I'm curious about what kind of things people have done previously.  I'm wondering what kind of project I should attempt\r\n[17:17] [Matthias : VIEWER]: do you publish your init.el?\r\n[17:18] [Morgan : VIEWER]: Are you asking about Ihor's init.el?  That's here I think: https:\/\/github.com\/yantar92\/emacs-config\r\n[17:19] [Matthias : VIEWER]: thank you\r\n[17:20] [Christian : VIEWER]: I like how Ihor's config.org starts with \"I do not do much programming\" \ud83d\ude0a\r\n[17:22] [Sacha Chua : VIEWER]: Python and shell scripts are totally programming.\r\n[17:24] [Morgan : VIEWER]: I tried doing it once but I never really figured out what the benifit was over just having comments in the init.el\r\n[17:26] [Sacha Chua : VIEWER]: I like having easy hyperlinks and publishing. =)\r\n[17:26] [zororg : VIEWER]: audio got cut off?\r\n[17:26] [Nick Anderson : VIEWER]: Lost audio.\r\n[17:26] [Morgan : VIEWER]: oh that's awesome\r\n[17:26] [Sacha Chua : VIEWER]: Because then people can occasionally tell me about the totally built-in way to do something I wrote a 100+-line elisp function for. \ud83d\ude09\r\n[17:27] [Morgan : VIEWER]: you're back\r\n[17:27] [Sacha Chua : VIEWER]: also I can hyperlink to parts of my config\r\n[17:28] [Sacha Chua : VIEWER]: but it's prettier when I post it \ud83d\ude09\r\n[17:28] [Sacha Chua : VIEWER]: (... hah, no, I still just write mostly for myself \ud83d\ude09 )\r\n[17:33] [Morgan : VIEWER]: does org-mode accept contributions written by LLM's?  I haven't looked into LLM's like at all mostly because of intellectual property ownership questions\r\n[17:35] [Morgan : VIEWER]: if we had an LLM trained only on FSF software would that be ok?\r\n[17:36] [Morgan : VIEWER]: interesting.  guess i will continue ignoring this software category\r\n[17:39] [Morgan : VIEWER]: did you load the whole source file into the LLM?  they can accept input that large?\r\n[17:40] [Sacha Chua : VIEWER]: see y'all around!\r\n[17:40] [Rudy : VIEWER]: Q.  Now that I contribute to Org, I have its Git version in my load path.  It works, but I am unable to native-compile it.  I tried `make native` and also native-compile everything I have on the load path with`(native-compile-async load-path t)`.  Yet, `org-mode` is till an interpreted function, and damn slow (e.g. 1-file tangle with 80 lines takes 11 seconds and similar; quite unusable).\r\n[17:41] [Morgan : VIEWER]: thanks for showing me the LLM stuff.  maybe I will look into it after all \ud83d\ude0a\r\n[17:50] Rudy is now the presenter, set by yantar92\r\n[17:50] [zororg : VIEWER]: anyone of you tried org-social ?\r\nis it something interesting to use or adapt day to day?\r\n[17:51] [Morgan : VIEWER]: I am also interested in org-social and am waiting for other's opinions\r\n[17:51] yantar92 is now the presenter, set by yantar92\r\n[17:52] [Morgan : VIEWER]: I wonder if we could make the news file in the repo into an org social file\r\n[17:53] [zororg : VIEWER]: https:\/\/yhetil.org\/orgmode\/f137a13a-8c9d-4a52-a6fb-6ac92b69f7f5@andros.dev\/\r\n[17:53] [yantar92 : MODERATOR]: https:\/\/tracker.orgmode.org\/news.org\r\n[17:58] [Pedro A. Aranda : VIEWER]: Hi, TZ woes. I just arrived...\r\n[17:59] [Morgan : VIEWER]: If the Sacha Chua blog didn't tell me the new time I would've been the same \ud83d\ude1c.  I detest DST.\r\n[18:04] [yantar92 : MODERATOR]: https:\/\/emacsconf.org\/2025\/talks\/latex\/ - this is who is talking\r\n[18:04] Pedro A. Aranda is now the presenter, set by yantar92\r\n[18:10] [Rudy : VIEWER]: My Org is flying super-fast!  I moved `(add-to-list 'load-path \"~\/org\/src\/org-mode\/lisp\")` to `~\/.emacs.d\/early-init.el` and Org is native-compiled.  I also re-tried after `make clean`, and it works.  (That said, Emacs keeps compiling more and more \"as needed\", which slows down the machine, so `(native-compile-async load-path t)` is a good idea to AOT-compile everything, I think.)  Anyway, no need to share the screen.\r\n[18:10] [karthink : VIEWER]: Ihor, what is the approximate deadline for merging Org into master next?\r\n[18:11] yantar92 is now the presenter, set by yantar92\r\n[18:11] [karthink : VIEWER]: I can prioritize merging org-latex-preview, I would really like to see it in the next version of Org\r\n[18:12] [yantar92 : MODERATOR]: comp-num-cpus\r\n[18:12] [visuwesh : VIEWER]: karthik: I've been meaning to mention this in the ML but I keep forgetting but have you had a chance to look at https:\/\/github.com\/tecosaur\/org-latex-preview-todos\/issues\/43? This still bites me \r\n[18:13] [Christian : VIEWER]: Audio lost?\r\n[18:14] [karthink : VIEWER]: I can hear you again\r\n[18:14] [Rudy : VIEWER]: BTW, `native-comp-async-jobs-number` is documented to support 0 (half the number of cores) or 1 (use one core).  No way to specify, e.g. 4 cores, it seems.\r\n[18:14] [Rudy : VIEWER]: This message has been deleted by Rudy\r\n[18:14] [Rudy : VIEWER]: `comp-num-cpus` is computed from that. \ud83d\ude0a\r\n[18:15] [karthink : VIEWER]: Okay, the Org 10.0 plan sounds good\r\n[18:16] [karthink : VIEWER]: It's just that without a timeframe\/deadlines I won't finish work on org-latex-preview, since the remaining few TODO items are quite painful to finish (like fixing ob-latex)\r\n[18:16] [Morgan : VIEWER]: 9.8 will be the first release with non-trivial changes from me 0.o.  I'm hoping I didn't breaking anything in org-clock-sum \ud83d\ude10\r\n[18:16] [Morgan : VIEWER]: lol\r\n[18:17] [Morgan : VIEWER]: oh dear\r\n[18:18] [Morgan : VIEWER]: i'm running master and haven't had any issues\r\n[18:19] [Rudy : VIEWER]: I spoke out too soon: the native compiled Org is the one in Emacs.  Looks like adding to `load-path` in `.early-init.el` is not a good idea.\r\n[18:23] [Morgan : VIEWER]: Does Ihor uses inline tasks?  I don't so org-clock-sum issue might be there\r\n[18:45] [karthink : VIEWER]: I missed the first hour, could you give me a summary of the discussion on LLM generated code in Org?\r\n[18:45] [karthink : VIEWER]: It was the \"no need to ignore\" bullet point that I didn't follow\r\n[18:46] [karthink : VIEWER]: Okay, thank you\r\n[18:46] [Morgan : VIEWER]: in a patch review you mentioned I should be doing (rx (optional \"blah\")) instead of (rx (? \"blah\")).\r\n\r\nIs there a resource for creating readable rx constructs?\r\n[18:47] [yantar92 : MODERATOR]: 35.3.3.1 Constructs in \u2018rx\u2019 regexps\r\n[18:47] [Rudy : VIEWER]: Okay, native compilation works.  The key is to `make` again after making mistakes (e.g. compiling a wrong Org), for some reason.  (Probably some timestamp checking.)\r\n[18:48] [Morgan : VIEWER]: completion function for tags matcher i think\r\n[18:49] [Morgan : VIEWER]: i'll look at the info page.  the help page for rx seemed to show ? prominently\r\n[18:49] [yantar92 : MODERATOR]: https:\/\/list.orgmode.org\/orgmode\/871pm78hvp.fsf@localhost\/\r\n[18:51] [Morgan : VIEWER]: what are you using to see the age of code snippets?\r\n[18:51] [karthink : VIEWER]: vc-region-history also works\r\n[18:51] [karthink : VIEWER]: C-x v h\r\n[18:52] [Morgan : VIEWER]: oh that is awesome!  I am a vc user.  will have to check this out\r\n[18:53] [karthink : VIEWER]: How did you go to the old location from magit log\r\n[18:55] [karthink : VIEWER]: Oh, okay, thanks.  I use this feature all the time from the status buffer\r\n[18:55] [karthink : VIEWER]: Didn't think to try it from the log\r\n[18:57] [Morgan : VIEWER]: woof bugs that are clearly closed but still show on the tracker.  what's the deal with that?\r\n[18:58] [Morgan : VIEWER]: can you maually close them using the admin email?\r\n[18:59] [Morgan : VIEWER]: sometimes it would be fun to look at all bugs that touch something in particular.  like the clock stuff.  so i was trying to use woof like that\r\n[19:00] [Morgan : VIEWER]: just doing the mailing list in chronilogically leaves me jumping around the repo quite a bit\r\n[19:01] [Rudy : VIEWER]: I have to bounce, having a lecture in -1 minute. \ud83d\ude0a  Thank you!\r\n[19:02] [Nick Anderson : VIEWER]: I use whisper.el occasionally, curious if anyone has anything working more real time. oh now i do find an emacs-whisper-live but i guess that's using some remote llm\r\n[19:03] [Nick Anderson : VIEWER]: whisper.el takes a whole recording chunk and then does speech to text\r\n[19:04] [Morgan : VIEWER]: it's fine.  it would just be kinda fun to see everything.  at the end of the day the difference between me going through everything chronologically and in a nice order would be minimal\r\n[19:04] [Nick Anderson : VIEWER]: but if i am rambling it wont output text until i end the whisper-run\r\n[19:05] [yantar92 : MODERATOR]: https:\/\/github.com\/ggml-org\/whisper.cpp?tab=readme-ov-file#real-time-audio-input-example\r\n[19:06] [Nick Anderson : VIEWER]: makes sense i guess.\r\n[19:07] [karthink : VIEWER]: Does this usually work?\r\n[19:07] [Nick Anderson : VIEWER]: just a hope that there was something great i was missing.\r\n[19:08] [Nick Anderson : VIEWER]: i had come across faster-whisper before too \r\n[19:09] [Nick Anderson : VIEWER]: yeah doable, just not done yet.\r\n[19:09] [yantar92 : MODERATOR]: https:\/\/github.com\/vndee\/local-talking-llm\r\n[19:09] [Morgan : VIEWER]: Is the first project on this page woof?  I think someone forgot to link the actual project: https:\/\/www.fsf.org\/events\/fsf40-hackathon\r\n[19:10] [karthink : VIEWER]: What are you using for voice transcription, BTW?  I remember seeing your @voice preset before but forgot\r\n[19:11] [karthink : VIEWER]: No changes in the gptel presets or responses API in the last few months\r\n[19:12] [karthink : VIEWER]: so it may be a bug\r\n[19:12] [karthink : VIEWER]: Yeah, no change in the API since then\r\n[19:12] [karthink : VIEWER]: Anyway, this is a cool idea\r\n[19:14] [Nick Anderson : VIEWER]: Oh yeah is anyone playing with agent-shell?\r\n[19:14] [karthink : VIEWER]: I recently released https:\/\/github.com\/karthink\/gptel-agent\r\n[19:14] [Nick Anderson : VIEWER]: OH must see\r\n[19:14] [karthink : VIEWER]: (Just tools + prompts for gptel, no connection to ACP or agent SDKs)\r\n[19:15] [Nick Anderson : VIEWER]: Looks interesting\r\n[19:15] [Nick Anderson : VIEWER]: thank you  karthink\r\n[19:17] [yantar92 : MODERATOR]: https:\/\/www.kaggle.com\/code\/kaggle5daysofai\/day-1b-agent-architectures\r\n[19:18] [Morgan : VIEWER]: One of these I'll look into worg stuff.  On the mailing list I saw there was plans to have a weekly office hour for worg.  Did that ever come to fruition?\r\n[19:18] [Morgan : VIEWER]: https:\/\/list.orgmode.org\/878qn3h98b.fsf@christianmoe.com\r\n[19:18] [Nick Anderson : VIEWER]: org-mode and llms, still looking for the local KB panecea\r\n[19:18] [Morgan : VIEWER]: last line\r\n[19:19] [Morgan : VIEWER]: audio dropped right as you found it \ud83d\ude1c\r\n[19:21] [Morgan : VIEWER]: I was just curious about more opertunities to meet up with people really\r\n[19:21] [Nick Anderson : VIEWER]: there is emacs atx and other meetups\r\n[19:21] [yantar92 : MODERATOR]: https:\/\/emacslife.com\/calendar\/\r\n[19:22] [Morgan : VIEWER]: thanks \ud83d\ude0a will look into\r\n[19:23] [karthink : VIEWER]: Thanks for the meetup\r\n[19:23] [Nick Anderson : VIEWER]: Thansk for doing it\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[BLOG] #24 bbb:OrgMeetup on Wed, November 12, 19:00 UTC+3"},{"date":"2025-12-26T10:09:08.436Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/874ipdimin.fsf@localhost","message-id":"874ipdimin.fsf@localhost","config":false,"refs-count":7,"username":"Ihor Radchenko","references":["87v7hu1ufg.fsf@localhost","CAAMASZ382eJBxFufX8s1UN21HwOoJMi90Q0Cc5gWEzi9hrtF9w@mail.gmail.com","877buo283n.fsf@localhost","CAAMASZ3VGc1iFBg6pyGgCg94xMv=QjThuj2yjx-h=7CbhiuDtA@mail.gmail.com","CAAMASZ25BCTxHtB8Jrug5NR3TAw2rzAAkUu4hA9xMkAvmAKSJQ@mail.gmail.com","87ecoi1jug.fsf@localhost","CAAMASZ2BytXuiJgTMfaxhD+B4xgS5a+6J_B6yhRw=rbg1Ap95w@mail.gmail.com","m2a50ugtiw.wl-rne.kou@icloud.com","87o6nzuerl.fsf@localhost","m2pl9r8yh6.wl-rne.kou@icloud.com","87seen6yfe.fsf@localhost","878qexfm3u.fsf@localhost","m28qf42eho.wl-rne.kou@icloud.com","m2ecosf3mj.wl-rne.kou@icloud.com","87o6p389fr.fsf@localhost","87zf7620es.fsf@localhost"],"related-refs":["874ipdimin.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/874ipdimin.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 6fc6da337243f562947734777ef50975857080a1 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <6fc6da337243f562947734777ef50975857080a1.1766743635.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Sat, 20 Dec 2025 11:58:16 +0100\r\nSubject: [PATCH v3] WIP: Org markup: Allow Unicode punctuation and breakable\r\n symbols around emphasis\r\n\r\n* lisp\/org-element.el (org-element-category-table): Define custom\r\ncategory table adding opening\/closing punctuation, opening\/closing\r\nquotes, dashes, and auxiliary punctuation.\r\n(org-element--parse-generic-emphasis): Extend allowed characters\r\naround emphasis to generic opening\/closing punctuation, quote\r\npunctuation, dash-likes, and auxiliary ,-like punctuation.  Also,\r\nallow breakable characters, like Chinese\/Japanese symbols for\r\nlanguages that do not use spaces.  Make sure that we preserve\r\nboundary asymmetry for :;,!? and similar.\r\n(terminal-punctuation): Helper rx construct matching characters that\r\nare terminal punctuation that is usually followed by space in\r\nlanguages that use spaces (?,!.: and similar).\r\n* lisp\/org.el (org-element-emphasis-pre-re):\r\n(org-element-emphasis-post-re): Add new regexps defining emphasis\r\nboundaries.\r\n* lisp\/org.el (org-mode): Setup category table.\r\n(org-emphasis-regexp-components): Allow pre\/post to be nil to follow\r\nthe new defaults.  Change the default values of pre\/past to nil.\r\n(org-set-emph-re):\r\n(org-do-emphasis-faces):\r\n(org-emphasize): Fall back to parser defaults when pre\/past in\r\n`org-emphasis-regexp-components' is nil.\r\n\r\nLink: https:\/\/list.orgmode.org\/87ecoi1jug.fsf@localhost\/T\/#t\r\n---\r\n lisp\/org-element.el | 78 +++++++++++++++++++++++++++++++++--\r\n lisp\/org.el         | 99 +++++++++++++++++++++++++++++++--------------\r\n 2 files changed, 144 insertions(+), 33 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-element.el b\/lisp\/org-element.el\r\nindex 6abccd001..14b58324f 100644\r\n--- a\/lisp\/org-element.el\r\n+++ b\/lisp\/org-element.el\r\n@@ -3318,6 +3318,79 @@ ;;; Objects\r\n \r\n ;;;; Bold\r\n \r\n+(rx-define terminal-punctuation\r\n+  ;; See https:\/\/www.unicode.org\/Public\/UCD\/latest\/ucd\/PropList.txt\r\n+  (any ?\\x0021 ?\\x002C ?\\x002E (?\\x003A . ?\\x003B) ?\\x003F ?\\x037E\r\n+       ?\\x0387 ?\\x0589 ?\\x05C3 ?\\x060C ?\\x061B (?\\x061D . ?\\x061F) ?\\x06D4\r\n+       (?\\x0700 . ?\\x070A) ?\\x070C (?\\x07F8 . ?\\x07F9) (?\\x0830 . ?\\x0835)\r\n+       (?\\x0837 . ?\\x083E) ?\\x085E (?\\x0964 . ?\\x0965) (?\\x0E5A . ?\\x0E5B)\r\n+       ?\\x0F08 (?\\x0F0D . ?\\x0F12) (?\\x104A . ?\\x104B) (?\\x1361 . ?\\x1368)\r\n+       ?\\x166E (?\\x16EB . ?\\x16ED) (?\\x1735 . ?\\x1736) (?\\x17D4 . ?\\x17D6)\r\n+       ?\\x17DA (?\\x1802 . ?\\x1805) (?\\x1808 . ?\\x1809) (?\\x1944 . ?\\x1945)\r\n+       (?\\x1AA8 . ?\\x1AAB) (?\\x1B4E . ?\\x1B4F) (?\\x1B5A . ?\\x1B5B) (?\\x1B5D . ?\\x1B5F)\r\n+       (?\\x1B7D . ?\\x1B7F) (?\\x1C3B . ?\\x1C3F) (?\\x1C7E . ?\\x1C7F)\r\n+       ?\\x2024 (?\\x203C . ?\\x203D) (?\\x2047 . ?\\x2049) (?\\x2CF9 . ?\\x2CFB)\r\n+       ?\\x2E2E ?\\x2E3C ?\\x2E41 ?\\x2E4C (?\\x2E4E . ?\\x2E4F)\r\n+       (?\\x2E53 . ?\\x2E54) (?\\x3001 . ?\\x3002) (?\\xA4FE . ?\\xA4FF) (?\\xA60D . ?\\xA60F)\r\n+       (?\\xA6F3 . ?\\xA6F7) (?\\xA876 . ?\\xA877) (?\\xA8CE . ?\\xA8CF) ?\\xA92F\r\n+       (?\\xA9C7 . ?\\xA9C9) (?\\xAA5D . ?\\xAA5F) ?\\xAADF (?\\xAAF0 . ?\\xAAF1) ?\\xABEB\r\n+       ?\\xFE12 (?\\xFE15 . ?\\xFE16) (?\\xFE50 . ?\\xFE52) (?\\xFE54 . ?\\xFE57) ?\\xFF01\r\n+       ?\\xFF0C ?\\xFF0E (?\\xFF1A . ?\\xFF1B) ?\\xFF1F ?\\xFF61 ?\\xFF64 ?\\x1039F ?\\x103D0\r\n+       ?\\x10857 ?\\x1091F (?\\x10A56 . ?\\x10A57) (?\\x10AF0 . ?\\x10AF5)\r\n+       (?\\x10B3A . ?\\x10B3F) (?\\x10B99 . ?\\x10B9C) (?\\x10F55 . ?\\x10F59)\r\n+       (?\\x10F86 . ?\\x10F89) (?\\x11047 . ?\\x1104D) (?\\x110BE . ?\\x110C1)\r\n+       (?\\x11141 . ?\\x11143) (?\\x111C5 . ?\\x111C6) ?\\x111CD (?\\x111DE . ?\\x111DF)\r\n+       (?\\x11238 . ?\\x1123C) ?\\x112A9 (?\\x113D4 . ?\\x113D5) (?\\x1144B . ?\\x1144D)\r\n+       (?\\x1145A . ?\\x1145B) (?\\x115C2 . ?\\x115C5) (?\\x115C9 . ?\\x115D7)\r\n+       (?\\x11641 . ?\\x11642) (?\\x1173C . ?\\x1173E) ?\\x11944 ?\\x11946\r\n+       (?\\x11A42 . ?\\x11A43) (?\\x11A9B . ?\\x11A9C) (?\\x11AA1 . ?\\x11AA2)\r\n+       (?\\x11C41 . ?\\x11C43) ?\\x11C71 (?\\x11EF7 . ?\\x11EF8)\r\n+       (?\\x11F43 . ?\\x11F44) (?\\x12470 . ?\\x12474) (?\\x16A6E . ?\\x16A6F)\r\n+       ?\\x16AF5 (?\\x16B37 . ?\\x16B39) ?\\x16B44 (?\\x16D6E . ?\\x16D6F)\r\n+       (?\\x16E97 . ?\\x16E98) ?\\x1BC9F (?\\x1DA87 . ?\\x1DA8A)))\r\n+\r\n+(defvar org-element-category-table\r\n+  (let ((category-table (copy-category-table))\r\n+        (uniprop-table (unicode-property-table-internal 'general-category)))\r\n+    ;; Define categories\r\n+    (define-category ?{ \"Opening punctuation\" category-table)\r\n+    (define-category ?} \"Closing punctuation\" category-table)\r\n+    (define-category ?\\[ \"Initial quote\" category-table)\r\n+    (define-category ?\\] \"Final quote\" category-table)\r\n+    (define-category ?- \"Dash\" category-table)\r\n+    (define-category ?, \"Other punctuation\" category-table)\r\n+    (define-category ?\/ \"Other punctuation non-terminal\" category-table)\r\n+    ;; Map characters to categories according to their general-category\r\n+    (map-char-table\r\n+     (lambda (key val)\r\n+       (pcase val\r\n+         ('Ps (modify-category-entry key ?{ category-table))\r\n+         ('Pe (modify-category-entry key ?} category-table))\r\n+         ('Pi (modify-category-entry key ?\\[ category-table))\r\n+         ('Pf (modify-category-entry key ?\\] category-table))\r\n+         ('Pd (modify-category-entry key ?- category-table))\r\n+         ('Po (modify-category-entry key ?, category-table)\r\n+              (mapc\r\n+               (lambda (c)\r\n+                 (unless (string-match-p (rx terminal-punctuation)\r\n+                                         (make-string 1 c))\r\n+                   (modify-category-entry c ?\/ category-table)))\r\n+               (if (consp key)\r\n+                   (cl-loop for c from (car key) to (cdr key) collect c)\r\n+                 (list key))))))\r\n+     uniprop-table)\r\n+    category-table)\r\n+  \"Category table for Org buffers.\r\n+The table defines additional Unicode categories:\r\n+- ?{ for opening punctuation\r\n+- ?} for closing punctuation\r\n+- ?[ for opening quote\r\n+- ?] for closing quote\r\n+- ?- for dash-like\r\n+- ?, for other punctuation.\r\n+- ?\/ for other punctuation that is non-terminal (not .,!? and similar).\r\n+These categories are necessary for parsing emphasis.\")\r\n+\r\n (defun org-element--parse-generic-emphasis (mark type)\r\n   \"Parse emphasis object at point, if any.\r\n \r\n@@ -3331,7 +3404,7 @@ (defun org-element--parse-generic-emphasis (mark type)\r\n       (unless (bolp) (forward-char -1))\r\n       (let ((opening-re\r\n              (rx-to-string\r\n-              `(seq (or line-start (any space ?- ?\\( ?' ?\\\" ?\\{))\r\n+              `(seq (regexp ,org-element-emphasis-pre-re)\r\n                     ,mark\r\n                     (not space)))))\r\n         (when (looking-at-p opening-re)\r\n@@ -3341,8 +3414,7 @@ (defun org-element--parse-generic-emphasis (mark type)\r\n                   `(seq\r\n                     (not space)\r\n                     (group ,mark)\r\n-                    (or (any space ?- ?. ?, ?\\; ?: ?! ?? ?' ?\\\" ?\\) ?\\} ?\\\\ ?\\[)\r\n-                        line-end)))))\r\n+                    (regexp ,org-element-emphasis-post-re)))))\r\n             (when (re-search-forward closing-re nil t)\r\n               (let ((closing (match-end 1)))\r\n                 (goto-char closing)\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex 67d9679fe..156abc621 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -3823,6 +3823,37 @@ (defcustom org-pretty-entities-include-sub-superscripts t\r\n   :version \"24.1\"\r\n   :type 'boolean)\r\n \r\n+(defconst org-element-emphasis-pre-re\r\n+  (rx (or line-start space\r\n+          ;; opening punctuation\r\n+          (category ?{) (category ?\\[)\r\n+          ;; dashes\r\n+          (category ?-)\r\n+          ;; other punctuation, except Terminal_Punctuation=True\r\n+          ;; Terminal punctuation is .,!? and similar. In languages\r\n+          ;; with spaces, we do not want such punctuation to be\r\n+          ;; a valid boundary.  Languages without spaces will be\r\n+          ;; included within ?| category.\r\n+          (category ?\/)\r\n+          ;; Chinese, Japanese, and other breakable\r\n+          ;; characters\r\n+          (category ?|)))\r\n+  \"Regexp matching character before opening emphasis marker.\r\n+Assumes that `org-element-category-table' is active.\")\r\n+\r\n+(defconst org-element-emphasis-post-re\r\n+  (rx (or space\r\n+          ;; closing punctuation\r\n+          (category ?}) (category ?\\])\r\n+          ;; dashes, other punctuation\r\n+          (category ?-) (category ?,)\r\n+          ;; Chinese, Japanese, and other breakable\r\n+          ;; characters\r\n+          (category ?|)\r\n+          line-end))\r\n+  \"Regexp matching character after opening emphasis marker.\r\n+Assumes that `org-element-category-table' is active.\")\r\n+\r\n (defvar org-emph-re nil\r\n   \"Regular expression for matching emphasis.\r\n After a match, the match groups contain these elements:\r\n@@ -3850,10 +3881,13 @@ (defun org-set-emph-re (var val)\r\n \t (body (if (<= nl 0) body\r\n \t\t (format \"%s*?\\\\(?:\\n%s*?\\\\)\\\\{0,%d\\\\}\" body body nl)))\r\n \t (template\r\n-\t  (format (concat \"\\\\([%s]\\\\|^\\\\)\" ;before markers\r\n+          ;; See `org-element--parse-generic-emphasis'\r\n+\t  (format (concat \"\\\\(%s\\\\)\" ;before markers\r\n \t\t\t  \"\\\\(\\\\([%%s]\\\\)\\\\([^%s]\\\\|[^%s]%s[^%s]\\\\)\\\\3\\\\)\"\r\n-\t\t\t  \"\\\\([%s]\\\\|$\\\\)\") ;after markers\r\n-\t\t  pre border border body border post)))\r\n+\t\t\t  \"\\\\(%s\\\\)\") ;after markers\r\n+\t\t  (if pre (format \"[%s]\\\\|^\" pre) org-element-emphasis-pre-re)\r\n+                  border border body border\r\n+                  (if post (format \"[%s]\\\\|$\" post) org-element-emphasis-post-re))))\r\n       (setq org-emph-re (format template \"*\/_+\"))\r\n       (setq org-verbatim-re (format template \"=~\")))))\r\n \r\n@@ -3861,7 +3895,7 @@ (defun org-set-emph-re (var val)\r\n ;; set this option proved cumbersome.  See this message\/thread:\r\n ;; https:\/\/orgmode.org\/list\/B72CDC2B-72F6-43A8-AC70-E6E6295766EC@gmail.com\r\n (defvar org-emphasis-regexp-components\r\n-  '(\"-[:space:]('\\\"{\" \"-[:space:].,:!?;'\\\")}\\\\[\" \"[:space:]\" \".\" 1)\r\n+  '(nil nil \"[:space:]\" \".\" 1)\r\n   \"Components used to build the regular expression for FONTIFYING emphasis.\r\n WARNING: This variable only affects visual fontification, but does not\r\n change Org markup.  For example, it does not affect how emphasis markup\r\n@@ -3874,7 +3908,9 @@ (defvar org-emphasis-regexp-components\r\n specify what is allowed\/forbidden in each part:\r\n \r\n pre          Chars allowed as prematch.  Beginning of line will be allowed too.\r\n+             nil means use parser defaults.\r\n post         Chars allowed as postmatch.  End of line will be allowed too.\r\n+             nil means use parser defaults.\r\n border       The chars *forbidden* as border characters.\r\n body-regexp  A regexp like \\\".\\\" to match a body character.  Don't use\r\n              non-shy groups here, and don't allow newline here.\r\n@@ -5106,6 +5142,9 @@ (define-derived-mode org-mode outline-mode \"Org\"\r\n     (org-install-agenda-files-menu))\r\n   (setq-local outline-regexp org-outline-regexp)\r\n   (setq-local outline-level 'org-outline-level)\r\n+  (require 'org-element)\r\n+  (defvar org-element-category-table) ; org-element.el\r\n+  (set-category-table org-element-category-table)\r\n   ;; Initialize cache.\r\n   (org-element-cache-reset)\r\n   (when (and org-element-cache-persistent\r\n@@ -5385,35 +5424,27 @@ (defsubst org-rear-nonsticky-at (pos)\r\n \r\n (defun org-do-emphasis-faces (limit)\r\n   \"Run through the buffer and emphasize strings.\"\r\n-  (let ((quick-re (format \"\\\\([%s]\\\\|^\\\\)\\\\([~=*\/_+]\\\\)\"\r\n-\t\t\t  (car org-emphasis-regexp-components))))\r\n+  (let ((quick-re (format \"\\\\(%s\\\\)\\\\([~=*\/_+]\\\\)\"\r\n+\t\t\t  (if (car org-emphasis-regexp-components)\r\n+                              (format \"[%s]\\\\|^\" (car org-emphasis-regexp-components))\r\n+                            org-element-emphasis-pre-re))))\r\n     (catch :exit\r\n       (while (re-search-forward quick-re limit t)\r\n \t(let* ((marker (match-string 2))\r\n-\t       (verbatim? (member marker '(\"~\" \"=\"))))\r\n+\t       (verbatim? (member marker '(\"~\" \"=\")))\r\n+               (context (save-match-data\r\n+                          (save-excursion\r\n+                            (goto-char (match-beginning 2))\r\n+                            (org-element-context)))))\r\n \t  (when (save-excursion\r\n \t\t  (goto-char (match-beginning 0))\r\n \t\t  (and\r\n-\t\t   ;; Do not match table hlines.\r\n-\t\t   (not (and (equal marker \"+\")\r\n-\t\t\t     (org-match-line\r\n-\t\t\t      \"[ \\t]*\\\\(|[-+]+|?\\\\|\\\\+[-+]+\\\\+\\\\)[ \\t]*$\")))\r\n-\t\t   ;; Do not match headline stars.  Do not consider\r\n-\t\t   ;; stars of a headline as closing marker for bold\r\n-\t\t   ;; markup either.\r\n-\t\t   (not (and (equal marker \"*\")\r\n-\t\t\t     (save-excursion\r\n-\t\t\t       (forward-char)\r\n-\t\t\t       (skip-chars-backward \"*\")\r\n-\t\t\t       (looking-at-p org-outline-regexp-bol))))\r\n+                   (org-element-type-p\r\n+                    context\r\n+                    '(bold code italic strike-through underline verbatim))\r\n+                   (equal (match-beginning 2) (org-element-begin context))\r\n \t\t   ;; Match full emphasis markup regexp.\r\n-\t\t   (looking-at (if verbatim? org-verbatim-re org-emph-re))\r\n-\t\t   ;; Do not span over paragraph boundaries.\r\n-\t\t   (not (string-match-p org-element-paragraph-separate\r\n-\t\t\t\t\t(match-string 2)))\r\n-\t\t   ;; Do not span over cells in table rows.\r\n-\t\t   (not (and (save-match-data (org-match-line \"[ \\t]*|\"))\r\n-\t\t\t     (string-match-p \"|\" (match-string 4))))))\r\n+\t\t   (looking-at (if verbatim? org-verbatim-re org-emph-re))))\r\n \t    (pcase-let ((`(,_ ,face ,_) (assoc marker org-emphasis-alist))\r\n \t\t\t(m (if org-hide-emphasis-markers 4 2)))\r\n \t      (font-lock-prepend-text-property\r\n@@ -5478,12 +5509,20 @@ (defun org-emphasize (&optional char)\r\n     (setq string (concat s string s))\r\n     (when beg (delete-region beg end))\r\n     (unless (or (bolp)\r\n-\t\t(string-match (concat \"[\" (nth 0 erc) \"\\n]\")\r\n-\t\t\t      (char-to-string (char-before (point)))))\r\n+\t\t(string-match\r\n+                 (if (nth 0 erc) (concat \"[\" (nth 0 erc) \"\\n]\")\r\n+                   ;; See `org-element--parse-generic-emphasis'\r\n+                   (rx (or (regexp org-element-emphasis-pre-re)\r\n+                           \"\\n\")))\r\n+\t\t (char-to-string (char-before (point)))))\r\n       (insert \" \"))\r\n     (unless (or (eobp)\r\n-\t\t(string-match (concat \"[\" (nth 1 erc) \"\\n]\")\r\n-\t\t\t      (char-to-string (char-after (point)))))\r\n+\t\t(string-match\r\n+                 ;; See `org-element--parse-generic-emphasis'\r\n+                 (if (nth 1 erc) (concat \"[\" (nth 1 erc) \"\\n]\")\r\n+                   (rx (or (regexp org-element-emphasis-post-re)\r\n+                           \"\\n\")))\r\n+\t\t (char-to-string (char-after (point)))))\r\n       (insert \" \") (backward-char 1))\r\n     (insert string)\r\n     (and move (backward-char 1))))\r\n-- \r\n2.52.0\r\n\r\n","subject":"Re: [BUG] Issues with Chinese (and potentially Japanese) text inline markup in Org mode [9.7.11 (release_9.7.11 @ \/Applications\/Emacs.app\/Contents\/Resources\/lisp\/org\/)]"},{"date":"2025-12-14T19:37:11.797Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87v7i8zwib.fsf@localhost","message-id":"87v7i8zwib.fsf@localhost","config":false,"refs-count":14,"username":"Ihor Radchenko","references":["a8b2412d-2400-4666-ae9d-c4e14f4fb0be@andros.dev","20c50b47-0703-423a-946c-786cf2b6c4a6@andros.dev"],"related-refs":["87v7i8zwib.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] Allow empty headlines without trainling space (was: Fwd: [PATCH] Allow empty headlines without trailing space)"},{"date":"2025-12-13T12:38:52.021Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87wm2qwob6.fsf@posteo.net","message-id":"87wm2qwob6.fsf@posteo.net","config":false,"refs-count":8,"username":"Philip Kaludercic","references":["jwvy0nd5i3t.fsf-monnier+emacs@gnu.org","87sedoabs2.fsf@localhost","jwvecp34wku.fsf-monnier+emacs@gnu.org","u1pl6h43c@gentoo.org","87y0newbr5.fsf@posteo.net","86h5u011g3.fsf@gentoo.org","uldjhgotf@gentoo.org","jwva4zt7mw3.fsf-monnier+emacs@gnu.org","87wm2ybrx9.fsf@localhost","86bjk92x8p.fsf@aarsen.me","874iq09a23.fsf@posteo.net","87345j749k.fsf@posteo.net","87y0neo49d.fsf@localhost","u8qfggfsz@gentoo.org","jwvbjk85pe6.fsf-monnier+emacs@gnu.org"],"related-refs":["87wm2qwob6.fsf@posteo.net"],"from":"philipk@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87wm2qwob6.fsf@posteo.net","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/elpa-admin.el b\/elpa-admin.el\r\nindex c9d7c47fa7..87ef36aa0f 100644\r\n--- a\/elpa-admin.el\r\n+++ b\/elpa-admin.el\r\n@@ -641,16 +641,7 @@ returns.  Return the selected revision.\"\r\n               (make-directory olddir t)\r\n               (funcall mvfun filename)\r\n               (funcall mvfun sig))))\r\n-        (setq oldtarballs keep)))\r\n-    (dolist (oldtarball oldtarballs)\r\n-      ;; Compress oldtarballs.\r\n-      (let ((file (cdr oldtarball)))\r\n-        (when (string-match \"\\\\.\\\\(tar\\\\|el\\\\)\\\\'\" file)\r\n-          ;; Make sure we don't compress the file we just created.\r\n-          (cl-assert (not (equal file (file-name-nondirectory tarball))))\r\n-          ;; (elpaa--message \"not equal %s and %s\" file tarball)\r\n-          (elpaa--call nil \"lzip\" (expand-file-name file destdir))\r\n-          (setf (cdr oldtarball) (concat file \".lz\"))))))\r\n+        (setq oldtarballs keep))))\r\n   oldtarballs)\r\n \r\n (defun elpaa--report-failure ( pkg-spec metadata txt basename destdir\r\n@@ -887,6 +878,7 @@ auxiliary files unless TARBALL-ONLY is non-nil .\"\r\n               ,(format \"s|^packages\/%s|%s-%s|\" pkg pkg vers)\r\n               \"-chf\" ,tarball\r\n               ,(format \"packages\/%s\" pkg)))\r\n+     (elpaa--call nil \"lzip\" \"-k\" tarball)\r\n      (cl-assert (file-readable-p tarball))\r\n      (unless tarball-only\r\n        (let* ((pkgdesc\r\n@@ -909,9 +901,10 @@ auxiliary files unless TARBALL-ONLY is non-nil .\"\r\n                           (format \"%s-release\/%s-%s\"\r\n                                   elpaa--name pkg vers))))\r\n          (let ((link (expand-file-name (format \"%s.tar\" pkg) destdir)))\r\n-\t   (when (file-symlink-p link) (delete-file link))\r\n \t   (ignore-error file-error     ;E.g. under w32!\r\n-\t     (make-symbolic-link (file-name-nondirectory tarball) link)))\r\n+\t     (make-symbolic-link (file-name-nondirectory tarball) link t)\r\n+             (make-symbolic-link (file-name-nondirectory (concat tarball \".lz\"))\r\n+                                 (concat link \".lz\") t)))\r\n          (setq oldtarballs\r\n                (let ((elpaa--keep-max\r\n                       ;; In the devel directory, don't bother keeping so\r\n","subject":"Re: ELPA tarballs"},{"date":"2025-12-04T09:15:07.009Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87o6oea9uo.fsf@rensoliemans.nl","message-id":"87o6oea9uo.fsf@rensoliemans.nl","config":false,"refs-count":9,"username":"Rens Oliemans","related-refs":["87o6oea9uo.fsf@rensoliemans.nl","CH3PR84MB342453EB76E84935ED46A1C7C581A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB3424D4D508DB595AF9B77FD9C5A6A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB34248637FC1E1A8C354DFAFAC582A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"from":"hallo@rensoliemans.nl","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-metaup moves wrong subtree if point is after Local Variables"},{"date":"2025-11-29T08:35:06.429Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/142896f6-3355-4339-a8e6-9390bb056a78@zmberber.com","message-id":"142896f6-3355-4339-a8e6-9390bb056a78@zmberber.com","config":false,"refs-count":6,"username":"Zeremonienmeister Berber Aab","related-refs":["142896f6-3355-4339-a8e6-9390bb056a78@zmberber.com"],"from":"git@zmberber.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] org-timestamp-translate should always respect org-timestamp-custom-formats (or add option)"},{"date":"2025-11-22T01:53:12.517Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87pl9bljnc.fsf@localhost","message-id":"87pl9bljnc.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","related-refs":["87pl9bljnc.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] Typesetting code and links when exporting to LaTeX using RTL languages"},{"date":"2025-11-20T08:43:56.501Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cy5dhz8x.fsf@posteo.de","message-id":"87cy5dhz8x.fsf@posteo.de","config":false,"refs-count":2,"username":"Titus von der Malsburg","references":["87wm52zoqz.fsf@localhost","87plauzllr.fsf@localhost","87ecrar6wh.fsf@posteo.de","871pnaspbb.fsf@posteo.de","87y0p8l3qk.fsf@localhost","87ikfbxb89.fsf@localhost","875xb6j9ox.fsf@posteo.de","87o6qdhm2i.fsf@posteo.de","871pm3qug5.fsf@posteo.de"],"related-refs":["87cy5dhz8x.fsf@posteo.de"],"from":"malsburg@posteo.de","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87cy5dhz8x.fsf@posteo.de","source-id":"emacs-orgmode@gnu.org","patch-body":"From 572a06094e0e26e06fc2c5cebd76ac58032b5ee9 Mon Sep 17 00:00:00 2001\r\nFrom: Titus von der Malsburg <malsburg@posteo.de>\r\nDate: Wed, 19 Nov 2025 16:38:21 +0100\r\nSubject: [PATCH] doc\/org-manual.org: Elaborate description of PROPERTY+ syntax\r\n\r\n* doc\/org-manual.org: Added information on possible uses of the\r\nPROPERTY+ syntax and impossible uses of the PROPERTY syntax (without\r\nappended +).  Simplified an existing example.\r\n\r\nLink: https:\/\/list.orgmode.org\/871pnaspbb.fsf@posteo.de\/\r\n---\r\n doc\/org-manual.org | 18 +++++++++++-------\r\n 1 file changed, 11 insertions(+), 7 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 50359ef5b..2da7f12b8 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -5403,16 +5403,17 @@ Properties can also be defined using lines like:\r\n #+cindex: @samp{+} suffix, in properties\r\n If you want to add to the value of an existing property, append a =+=\r\n to the property name.  The following results in the property =var=\r\n-having the value =foo=1 bar=2=.\r\n+having the values =foo= and =bar=.\r\n \r\n #+begin_example\r\n-,#+PROPERTY: var  foo=1\r\n-,#+PROPERTY: var+ bar=2\r\n+,#+PROPERTY: var  foo\r\n+,#+PROPERTY: var+ bar\r\n #+end_example\r\n \r\n-It is also possible to add to the values of inherited properties.  The\r\n-following results in the =Genres= property having the value =Classic\r\n-Baroque= under the =Goldberg Variations= subtree.\r\n+Using the appended =+=, it is also possible to add to the values of\r\n+inherited properties.  The following results in the =Genres= property\r\n+having the values =Classic=, =Baroque=, and =Keyboard music= under the\r\n+=Goldberg Variations= subtree.\r\n \r\n #+begin_example\r\n ,* CD collection\r\n@@ -5428,10 +5429,13 @@ Baroque= under the =Goldberg Variations= subtree.\r\n     :Publisher: Deutsche Grammophon\r\n     :NDisks:    1\r\n     :Genres+:   Baroque\r\n+    :Genres+:   Keyboard music\r\n     :END:\r\n #+end_example\r\n \r\n-Note that a property can only have one entry per drawer.\r\n+Note that a property can only have multiple entries per drawer when\r\n+used with the appended =+=.  When a property has multiple entries\r\n+without =+=, the result is undefined.\r\n \r\n #+vindex: org-global-properties\r\n Property values set with the global variable ~org-global-properties~\r\n-- \r\n2.43.0\r\n\r\n","subject":"Re: Properties unique?"},{"date":"2025-11-10T00:36:56.090Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87346mwwrb.fsf@gmail.com","message-id":"87346mwwrb.fsf@gmail.com","config":false,"refs-count":5,"username":"Ken Mankoff","references":["87a60yxec3.fsf@localhost","3d51b11e-e53d-85a8-9ed7-eccc40d92b36@gmail.com","87y0sfgn95.fsf@gmail.com","874jqluyfp.fsf@t480.home","0e841ec9-f770-4f4f-a5e6-eb15290ab8a7@gmail.com","87ecu1py6c.fsf@localhost","87wm7zezw6.fsf@gmail.com","87v8j1t2qf.fsf@localhost","87k003swax.fsf@t480.home","871pq9v0wk.fsf@localhost","96a91a35-eeb6-55d3-683d-5d51ff6d496e@gmail.com","87y1om7w23.fsf@t480.home","87sfet7kul.fsf@t480.home","87zfcxzkwm.fsf@gmail.com","e01a5882-5124-41c0-b20b-408d32bc0def@gmail.com","276112c4-c9bd-36a0-1e70-36a955b7d3c9@gmail.com","87a54sfhnq.fsf@gmail.com","877cw5aiab.fsf@t480.home","d52df549-e144-4c22-029f-318469e062a6@gmail.com","874jqgreev.fsf@t480.home","87pm9z8089.fsf@t480.home"],"related-refs":["87jyw9mz8v.fsf@gmail.com","87346mwwrb.fsf@gmail.com"],"from":"mankoff@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87346mwwrb.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From b78db9c23bd30db9c08c633e7fdce37779290f80 Mon Sep 17 00:00:00 2001\r\nFrom: Ken Mankoff <mankoff@gmail.com>\r\nDate: Wed, 23 Jul 2025 08:41:57 -0400\r\nSubject: [PATCH 1\/3] lisp\/ob-screen.el (org-babel-screen-test): Test now\r\n passes\r\n\r\n* lisp\/ob-screen.el (org-babel-screen-test): Test now passes\r\n---\r\n lisp\/ob-screen.el | 9 ++++-----\r\n 1 file changed, 4 insertions(+), 5 deletions(-)\r\n\r\ndiff --git a\/lisp\/ob-screen.el b\/lisp\/ob-screen.el\r\nindex 554a01406575..60a473f3978b 100644\r\n--- a\/lisp\/ob-screen.el\r\n+++ b\/lisp\/ob-screen.el\r\n@@ -128,16 +128,15 @@ The terminal should shortly flicker.\"\r\n          (body (concat \"echo '\" random-string \"' > \" tmpfile \"\\nexit\\n\"))\r\n          tmp-string)\r\n     (org-babel-execute:screen body org-babel-default-header-args:screen)\r\n-    ;; XXX: need to find a better way to do the following\r\n-    (while (not (file-readable-p tmpfile))\r\n-      ;; do something, otherwise this will be optimized away\r\n-      (message \"org-babel-screen: File not readable yet.\"))\r\n+    (while (= (file-attribute-size (file-attributes tmpfile)) 0)\r\n+      (progn (message \"org-babel-screen: Still executing...\")\r\n+             (sleep-for 0.1)))\r\n     (setq tmp-string (with-temp-buffer\r\n                        (insert-file-contents-literally tmpfile)\r\n                        (buffer-substring (point-min) (point-max))))\r\n     (delete-file tmpfile)\r\n     (message (concat \"org-babel-screen: Setup \"\r\n-                     (if (string-match random-string tmp-string)\r\n+                     (if (string-match-p random-string tmp-string)\r\n                          \"WORKS.\"\r\n \t\t       \"DOESN'T work.\")))))\r\n \r\n-- \r\n2.47.3\r\n\r\n","subject":"Re: [PATCH] lisp\/ob-screen.el: Support custom screen location and pass org-babel-screen-test"},{"date":"2025-11-09T01:37:07.315Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CAEe1e0zS=dEyjF2dZW1bPontru4Ga+YMc5-4sS008KfaFKNO9g@mail.gmail.com","message-id":"CAEe1e0zS=dEyjF2dZW1bPontru4Ga+YMc5-4sS008KfaFKNO9g@mail.gmail.com","config":false,"refs-count":3,"username":"Victor Miller","related-refs":["CAEe1e0zS=dEyjF2dZW1bPontru4Ga+YMc5-4sS008KfaFKNO9g@mail.gmail.com"],"from":"victorsmiller@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] timer-even-handler [9.8-pre (release_9.7.18-203-g42630e @ \/Users\/victorsmiller\/.emacs.d\/straight\/build\/org\/)]"},{"date":"2025-11-08T16:04:08.202Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CH3PR84MB342481061091FC0E16A8FC28C5C0A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","message-id":"CH3PR84MB342481061091FC0E16A8FC28C5C0A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","config":false,"refs-count":2,"username":"Morgan Smith","references":["87zf8wka06.fsf@localhost","CH3PR84MB342439B1B0E4D8BBA42333AEC5C2A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"related-refs":["CH3PR84MB342481061091FC0E16A8FC28C5C0A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"from":"morgan.j.smith@outlook.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/CH3PR84MB342481061091FC0E16A8FC28C5C0A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","source-id":"emacs-orgmode@gnu.org","patch-body":"From c47a52b9befd1410af954ec9c9d4e0a134682c8e Mon Sep 17 00:00:00 2001\r\nFrom: Morgan Smith <Morgan.J.Smith@outlook.com>\r\nDate: Mon, 27 Oct 2025 15:37:05 -0400\r\nSubject: [PATCH 1\/8] Testing: Add missing requires\r\n\r\nTests are usually run using the Makefile which includes many files\r\nbefore running the tests.  By adding the requires directly to the\r\nfiles it is easier to use these tests in other ways.\r\n\r\n* testing\/lisp\/test-org-attach.el:\r\nRequire \"dired\".\r\n* testing\/lisp\/test-org-footnote.el:\r\nRequire \"org-test\".\r\n* testing\/lisp\/test-org-habit.el:\r\nRequire \"test-org\".\r\nAdd relative path the require for \"test-org-agenda\".\r\n* testing\/lisp\/test-org-info.el:\r\nRequire \"ol-info\".\r\n* testing\/lisp\/test-ox-beamer.el:\r\nRequire \"test-duplicates-detector\".\r\n---\r\n testing\/lisp\/test-org-attach.el   | 1 +\r\n testing\/lisp\/test-org-footnote.el | 1 +\r\n testing\/lisp\/test-org-habit.el    | 3 ++-\r\n testing\/lisp\/test-org-info.el     | 2 ++\r\n testing\/lisp\/test-ox-beamer.el    | 3 +++\r\n 5 files changed, 9 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/testing\/lisp\/test-org-attach.el b\/testing\/lisp\/test-org-attach.el\r\nindex 6a597752e..d475ecba3 100644\r\n--- a\/testing\/lisp\/test-org-attach.el\r\n+++ b\/testing\/lisp\/test-org-attach.el\r\n@@ -27,6 +27,7 @@\r\n (require 'org-test \"..\/testing\/org-test\")\r\n (require 'org-attach)\r\n (eval-when-compile (require 'cl-lib))\r\n+(require 'dired)\r\n \r\n (ert-deftest test-org-attach\/dir ()\r\n   \"Test `org-attach-get' specifications.\"\r\ndiff --git a\/testing\/lisp\/test-org-footnote.el b\/testing\/lisp\/test-org-footnote.el\r\nindex 41268e20e..4c300b8db 100644\r\n--- a\/testing\/lisp\/test-org-footnote.el\r\n+++ b\/testing\/lisp\/test-org-footnote.el\r\n@@ -19,6 +19,7 @@\r\n \r\n ;;; Code:\r\n \r\n+(require 'org-test \"..\/testing\/org-test\")\r\n (require 'org-footnote)\r\n \r\n (ert-deftest test-org-footnote\/new-anon ()\r\ndiff --git a\/testing\/lisp\/test-org-habit.el b\/testing\/lisp\/test-org-habit.el\r\nindex 4b3dbdb06..3c4c6ede9 100644\r\n--- a\/testing\/lisp\/test-org-habit.el\r\n+++ b\/testing\/lisp\/test-org-habit.el\r\n@@ -22,7 +22,8 @@\r\n (require 'org-test \"..\/testing\/org-test\")\r\n (require 'org-agenda)\r\n (require 'org-habit)\r\n-(require 'test-org-agenda)\r\n+(require 'test-org-agenda \"..\/testing\/lisp\/test-org-agenda\")\r\n+(require 'test-org \"..\/testing\/lisp\/test-org\")\r\n \r\n \f\r\n ;; Tests\r\ndiff --git a\/testing\/lisp\/test-org-info.el b\/testing\/lisp\/test-org-info.el\r\nindex 1ca2aca2e..55627cbef 100644\r\n--- a\/testing\/lisp\/test-org-info.el\r\n+++ b\/testing\/lisp\/test-org-info.el\r\n@@ -19,6 +19,8 @@\r\n \r\n ;;; Code:\r\n \r\n+(require 'ol-info)\r\n+\r\n (ert-deftest test-org-info\/export ()\r\n   \"Test `org-info-export' specifications.\"\r\n   ;; Export to HTML.  Without node, refer to \"Top\".\r\ndiff --git a\/testing\/lisp\/test-ox-beamer.el b\/testing\/lisp\/test-ox-beamer.el\r\nindex f5743409f..24550ec62 100644\r\n--- a\/testing\/lisp\/test-ox-beamer.el\r\n+++ b\/testing\/lisp\/test-ox-beamer.el\r\n@@ -27,6 +27,9 @@\r\n (unless (featurep 'ox-beamer)\r\n   (signal 'missing-test-dependency '(\"org-export-beamer\")))\r\n \r\n+(eval-when-compile\r\n+  (require 'test-duplicates-detector \"..\/testing\/lisp\/test-duplicates-detector\"))\r\n+\r\n \f\r\n \r\n (ert-deftest ox-beamer\/orgframe ()\r\n\r\nbase-commit: ee12059f78697d6d28ec3c98f4b4e092fbe8929f\r\n-- \r\n2.51.2\r\n\r\n","subject":"Re: [PATCH] defsubst, require, and declare-function fixes"},{"date":"2025-11-08T12:41:56.434Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871pm81yxw.fsf@localhost","message-id":"871pm81yxw.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["m2fras6xz1.fsf@FRAGARACH.home.lan"],"related-refs":["871pm81yxw.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] How do you use org-export-with-entities? (was: question: protect latex macros for export)"},{"date":"2025-11-07T20:38:43.803Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CH3PR84MB342487A0383BD1628FD49A91C5C3A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","message-id":"CH3PR84MB342487A0383BD1628FD49A91C5C3A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","config":false,"refs-count":7,"username":"Morgan Smith","references":["820F0E20-4AB4-4437-9A73-0D5180EC02D6@gmail.com","878qk0lg5k.fsf@localhost"],"related-refs":["CH3PR84MB3424E84B9F2B7252FE397885C562A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","820F0E20-4AB4-4437-9A73-0D5180EC02D6@gmail.com","CH3PR84MB34243FB1BFCDBF5F39EC3016C5DDA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB342487A0383BD1628FD49A91C5C3A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"from":"Morgan.J.Smith@outlook.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/CH3PR84MB342487A0383BD1628FD49A91C5C3A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","source-id":"emacs-orgmode@gnu.org","patch-body":"From e5f69311e440335bce5db264aa087734440e4955 Mon Sep 17 00:00:00 2001\r\nFrom: Morgan Smith <Morgan.J.Smith@outlook.com>\r\nDate: Fri, 7 Nov 2025 15:33:05 -0500\r\nSubject: [PATCH] testing\/lisp\/test-org-agenda.el (test-org-agenda\/sorting):\r\n New test\r\n\r\n* testing\/lisp\/test-org-agenda.el (test-org-agenda\/sorting): New test.\r\n---\r\n testing\/lisp\/test-org-agenda.el | 69 +++++++++++++++++++++++++++++++++\r\n 1 file changed, 69 insertions(+)\r\n\r\ndiff --git a\/testing\/lisp\/test-org-agenda.el b\/testing\/lisp\/test-org-agenda.el\r\nindex 51e75102c..a2f9fc572 100644\r\n--- a\/testing\/lisp\/test-org-agenda.el\r\n+++ b\/testing\/lisp\/test-org-agenda.el\r\n@@ -666,6 +666,75 @@ test-org-agenda\/skip-scheduled-repeats-after-deadline\r\n               (buffer-string))))))\r\n       (org-test-agenda--kill-all-agendas))))\r\n \r\n+(ert-deftest test-org-agenda\/sorting ()\r\n+  \"Test if `org-agenda' sorts according to `org-agenda-sorting-strategy'.\"\r\n+  :expected-result :failed\r\n+  (let ((set-agenda-with-priority\r\n+         (lambda (priority)\r\n+           (setq org-agenda-custom-commands\r\n+                 `((\"f\" \"no fluff\" todo \"\"\r\n+                    ((org-agenda-todo-keyword-format \"\")\r\n+                     (org-agenda-overriding-header \"\")\r\n+                     (org-agenda-prefix-format \"\")\r\n+                     (org-agenda-remove-tags t)\r\n+                     (org-agenda-sorting-strategy ',priority)))))))\r\n+        org-agenda-custom-commands)\r\n+    (org-test-at-time \"2025-11-07\"\r\n+      (org-test-agenda-with-agenda\r\n+       \"* TODO scheduled yesterday\r\n+SCHEDULED: <2025-11-06>\r\n+* TODO scheduled today\r\n+SCHEDULED: <2025-11-07>\r\n+* TODO scheduled tomorrow\r\n+SCHEDULED: <2025-11-08>\r\n+* TODO deadline yesterday\r\n+DEADLINE: <2025-11-06>\r\n+* TODO deadline today\r\n+DEADLINE: <2025-11-07>\r\n+* TODO deadline tomorrow\r\n+DEADLINE: <2025-11-08>\r\n+* TODO both yesterday\r\n+SCHEDULED: <2025-11-06>\r\n+DEADLINE: <2025-11-06>\r\n+* TODO both today\r\n+SCHEDULED: <2025-11-07>\r\n+DEADLINE: <2025-11-07>\r\n+* TODO both tomorrow\r\n+SCHEDULED: <2025-11-08>\r\n+DEADLINE: <2025-11-08>\"\r\n+       (should\r\n+        (string-equal\r\n+         (string-trim\r\n+          (progn\r\n+            (funcall set-agenda-with-priority '(deadline-up scheduled-up))\r\n+            (org-agenda nil \"f\")\r\n+            (substring-no-properties (buffer-string))))\r\n+         \"deadline yesterday\r\n+deadline today\r\n+deadline tomorrow\r\n+scheduled yesterday\r\n+both yesterday\r\n+scheduled today\r\n+both today\r\n+scheduled tomorrow\r\n+both tomorrow\"))\r\n+       (should\r\n+        (string-equal\r\n+         (string-trim\r\n+          (progn\r\n+            (funcall set-agenda-with-priority '(scheduled-down deadline-down))\r\n+            (org-agenda nil \"f\")\r\n+            (substring-no-properties (buffer-string))))\r\n+         \"scheduled tomorrow\r\n+both tomorrow\r\n+scheduled today\r\n+both today\r\n+scheduled yesterday\r\n+both yesterday\r\n+deadline tomorrow\r\n+deadline today\r\n+deadline yesterday\"))))))\r\n+\r\n (ert-deftest test-org-agenda\/tags-sorting ()\r\n   \"Test if `org-agenda' sorts tags according to `org-tags-sort-function'.\"\r\n   (let ((string-length< (lambda (s1 s2)\r\n\r\nbase-commit: af1478121ff3292ae3b7d60878e91b539c51e60f\r\n-- \r\n2.51.2\r\n\r\n","subject":"Re: [BUG] Not being able to sort deadline-up and scheduled-up in the same agenda-command [9.7.31 (9.7.31-??-4e6d38d @ \/Users\/jolofsson\/.config\/emacs\/.local\/straight\/build-29.4\/org\/)]"},{"date":"2025-11-01T13:36:40.076Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87frax514c.fsf@localhost","message-id":"87frax514c.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","related-refs":["87frax514c.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nA task from Org mode will be one of the projects to choose from during\r\nthe upcoming FSF40 hackathon.\r\n\r\nThat's in 3 weeks from now, on Nov 21-23, 2025.\r\n\r\nYou can either choose to participate in the hackathon as an individual\r\nor as a team consisting of up to four people. To team up, just state in\r\nthe Libera.chat IRC channel #fsf-hackathon that you're looking for\r\nfellow team members to work on one of the projects together.\r\n\r\nThey will award prizes and official acknowledgment certificate to the participants.\r\n\r\nSee https:\/\/www.fsf.org\/events\/fsf40-hackathon for more details.\r\n\r\n#HackFSF40\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[ANN] Contribute to Org mode during FSF40 hackathon [online], Nov 21-23, 2025"},{"date":"2025-10-27T18:51:28.927Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ms5cp4j5.fsf@localhost","message-id":"87ms5cp4j5.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87cy71p56n.fsf@localhost"],"related-refs":["87ms5cp4j5.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nHere are the meetup notes (finally, on time, *before* the next meetup).\r\n\r\nTL;DR: WIP multi-language PDF exports feature; multiple images as\r\noutput of R blocks; which-key-popup-type; completing bibtex citation\r\nkeys; citation styles list missing from Org manual.\r\n\r\n- As usual, we started from the latest Emacs news\r\n  https:\/\/sachachua.com\/blog\/2025\/10\/2025-10-06-emacs-news\/\r\n\r\n- Pedro shared his updates on multi-lang export branch\r\n  (ongoing discussion: <https:\/\/list.orgmode.org\/87ms5frp9v.fsf@localhost\/T\/#t>)\r\n  - We discussed using babel vs polyglossia\r\n    - AFAIK, LaTeX project officially supports babel as multi-language package\r\n    - However, Pedro has more experience with polyglossia, so we\r\n      include it as well.\r\n  - We also discussed the intricacies of getting non-Latin fonts for pdflatex\r\n    - This is non-trivial, although possible for some languages\r\n    - In the past, we found one website that has instructions how to configure pdflatex\r\n      for various languages, but later found that the instructions do not always work\r\n    - I later (after the meetup) found\r\n      https:\/\/en.wikibooks.org\/wiki\/LaTeX\/Internationalization#Specific_languages\r\n      - We will include it in the manual\r\n  - We also discussed that we may need to give users instructions about including\r\n    other languages\r\n    - In polyglossia, you can do\r\n      : #+begin_greek\r\n      : ...\r\n      : #+end_greek\r\n      which will directly translate into (=\\begin{greek}...\\end{greek}=)\r\n    - Alas, babel is different. It uses =foreignlanguage= environment.\r\n    - Will need to document both in the manual, maybe adding a special environment\r\n      to Org mode in figure, so that users do not need to change the Org markup\r\n      when they switch between babel and polyglossia\r\n\r\n- Pedro also shared his manual setup for Org export menu\r\n  - Rather than using built-in menu, he uses which-key with custom keymap\r\n  - He also sets ~which-key-popup-type~ to show the which-key popups\r\n    in the echo area rather than in a popup window\r\n  - We are working on something similar in https:\/\/list.orgmode.org\/orgmode\/8734m28l9a.fsf@gmail.com\/\r\n    - There, the idea is to make Org menus use something built-in\r\n      (transient\/which-key\/menus\/etc) instead of rolling out custom menus\r\n\r\n- yaca shared his problem with exporting R blocks\r\n  - What he does is creating *multiple* images as an output (=:results graphics file=)\r\n  - This is not what =ob-R.el= knows how to handle, so only one of the\r\n    images is actually used as the output\r\n  - We, however, managed to implement custom way to save multiple images\r\n    - The idea is to write R block that will directly save images to disk using R code\r\n      and then make use of =:results raw output=, directly printing links to *all*\r\n      images in Org markup as\r\n      : [[file:\/path\/to\/image1]]\r\n      : [[file:\/path\/to\/image2]]\r\n      : ...\r\n    - This is pretty manual, but works\r\n\r\n- yaca also asked about a way to get completion for citation keys in Org\r\n  - By default, ~M-x org-cite-insert~ presents a minibuffer completion, but\r\n    you can only match by author\/title\/year, not using underlying bibtex citation key\r\n  - We than looked into https:\/\/github.com\/emacs-citar\/citar\r\n    - AFAIR, you still cannot complete by bibtex keys by default\r\n    - However, we found that =citar-capf= can do it:\r\n      https:\/\/github.com\/emacs-citar\/citar?tab=readme-ov-file#citar-capf\r\n      via in-buffer completion.\r\n\r\n- yaca (AFAIR), also pointed that Org mode manual does not tell about citation styles\r\n  that are available\r\n  - Something like  https:\/\/blog.tecosaur.com\/tmio\/2021-07-31-citations.html#cite-styles\r\n    would be useful to have\r\n  - Patches welcome! See https:\/\/orgmode.org\/worg\/org-contribute.html\r\n\r\n- We than ran out of topics to discuss\r\n  - I turned to Emacs news, and looked into org-social \r\n    https:\/\/github.com\/tanrax\/org-social\r\n    and JS rendered you can load into HTML to directly transform raw Org markup\r\n    into HTML rendering https:\/\/docs.lepisma.xyz\/orgdeep\/\r\n  - However, none of the topics got traction, so we ended the meetup\r\n  - Just 1:30 hours this time :)\r\n\r\n:comments:\r\n[17:52] yantar92 is now the presenter\r\n[18:01] [yantar92 : MODERATOR]: The latest Emacs news: https:\/\/sachachua.com\/blog\/2025\/10\/2025-10-06-emacs-news\/\r\n[18:02] [yantar92 : MODERATOR]: We will wait a few minutes, so that more people can join. Then start\r\n[18:05] Pedro A. Aranda is now the presenter, set by yantar92\r\n[18:15] [yantar92 : MODERATOR]: which-key-popup-type\r\n[18:16] yantar92 is now the presenter, set by yantar92\r\n[18:33] [yaca : VIEWER]: I have some question\r\n[18:34] [yaca : VIEWER]: Kinda regarding latex export \r\n[18:34] [yaca : VIEWER]: Mostly exporting graphs from an R sourceblock\r\n[18:34] [yaca : VIEWER]: I'm trying to generate a plot for each element in an R loop. However, with current orgmode syntax, only the last plot is exported to pdf, whereas in Rmarkdown I can export all plots.\r\n[18:34] [yaca : VIEWER]: I am 5 minutes away from my computer, but i can run to my office haha\r\n[18:36] [yaca : VIEWER]: Ok, let me run to my office and I can share my screen\r\n[18:38] [yaca : VIEWER]: Ok give me 1 sec\r\n[18:40] [yantar92 : MODERATOR]: A reminder that we have https:\/\/pad.emacsconf.org\/orgmeetup to write during and after the meetup\r\n[18:40] yacaPC is now the presenter, set by yantar92\r\n[18:52] [yantar92 : MODERATOR]: [[file:\/path\/to\/file.png]]\r\n[18:54] yantar92 is now the presenter, set by yantar92\r\n[19:01] yacaPC is now the presenter, set by yantar92\r\n[19:08] [yantar92 : MODERATOR]: https:\/\/github.com\/emacs-citar\/citar\r\n[19:14] [yantar92 : MODERATOR]: M-: (citar-capf-setup)\r\n[19:16] yantar92 is now the presenter, set by yantar92\r\n[19:16] [yacaPC : VIEWER]: https:\/\/blog.tecosaur.com\/tmio\/2021-07-31-citations.html#cite-styles\r\n[19:18] [yantar92 : MODERATOR]: https:\/\/orgmode.org\/worg\/org-contribute.html\r\n[19:20] [Christian Moe : VIEWER]: This was an amazing live help session to follow!\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[BLOG] #23 [[bbb:OrgMeetup]] on Wed, October 8, 19:00 UTC+3"},{"date":"2025-10-25T10:40:30.902Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cy6be06w.fsf@localhost","message-id":"87cy6be06w.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["87ikhrefb7.fsf@localhost"],"related-refs":["87cy6be06w.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nHere are the meetup notes from September meetup. (The October notes will\r\nhopefully be coming soon).\r\n\r\nTL;DR: delays in bug fixes and patch reviews; batch refiling;\r\nlink completion; stable heading IDs; theming HTML export; macro replacement;\r\nnative LaTeX embeddings; footnotes; citations (CSL); examining Org's parse tree;\r\ndetecting blockers; auto-recording changes under each heading;\r\norg-fold-show-context-detail; time zone support; durations in Org.\r\n\r\n- As usual, we started from the latest Emacs news\r\n  https:\/\/sachachua.com\/blog\/2025\/09\/2025-09-08-emacs-news\/\r\n- This meetup just followed a series of work trips I made, so\r\n  lots of things on the Org development side were not acted upon\r\n  - Pedro A. Aranda reminded about his ongoing work on improvements\r\n    in the LaTeX exporter when using non-English document languages\r\n    (and that I had things to review and come back to him)\r\n  - His work is on =feature\/all-tex-fonts= branch\r\n    https:\/\/cgit.git.savannah.gnu.org\/cgit\/emacs\/org-mode.git\/log\/?h=feature\/all-tex-fonts\r\n  - The most recent discussion thread is https:\/\/list.orgmode.org\/87y0q0xhez.fsf@localhost\/T\/#t\r\n- For the same reason, the meetup etherpad was still full of\r\n  notes from previous one. Lots of dept.\r\n- Sacha reminded about talk submissions to EmacsConf (deadline passed\r\n  by now, but they might still accept talks, you really want to give one)\r\n  - Here is the list of talks they got for this year\r\n    https:\/\/emacsconf.org\/2025\/talks\/\r\n\r\n- Sacha Chua shared a refiling workflow where instead of searching for\r\n  heading to refile to every time, we can use hydra\r\n  https:\/\/gist.github.com\/jsomers\/ded472b1aa3b92d5fc8b35e92164eb07\r\n  https:\/\/mollermara.com\/blog\/Fast-refiling-in-org-mode-with-hydras\/\r\n  to refile many tasks one after another\r\n  - I personally use two approaches when I need batch-refiling\r\n    + Built-in batch-refiling from agenda views:\r\n      1. Find all the tasks I need to refile using agenda search view\r\n      2. Mark the tasks I need to refile with \"m\"\r\n      3. \"B r\" to (b)atch (r)efile all the tasks to the same heading\r\n    + Custom helm actions:\r\n      1. I first go to the heading that is refile *target* (heading to refile to)\r\n      2. I use helm search with org-ql to search for headings I want to refile under\r\n\t heading at point\r\n      3. I select multiple headings I want to refile (helm makes it easy)\r\n      4. I use custom action to refile all selected headings under heading at point\r\n\t https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#helm-org-ql\r\n\r\n- famubu asked about quick linking to other headings in the same Org document\r\n  (I think; it was by voice and I did not take many notes about this question)\r\n  - The traditional approach Org uses for linking is the following:\r\n    1. You go to heading you want to link to\r\n    2. You M-x org-store-link (C-c C-S-l). The link is stored in the link ring.\r\n    3. Maybe repeat 1 and 2 multiple times\r\n    4. You go back to you text and M-x org-insert-link (C-c C-l)\r\n       or M-x org-insert-all-links (C-c C-M-l). The completion will, by default,\r\n       offer links from the link ring\r\n  - Also, you can type [[*<TAB> and get a completion for headings inside current buffer\r\n    See [[org#Internal Links]] that touches on internal link completion and generally\r\n    described how to link to places inside the same document.\r\n  - Alternatively, you can make use of completion, for custom link types that\r\n    implement it. For example, just a few weeks ago, Steven Allen contributed\r\n    links built-in completion for id: links\r\n  - Another common approach is linking using third-party package like org-roam\r\n    or org-ql. I personally use org-ql when I need to add links at point\r\n\r\n- We then shifted the discussion towards linking to headings inside document\r\n  - The simplest way is =[[*Heading title]]=, but it may break if the heading\r\n    title ever changes. Also, when exporting to, say, HTML, the HTML anchor\r\n    will be generated randomly - a common annoying \"feature\" of Org. It is really\r\n    a feature as it prevents duplicate anchor names, but it is annoying as they are\r\n    (1) not human-readable (go figure how to make human-readable and also unique ids)\r\n    (2) not stable\r\n    - The stability can be solved when using publishing system as it maintains\r\n      id cache and does not change the generated ids (as much as possible) when\r\n      exporting\/publishing several times in a row\r\n    - Some people generate ids based on title once, so that they are retained even\r\n      when the title changes (with obvious downside of de-syncing the title and id).\r\n      For example, see Sacha's my-org-set-custom-id in https:\/\/sach.ac\/dotemacs\r\n  - Another way is specifying id explicitly in =CUSTOM_ID= property of a heading.\r\n    Then, =[[#custom_id_name]]= will refer to heading. Moreover, if\r\n    ~org-html-prefer-user-labels~ is set to t (it is *not* the default), the same\r\n    ids will be directly re-used in HTML. (Again, the fact that the default is nil\r\n    is a \"feature\" as custom ids may contain Unicode symbols, which would be problematic\r\n    in HTML)\r\n  - A similar problem may happen with links to non-headings (to named\r\n    images, blocks, or to targets). Sacha Chua shared her solution to this\r\n    https:\/\/sachachua.com\/blog\/2025\/02\/adding-an-anchor-to-a-paragraph-in-org-mode-html-export\/\r\n\r\n- The main famubu's use case is exporting to HTML (AFAIR). We thus also discussed\r\n  ways to customize the appearance of the exported HTML documents\r\n  - The usual way to change the looks of the exported HTML is customizing\r\n    CSS classes, or, more generally, HTML document preamble and postamble\r\n  - This can either be done manually, or you can make use of one of the existing\r\n    HTML themes for Org\r\n    - https:\/\/github.com\/fniessen\/org-html-themes \r\n    - https:\/\/github.com\/mrlee23\/readtheorg\r\n  - The themes are usually just a series of =#+HTML_HEAD= keywords, that can be\r\n    loaded via =#+SETUPFILE=\r\n    - =#+SETUPFILE= can point to a remote http location, so themes can be\r\n      automatically fetched online. Of course, local SETUPFILE is also possible\r\n  - When working with CSS, it is often desired to wrap some text into some HTML class\r\n    - This can be easily done with =#+begin_classname ... #+end_classname= special blocks\r\n      - Org HTML export will transform these blocks into container with \"classname\" class\r\n  - Also, if org-html-html5-fancy is non-nil and org-html-doctype is \"html5\" (by default\r\n    Org sticks to very conservative xml style), =#+begin_section\/summary\/etc= will\r\n    translate to the corresponding HTML5 tags instead of assigning class.\r\n\r\n- Org mode export (any export, not just HTML) also provides macro replacement\r\n  - See 13.5 Macro Replacement section of Org mode manual\r\n  - For example, one can substitute property values via ={{{property(...)}}}= macro\r\n  - Or just have classic macro use like\r\n    : #+MACRO: friendname Phoebe\r\n    : Hello, {{{friendname}}}\r\n\r\n- Going away from HTML, LaTeX export is more directly supported\r\n  - =\\begin{environment} ... \\end{environment}= are legal parts of Org mode syntax\r\n    that will not only work when exporting to LaTeX, but also when exporting\r\n    to other formats. For non-LaTeX, Org will usually pass the fragment through\r\n    LaTeX and generate an image.\r\n  - Similar for inline fragments $$a + b = c$$\r\n  - Note that both latex environments and inline latex fragments will be treated\r\n    as LaTeX syntax - no Org syntax can be used inside (despite fontification showing\r\n    the opposite - that's a bug in fontification code)\r\n  - For use Org markup inside environments, you can use special blocks\r\n  - When having a single environment is not good enough, there is always\r\n    =\\#+begin_export latex ... #+end_export= and inline\r\n    =@@latex:...@@=. But mind that this markup will be ignored when\r\n    exporting to other) formats.\r\n- Sacha commented that similarly to natively supported LaTeX fragments, one might\r\n  allow native HTML =<b>syntax<\/b>= when Org sees \"<\" (just like in vanilla Markdown).\r\n  - I am not sure about this. In particular, it is not entirely clear how to render\r\n    HTML syntax\r\n\r\n- famubu asked about putting links at the end of document as\r\n  #+begin_example\r\n  Hello [link][1].\r\n  Another [link[2].\r\n\r\n  [1]: https:\/\/www.example.com\r\n  [2]: https:\/\/www.example.com\/home.html\r\n  #+end_example\r\n  - This reminded me of Org mode's citation system\r\n  - Although something more directly related is simply footnotes\r\n    https:\/\/orgmode.org\/manual\/Creating-Footnotes.html\r\n\r\n- kickingvegas asked about printing bibliographies when exporting citations.\r\n  He had an issue with URL field in the bibtex record not being printed\r\n  - https:\/\/orgmode.org\/manual\/Citation-handling.html\r\n  - For rendering citations, (and for everything else) Org mode uses\r\n    customizeable citation processors. By default, the citations are\r\n    very basic - just author - title - year\r\n    (~org-cite-basic--print-entry~). We might extend that function if\r\n    you file a feature request.\r\n  - For more realistic scenarios, we recommend using CSL for printing\r\n    bibliography (https:\/\/orgmode.org\/manual\/Citation-export-processors.html)\r\n    - CSL processors are based on CSL standard that have templates for\r\n      pretty much all kinds of bibliographies. See\r\n      https:\/\/citationstyles.org\/authors\/ and\r\n      https:\/\/editor.citationstyles.org\/searchByExample\/\r\n\r\n- I shared a bit about my (Org mode maintainer) situation with time and handling\r\n  Org mode development\r\n  - The important maintainer's job is handling bug fixes and reviewing patches\r\n  - With my current job, I more or less have enough time to do exactly\r\n    these two activities (most of the time, when my schedules are regular-ish)\r\n  - Unfortunately, I cannot do much more, like adding new features or\r\n    doing some non-trivial code changes. This is a pity\r\n  - I am considering to ask for help with bug fixing to free up some time for\r\n    non-trivial code changes that require knowledge of Org mode code\r\n    (like the refactoring I have been talking about during\r\n    Emacsconf 2024) \r\n\r\n- Rudy shared his experiment with using Org parser to develop\r\n  multi-page HTML exporter\r\n  - He asked about the best way to look into the parse tree during debugging\r\n  - The AST structure is described in the commentary in org-element-ast.el\r\n  - Also, I recommend https:\/\/github.com\/mmontone\/emacs-inspector when\r\n    you need to look into deeply nested lists (which Org AST is)\r\n  - there is also ~pp~ function for pretty-printing arbitrary Lisp objects,\r\n    however Org AST has recursive circular references, so printing\r\n    might not always work well compared to interactive emacs-inspector views\r\n\r\n- Jake asked about programmatic way to check whether a given heading is\r\n  a blocker for other headings. He is writing a package that re-implements\r\n  taskwarrior's urgency system and wants to set higher urgency for\r\n  tasks that are blockers.\r\n  - I looked into ~org-entry-blocked-p~ and friends, and, given its\r\n    expendability, there is no universal way to check this. The logic\r\n    for blocking may be arbitrary\r\n  - I thought maybe https:\/\/elpa.gnu.org\/packages\/org-edna.html\r\n.    provides something, but nope\r\n  - So, brute force checking whether other headings are blocked is\r\n    probably the only 100% correct way\r\n  - Sacha also mentioned\r\n    https:\/\/github.com\/mskorzhinskiy\/org-linked-tasks\/blob\/master\/org-linked-tasks.el\r\n    (which she learned from https:\/\/www.reddit.com\/r\/emacs\/comments\/i9jv3l\/orgedna_how_to_set_scheduled_todo_keyword_only\/)\r\n  - We went on talking about org-edna and how it has its own DSL to describe blockers and\r\n    triggers. niklauz asked whether org-ql would make more sense to use. Although\r\n    org-edna is much, much older than org-ql.\r\n    - I briefly mentioned my limited usage of org-edna. I mostly use it to form chains\r\n      of tasks to do one after another (fix one bug after fixing another or watch\r\n      next movie in a series after\r\n      previous). https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#task-dependencies\r\n\r\n\r\n- niklauz asked about automatically setting a timestamp every time heading\r\n  contents is changed\r\n  - Similar discussions\r\n    - https:\/\/org-roam.discourse.group\/t\/update-a-field-last-modified-at-save\/321\r\n    - https:\/\/melpa.org\/#\/org-roam-timestamps\r\n  - I remember this question being asked several times in the past. I\r\n    even once replied with a code on reddit. (Long, long time ago)\r\n  - This can be done by maintaining hash of the contents + setting a timestamp\r\n    every time the hash changed (e.g. via save hooks)\r\n  - One pitfall is that property drawer may fall within contents,\r\n    which will create infinite update cycle. So, the property drawer,\r\n    or, at least, the hash\/update time property should be excluded\r\n    from hash calculation\r\n  - I did a quick code with rough implementation how to extract\r\n    contents via elisp\r\n    #+begin_src emacs-lisp\r\n      (when-let* ((hd (org-element-lineage (org-element-at-point) 'headline t)))\r\n        (when-let* ((cbeg (org-element-contents-begin hd)))\r\n          (let ((beg cbeg))\r\n            (catch :exit\r\n      \t(while (org-element-type-p (org-element-at-point beg) '(planning property-drawer))\r\n      \t  (let ((newbeg (org-element-end (org-element-at-point beg))))\r\n                  (when (equal newbeg beg) (throw :exit t))\r\n      \t    (setq beg (org-element-end (org-element-at-point beg))))))\r\n            (buffer-substring-no-properties beg (org-element-end hd)))))\r\n    #+end_src\r\n\r\n- Sacha asked whether there is Org element API to find end of metadata\r\n  (like org-end-of-meta-data, but using parser)\r\n  - There is none, even in my WIP rewrite that makes use of the parser\r\n    much more actively. Not that is cannot be done, but I did not feel\r\n    that it will give immediate benefits.\r\n\r\n- Sacha Chua invited me to talk about Org development during EmacsConf\r\n  - Unlikely to happen this year\r\n  - I am a bit annoyed by my lack of time. I can only work on Org\r\n    outside my main work hours. And those are fairly strict. Combined\r\n    with even less free time during my recent work trips, I am getting\r\n    piles of backlog (I just have enough time to address patches and\r\n    bugs, but nothing else). So, I do not quite want to add the task\r\n    of preparing Emacsconf presentation on top of that (it will be 1-2\r\n    weeks worth of free time)\r\n  - I also did less than I wanted to this year, especially on big code\r\n    development projects, which is also not great.\r\n  - For now, I'd rather try to focus on encouraging more people to\r\n    help with bug fixing\/patch reviews. That will free up some time\r\n    for complex (and interesting) code changes I want to do.\r\n    - (Note that I tried using EmacsConf for this purpose last year,\r\n      with \/some\/, but limited success)\r\n  - Reporting that I worked on bug reports and merged a couple of new\r\n    features won't be too exciting\r\n\r\n- karthink asked about org-fold-show-context-detail customization\r\n  - It provides a number of different ways to reveal folded text\r\n    around point (minimal, local, lineage, etc)\r\n  - But what karthink wants is showing ancestors (lineage) *and also descendants*\r\n  - Such view is indeed not there\r\n  - Maybe we should make org-fold-show-context-detail user-extendable\r\n    one day (it should be more or less trivial patch)\r\n\r\n- There was a periodic question about supporting time zones in timestamp\r\n  - Not much progress since summer (no update from the person who last volunteered)\r\n  - As I mentioned during previous meetups, it is now up to writing patches\r\n  - We have decided the syntax spec and roughly what needs to be done\r\n  - https:\/\/list.orgmode.org\/orgmode\/m2zffjwlyy.fsf@cao.sh\/ - what to\r\n    do to get started on the patch\r\n\r\n- Continuing about formatting time stamps, Jeff Trull asked whether Org mode\r\n  supports ISO8601 (https:\/\/en.wikipedia.org\/wiki\/ISO_8601)\r\n  - Partially. Org mode timestamps YYYY-MM-DD are compatible with\r\n    ISO-8601, but that standard defines several different ways to define\r\n    timestamp, including omitting dates, omitting \"-\", providing week number\r\n    instead of month, specifying seconds, etc. Org format is somewhat\r\n    stricter.\r\n- Jeff later clarified that he is particularly interested in distinction\r\n  between duration and timestamps in ISO-8601. ISO-8601 defines duration\r\n  independent of calendar dates. For example, P4Y stands for \"4\r\n  years\". Org mode has a notion of durations, but it is not part of\r\n  the actual Org syntax. Rather it is an optional feature that can be used\r\n  when working with tables or columns. Here is what org-duration.el says:\r\n  :  ;; This library provides tools to manipulate durations.  A duration\r\n  :  ;; can have multiple formats:\r\n  :  ;;\r\n  :  ;;   - 3:12\r\n  :  ;;   - 1:23:45\r\n  :  ;;   - 1y 3d 3h 4min\r\n  :  ;;   - 1d3h5min\r\n  :  ;;   - 3d 13:35\r\n  :  ;;   - 2.35h\r\n  - Funnily, Org mode defines durations in more lax way compared to timestamps\r\n  - Also, see https:\/\/orgmode.org\/manual\/Durations-and-time-values.html\r\n\r\n:comments:\r\n[17:54] [Pedro A. Aranda : VIEWER]: Hi\r\n[17:54] [yaca : VIEWER]: hello\r\n[17:54] [Pedro A. Aranda : VIEWER]: Back to \"real life\" after the summer...\r\n[18:00] [Dave Marquardt : VIEWER]: Hello\r\n[18:00] [Thomas : VIEWER]: Hi all\r\n[18:00] yantar92 is now the presenter\r\n[18:01] [Rudy : VIEWER]: Howdy!\r\n[18:01] [Pedro A. Aranda : VIEWER]: Hi!\r\n[18:02] [Sacha Chua : VIEWER]: Hello hello! =)\r\n[18:02] [yantar92 : MODERATOR]: The latest Emacs news: https:\/\/sachachua.com\/blog\/2025\/09\/2025-09-08-emacs-news\/\r\n[18:03] [Sacha Chua : VIEWER]: The kiddo is back to virtual school, so I can help with taking notes again and stuff. \r\n[18:03] [Sacha Chua : VIEWER]: yantar92: did we want to use a separate Etherpad or the shared notes?\r\n[18:04] [yantar92 : MODERATOR]: Public Etherpad where we can write even after the meetup: https:\/\/pad.emacsconf.org\/orgmeetup\r\n[18:06] [Pedro A. Aranda : VIEWER]: \ud83d\ude04\r\n[18:07] [Sacha Chua : VIEWER]: EmacsConf CFP target date: next Friday (Sept 19) https:\/\/emacsconf.org\/2025\/cfp\/ , could be nice to see what people are up to in terms of Org workflows\r\n[18:09] [Rudy : VIEWER]: Possible topics: ID link completions, multi-page HTML export [I started working on mine, in the meantime, with the amazing Org Element API], status update on the new LaTeX subsystem, status update on the \"proper parsing\" branch. \ud83d\ude0a\r\n[18:10] [Sacha Chua : VIEWER]: Also, I liked this workflow for using a dynamic hydra for refiling Org notes into buckets. Haven't tried it myself yet, but I've been wanting something like it for a while: https:\/\/gist.github.com\/jsomers\/ded472b1aa3b92d5fc8b35e92164eb07\r\n[18:11] [yantar92 : MODERATOR]: [[info:org#Internal Links][org#Internal Links]]\r\n[18:11] [yantar92 : MODERATOR]: about internal links\r\n[18:11] [yantar92 : MODERATOR]: (including links to figures)\r\n[18:14] [Sacha Chua : VIEWER]: https:\/\/github.com\/fniessen\/org-html-themes and https:\/\/github.com\/mrlee23\/readtheorg have examples of how to use #+SETUPFILE: \r\n\r\n\r\n\r\n[18:14] [Sacha Chua : VIEWER]: ah, HTML anchors\r\n[18:14] [Pedro A. Aranda : VIEWER]: Where to you get the shortcut characters? This may confuse newbies... \r\n[18:14] [Sacha Chua : VIEWER]: I often use CUSTOM_ID in a subtree to set that for a heading\r\n[18:15] [Rudy : VIEWER]: Pedro: +1 (he should disable the special characters when teaching people about Org; it is confusing even for a veteran)\r\n[18:15] [Sacha Chua : VIEWER]: (if we're talking about HTML anchors, that is)\r\n[18:15] [Pedro A. Aranda : VIEWER]: \ud83d\ude09\r\n[18:15] [Nick Anderson : VIEWER]: I see it\r\n[18:15] [Sacha Chua : VIEWER]: I can see yantar's screen\r\n[18:15] [Nick Anderson : VIEWER]: and its updating \r\n[18:16] [yantar92 : MODERATOR]: https:\/\/github.com\/fniessen\/org-html-themes\r\n[18:17] [Rudy : VIEWER]: I just style with CSS (all classes are documented), and it is pretty powerful.\r\n[18:17] [famubu : VIEWER]: You mean `#+HTML`?\r\n[18:17] [Sacha Chua : VIEWER]: CUSTOM_ID property, then you can org-store-link a reference to it and then org-insert-link and it will turn into ... \r\n[18:19] [Sacha Chua : VIEWER]: oh I have a post about non-heading anchors, like if you want to link to  paragraph. You can #+ATTR_HTML: :id ... right before it. https:\/\/sachachua.com\/blog\/2025\/02\/adding-an-anchor-to-a-paragraph-in-org-mode-html-export\/ \r\n[18:19] [Sacha Chua : VIEWER]: yeah, random hashes are not pretty =)\r\n[18:19] [Nick Anderson : VIEWER]: OH that is a great tip\r\n[18:19] [Sacha Chua : VIEWER]: I have a my-org-set-custom-id in https:\/\/sach.ac\/dotemacs that sets the CUSTOM_ID based on the outline path of the headings\r\n[18:20] [yantar92 : MODERATOR]: [[info:org#Headlines in HTML export][org#Headlines in HTML export]]\r\n[18:20] [yantar92 : MODERATOR]: + you can use publishing for stable anchors\r\n[18:23] [Rudy : VIEWER]: Chinese :CUSTOM_ID: whatshamacallit \ud83d\ude0a\r\n[18:24] [famubu : VIEWER]: In markdown we can group together links at the end of the document like:\r\n\r\n```\r\nHello [link][1].\r\nAnother [link[2].\r\n\r\n[1]: https:\/\/www.example.com\r\n[2]: https:\/\/www.example.com\/home.html\r\n```\r\n\r\nIs there a similar way in org?\r\n\r\nRight now I'm using a seperate `#+LINK` for each link and then using that name.\r\n[18:24] [Sacha Chua : VIEWER]: I have a validation function that complains if I have headings with the same outline path, and I have a function that assigns CUSTOM_IDs for all the headings in the buffer if they don't already have one =)\r\n[18:25] [Nick Anderson : VIEWER]: Footnotes\r\n[18:25] [Rudy : VIEWER]: Citations are heavyweight; perhaps footnotes.\r\n[18:25] [Nick Anderson : VIEWER]: https:\/\/orgmode.org\/manual\/Creating-Footnotes.html\r\n[18:26] [Rudy : VIEWER]: #+print_bibliography:\r\n[18:27] [Nick Anderson : VIEWER]: someday ill start using citations\r\n[18:28] [Harry : VIEWER]: with citeproc.el css works very nicely \r\n[18:28] [Sacha Chua : VIEWER]: Putting the links at the end tends to help with Markdown readability, but since Org Mode hides the link targets, I find I don't need that as much. It also helps with writing the text and then figuring out the links later, which I have an Org workflow for now. I can write [[lots of plain links]] and then run a function to go back and fill all those links in interactively. (https:\/\/sachachua.com\/blog\/2025\/07\/finding-unlinked-text\/)\r\n[18:28] [Nick Anderson : VIEWER]: I use footnotes a fair amount, quite simple and effective.\r\n[18:29] [Sacha Chua : VIEWER]: I like using footnotes when I want to add extra text, not just a link. I have some JS that duplicates them as side notes.\r\n[18:29] [Nick Anderson : VIEWER]: org-footnote-new\r\n[18:30] [Rudy : VIEWER]: The footnotes can be also all at the end in the Org file, FYI.  Ihor showed inline footnotes.\r\n[18:30] [Pedro A. Aranda : VIEWER]: Need to leave.... waiting til you are ready to continue with the fonts.. \ud83d\ude04\r\n[18:30] [yantar92 : MODERATOR]: https:\/\/github.com\/emacsorphanage\/ox-pandoc\r\n[18:31] [niklauz : VIEWER]: Hi folks \ud83d\ude0a \r\n[18:31] [Rudy : VIEWER]: niklauz: Hi!\r\n[18:32] [Sacha Chua : VIEWER]: Custom tags... Oh, would you find custom Org link types useful?\r\n[18:34] [Sacha Chua : VIEWER]: Like, I use org-link-set-parameters to make a sketchThumb: link type that turns [[sketchThumb:filename.png]] into a {% sketchThumb ... %} shortcode for my blogging engine\r\n[18:35] [Sacha Chua : VIEWER]: oh that's interesting, I didn't know about using org-html-html5-elements for directly translating #+begin_... into tags.\r\n[18:36] [Sacha Chua : VIEWER]: What kinds of custom tags are you thinking about? Could you give an example?\r\n[18:36] [Rudy : VIEWER]: org-html-html5-fancy is not documented as #+options:\r\n[18:37] [Rudy : VIEWER]: [in C-h v]\r\n[18:37] [famubu : VIEWER]: Perhaps `(setq org-html-doctype \"html5\")`? \r\n\r\n[18:38] [Rudy : VIEWER]: I wonder when (if ever) will Org start defaulting to HTML5.  2050? \ud83d\ude0a\r\n[18:38] [famubu : VIEWER]: Like `#+FRIEND_NAME:` \r\n[18:38] [Sacha Chua : VIEWER]: what output do you want?\r\n[18:38] [famubu : VIEWER]: I don't if that's tag.\r\n[18:39] [Sacha Chua : VIEWER]: Oh, if you want to set the text and then have it substituted in your blog post, that sounds like Org macros\r\n[18:39] [famubu : VIEWER]: I wish to insert value of that `FRIEND_NAME` into appropriate spot inside the html template while exporting.\r\n[18:39] [Sacha Chua : VIEWER]: Yeah that definitely sounds like macros\r\n[18:40] [Rudy : VIEWER]: Fontification to confuse the enemy!\r\n[18:40] [Rudy : VIEWER]: And friends as well. \ud83d\ude01\r\n[18:40] [Sacha Chua : VIEWER]: \"Macro Replacement\" in the Org manual, #+MACRO: name   replacement text; $1, $2 are arguments, use like this:\r\n#+MACRO: friendname Phoebe\r\nHello,  {{{friendname}}}\r\n[18:41] [Rudy : VIEWER]: APL Org\r\n[18:43] [niklauz : VIEWER]: I've been looking more at LaTeX lately - are there clever ways to parameterized latex or strong guides on how to map Org elements to Latex elements?\r\n[18:44] [Sacha Chua : VIEWER]: Can probably also have it expand to raw HTML if you need to, using syntax like @@html:Text goes here@@\r\n[18:44] [Rudy : VIEWER]: It would be great to have overlays with resolved macros (e.g. descriptive macros, like we have descriptive links).\r\n[18:45] [niklauz : VIEWER]: I've been poking at how to ... for example, use Org `#+USERNAME: myusername` in something like `Login provided to \\bf{ {{{KEYWORD(USERNAME)}}} }`or something like that\r\n[18:45] [famubu : VIEWER]: I guess worg source is the best place to look for examples.\r\n[18:47] [Sacha Chua : VIEWER]: niklauz: ooooh, I can imagine how setting the properties and then including the template file could be pretty interesting\r\n[18:48] [niklauz : VIEWER]: Ah - so this may seems like a basic question, but are Latex commands usable without needing to be wrapped in a src\/export block?\r\n[18:48] [niklauz : VIEWER]: (I don't know if I've ever seen that stated so clearly anywhere)\r\n[18:48] [niklauz : VIEWER]: Awsome!\r\n[18:49] [niklauz : VIEWER]: Org never ceases to amaze\r\n[18:50] [niklauz : VIEWER]: Would you be willing to show the example with `USERNAME` on your screen as an example ... wondering if it's possible to use PROPERTIES to interpolate or variablize LaTeX\r\n[18:50] [Sacha Chua : VIEWER]: I wonder if it would make sense to have something like that for HTML tags, like if < is the beginning of the line\r\n[18:51] [kickingvegas : VIEWER]: hi folks - since it looks like Org export to LaTeX is being covered, any guidance on #+CITE_EXPORT for basic references? I'm trying to cite a bib reference (@online, @software) with a url field and the url does not get printed out in the bibliography. \r\n[18:52] [niklauz : VIEWER]: @Sacha there's something like that for supporting HTML within Markdown, isn't there?\r\n[18:55] [kickingvegas : VIEWER]: @niklauz - you can insert raw HTML into Markdown \r\n[18:56] [Sacha Chua : VIEWER]: For environments, that's one of the reasons why I like the #+begin_myenvironment ... #+end_myenvironment style, since it exports to HTML fine as well.\r\n[18:59] [famubu : VIEWER]: I need to go now. Thanks everyone!\r\n[19:00] [Sacha Chua : VIEWER]: famubu: good luck with your blog!\r\n[19:00] [Rudy : VIEWER]: famubu: Cheers!\r\n[19:00] [Sacha Chua : VIEWER]: famubu: let me know at sacha@sachachua.com when you post Emacs things so I can include them in Emacs News =)\r\n[19:01] [Sacha Chua : VIEWER]: Pedro just mentioned that he's back and ready to work on it again\r\n[19:05] [Sacha Chua : VIEWER]: Is there a good way to visualize the data structures? Sometimes edebug \/ prin1 isn't very helpful because the nested properties are very long\r\n[19:07] [Sacha Chua : VIEWER]: Ehh, maybe I should just get better at looking at the nesting =)\r\n[19:08] [yantar92 : MODERATOR]: https:\/\/github.com\/mmontone\/emacs-inspector\r\n[19:09] [Jake : VIEWER]: Also Emacs has a pretty printer function called pp\r\n[19:09] [Sacha Chua : VIEWER]: oh yeah, I actually have that\r\n[19:09] [Sacha Chua : VIEWER]: (pp - but it's pretty nested, so that's why I was getting confused)\r\n[19:09] [Jake : VIEWER]: Right, the references would be confusing\r\n[19:10] [Sacha Chua : VIEWER]: pp hides cyclic references (shows #0, #1), which is nice\r\n[19:10] [Rudy : VIEWER]: The Org Element API really elevates Org, IMO.  Really good stuff.  Easy to use, fast, etc.\r\n[19:14] [Jake : VIEWER]: I'm trying to design a function that checks whether the heading at point is blocking something else, sort of an inverse of org-entry-blocked-p.\r\n\r\nI have some ideas, but I'm curious to know how other people would approach the problem.\r\n[19:14] [Jake : VIEWER]: My first thought: trigger blocking hooks for every heading in the agenda, and then check org-block-entry-blocking.\r\n[19:15] [Sacha Chua : VIEWER]: Jake: Are you using something like org-edna for the task dependencies?\r\n[19:15] [Sacha Chua : VIEWER]: or just the hierarchy?\r\n[19:15] [Rudy : VIEWER]: kickingvegas:  You can use out-of-the-box citations, if you do not care about the style.  But if you want to publish, e.g. journal or instructor tells you what style they are expecting.  For that, just download CSL and plop that one line into your Org.  I have used it a lot at uni, and it works well.\r\n[19:15] [Jake : VIEWER]: Yeah, I am using org-edna.\r\n[19:15] [Nick Anderson : VIEWER]: Search for like http\r\n[19:15] [yantar92 : MODERATOR]: https:\/\/editor.citationstyles.org\/searchByExample\/\r\n[19:16] [yantar92 : MODERATOR]: https:\/\/github.com\/andras-simonyi\/citeproc-el\r\n[19:16] [Jake : VIEWER]: Maybe just searching BLOCKER props for the current entry's ID would be enough for the way I use org-edna.\r\n[19:16] [Sacha Chua : VIEWER]: kickingvegas: ... or hack something around the Org export to modify the output? \ud83d\ude09\r\n[19:17] [Sacha Chua : VIEWER]: Jake: sounds promising\r\n[19:17] [Sacha Chua : VIEWER]: kickingvegas: the CSL does sound like the proper way to do it\r\n[19:19] [Jake : VIEWER]: Yeah, I think that the blocking logic in org mode is too flexible for my solution to be as general as I'd like.\r\n[19:20] [Sacha Chua : VIEWER]: Jake: https:\/\/github.com\/mskorzhinskiy\/org-linked-tasks\/blob\/master\/org-linked-tasks.el uses org-ql to do property searches for linked tasks, if you're looking for a similar thing\r\n[19:21] [niklauz : VIEWER]: I've wondered if org-ql could be setup for use within Org-EDNA ... is that feasible?\r\n[19:21] [niklauz : VIEWER]: I imagine that if org-ql existed first, that's probably how it would've been built.\r\n[19:21] [Sacha Chua : VIEWER]: https:\/\/www.reddit.com\/r\/emacs\/comments\/i9jv3l\/orgedna_how_to_set_scheduled_todo_keyword_only\/ is a relevant Reddit thread\r\n[19:22] [Sacha Chua : VIEWER]: that org-edna--finder-cache looks potentially interesting too\r\n[19:23] [niklauz : VIEWER]: Wow, Ihor you make is look \/almost\/ straight-forward hahah\r\n[19:24] [Sacha Chua : VIEWER]: the docstring of the cache notes that it doesn't work for relative context, though\r\n[19:24] [niklauz : VIEWER]: FWIW I believe org-ql includes caching\r\n[19:26] [Jake : VIEWER]: For context: I've written a package that reimplement's taskwarrior's urgency system, and I was looking for ways to make blocking tasks more urgent.\r\n\r\n\r\n\r\nSince I may release the package, I was exploring how I might make that work for other users.\r\n[19:26] [Sacha Chua : VIEWER]: if you mainly use IDs and the performance of the property search doesn't work out, it might be interesting to have a function that can add an explicit backlink for you or something\r\n[19:27] [Jake : VIEWER]: Not necessarily based on org-edna.\r\n[19:27] [Jake : VIEWER]: Just wanted to account for users using org-edna like I do.\r\n[19:28] [Sacha Chua : VIEWER]: right, the Reddit thread was about having multiple tasks collectively trigger another task\r\n[19:28] [Jake : VIEWER]: So I'd have the org-urgency package plus an org-urgency-edna package or something for the integration with org-edna.\r\n[19:29] [Jake : VIEWER]: I might advise org-edna functions and override org-get-heading to include a market\r\n[19:29] [Jake : VIEWER]: marker*\r\n[19:30] [Jake : VIEWER]: ah, right\r\n[19:30] [Sacha Chua : VIEWER]: mmm, make it work for your use case and then see if other people are motivated enough to help get it working for theirs? =)\r\n[19:31] [Jake : VIEWER]: Probably the right thing to do for now, yeah\r\n[19:31] [Sacha Chua : VIEWER]: aha, support for the explicit backlink property - it works for yantar92 \ud83d\ude09\r\n[19:32] [Sacha Chua : VIEWER]: oh actually, no, that's just a forward link to the blocker\r\n[19:33] [Sacha Chua : VIEWER]: but his config does set up the trigger at the same time, so yeah, explicit links\r\n[19:33] [Jake : VIEWER]: I have to split. I appreciate the help and advice!\r\n[19:34] [niklauz : VIEWER]: Is there a good MODIFICATION  or CONTENTHASH updater solution for Org Headlines? \r\n[19:35] [Sacha Chua : VIEWER]: do you mean setting a property with modification date or hash of the contents?\r\n[19:35] [Nick Anderson : VIEWER]: https:\/\/org-roam.discourse.group\/t\/update-a-field-last-modified-at-save\/321\r\n[19:35] [niklauz : VIEWER]: a general purpose form of this, https:\/\/melpa.org\/#\/org-roam-timestamps\r\n[19:35] [niklauz : VIEWER]: ah, yes\r\n[19:37] [niklauz : VIEWER]: I wonder why there isn't a consensus general purpose package to provide this? Could it be everyone has solved it as a one-off?\r\n[19:38] [niklauz : VIEWER]: oh, haven't seen an org-element example - may you paste that code snippet into chat please?\r\n[19:39] [niklauz : VIEWER]: I have a messy hand-jammed solution in my config heheh\r\n[19:39] [yantar92 : MODERATOR]: (when-let* ((hd (org-element-lineage (org-element-at-point) 'headline 'include-self)))\r\n  ;; caveat: also need to exclude PROPERTIES drawer itself to avoid hashing the hash\r\n  ;; caveat 2: need to make sure that context-begin\/end is non-nil\r\n  (let ((chash (md5 (current-buffer) (org-element-contents-begin hd) (org-element-contents-end hd))))\r\n    (org-entry-put \"CHASH\" chash)))\r\n[19:39] [niklauz : VIEWER]: Cheers!\r\n[19:40] [Sacha Chua : VIEWER]: is there an org-element API equivalent of org-end-of-meta-data?\r\n[19:43] [Sacha Chua : VIEWER]: I tend to use org-end-of-meta-data + org-end-of-subtree (or org-heading-regexp) a lot to get just the text of a subtree, but it would be neat to have an org-element way of getting the text. =) \r\n[19:47] [yantar92 : MODERATOR]: (when-let* ((hd (org-element-lineage (org-element-at-point) 'headline t)))\r\n  (when-let* ((cbeg (org-element-contents-begin hd)))\r\n    (let ((beg cbeg))\r\n      (while (org-element-type-p (org-element-at-point beg) '(planning property-drawer))\r\n\t(setq beg (org-element-end (org-element-at-point beg))))\r\n      (buffer-substring-no-properties beg (org-element-end hd)))))\r\n[19:50] [yantar92 : MODERATOR]: (when-let* ((hd (org-element-lineage (org-element-at-point) 'headline t)))\r\n  (when-let* ((cbeg (org-element-contents-begin hd)))\r\n    (let ((beg cbeg))\r\n      (catch :exit\r\n\t(while (org-element-type-p (org-element-at-point beg) '(planning property-drawer))\r\n\t  (let ((newbeg (org-element-end (org-element-at-point beg))))\r\n            (when (equal newbeg beg) (throw :exit t))\r\n\t    (setq beg (org-element-end (org-element-at-point beg))))))\r\n      (buffer-substring-no-properties beg (org-element-end hd)))))\r\n[19:53] [niklauz : VIEWER]: Put me down for 2026 \ud83d\ude09 \r\n[19:54] [niklauz : VIEWER]: When is the schedule mostly firmed up?\r\n[19:55] [niklauz : VIEWER]: Perfecto\r\n[19:57] [niklauz : VIEWER]: The state of Emacs and State of Org are must watch \ud83d\ude01\r\n[19:58] [karthink : VIEWER]: I have a question about org-fold-show-context-detail.  Is there no view that shows the current entry in full but a sparse-tree view of its position in the document?  i.e. show its direct ancestors and descendants as headings-only.\r\n[19:58] [niklauz : VIEWER]: I recall last year there was a mention of TZ aware time-stamps, is that still WIP?\r\n[19:58] [niklauz : VIEWER]: Karthik FTW \r\n[19:58] [Rudy : VIEWER]: LaTeX preview!\r\n[19:58] [Rudy : VIEWER]: +1 Karthink FTW!\r\n[20:00] [Rudy : VIEWER]: Gosh, 20:00.\r\n[20:00] [Rudy : VIEWER]: Gotta go!\r\n[20:00] [Rudy : VIEWER]: [Lecture starting.]\r\n[20:00] [Rudy : VIEWER]: Cheers and thanks everyone!\r\n[20:00] [Thomas : VIEWER]: I need to leave. Thank you!\r\n[20:02] [niklauz : VIEWER]: Was there a spec adopted?\r\n[20:03] [niklauz : VIEWER]: (just curious what it'll look like)\r\n[20:04] [niklauz : VIEWER]: Ah OK, great!\r\n[20:05] [niklauz : VIEWER]: Yeah, all the time\/clock math will be a lot\r\n[20:06] [niklauz : VIEWER]: Yup - OK thanks for the update\r\n[20:06] [Jeff Trull : VIEWER]: Do we support iso 8601 timestamps in any way\r\n[20:06] [Nick Anderson : VIEWER]: Thanks so much for organizing and doing these.\r\n[20:08] [Jeff Trull : VIEWER]: I'm interested in the distinction between \"timepoint\" and \"duration\" also. It looks like org tables understand duration (at least in calculations), and we have org-duration.el\r\n[20:09] [Jeff Trull : VIEWER]: It's interesting for clock tables\r\n[20:10] [Jeff Trull : VIEWER]: I make timesheets for invoices in org and it's always a question what e.g. 03:47 represents - a time or a duration\r\n[20:17] [yantar92 : MODERATOR]: Input duration values must be of the form \u2018HH:MM[:SS]\u2019, where seconds\r\nare optional\r\n[20:18] [yantar92 : MODERATOR]: 3.5.4 Durations and time values in the manual\r\n[20:18] [Jeff Trull : VIEWER]: This is interesting for export reasons too; ooxml (for example) has a separate format option for timestamps and durations that displays and calculates with them differently\r\n[20:18] [Jeff Trull : VIEWER]: It's strange because the textual representation is the same but the calculation behavior is different and it's a function of the format not the contents\r\n[20:19] [Jeff Trull : VIEWER]: Thanks for the tour!\r\n[20:21] [niklauz : VIEWER]: Nothing more from me - thanks Ihor \ud83d\ude0a \r\n[20:21] [Jeff Trull : VIEWER]: Next time we can talk about grid-table \ud83d\ude0a\r\n[20:21] [kickingvegas : VIEWER]: thanks!\r\n[20:21] [Jeff Trull : VIEWER]: Thanks Ihor!\r\n[20:21] [zaimon : VIEWER]: Thanks everyone\r\n[20:21] [Jeff Trull : VIEWER]: We don't have to do that now haha\r\n[20:21] [karthink : VIEWER]: Thanks for the meetup\r\n[20:22] [Jacob S. Gordon : VIEWER]: Thanks Ihor!\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[BLOG] #22 [[bbb:OrgMeetup]] on Wed, September 10, 19:00 UTC+3"},{"date":"2025-10-19T01:46:54.236Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CH3PR84MB34245377412B6E3917F9646FC5F4A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","message-id":"CH3PR84MB34245377412B6E3917F9646FC5F4A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","config":false,"refs-count":6,"username":"Morgan Smith","references":["871pn0mjzo.fsf@localhost","CH3PR84MB342451672330892DD73B7FBDC5F7A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB342468AAE5D5B20DFD4DDA87C5E4A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","87jz0sjc60.fsf@localhost"],"related-refs":["CH3PR84MB34245377412B6E3917F9646FC5F4A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB3424237FD01EE11F68DAC3B2C5FEA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB34243F62B1C91577839632EEC5F4A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"from":"Morgan.J.Smith@outlook.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/CH3PR84MB34245377412B6E3917F9646FC5F4A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","source-id":"emacs-orgmode@gnu.org","patch-body":"From e68af3f741c059f4884e756ad840a940b3a8fb83 Mon Sep 17 00:00:00 2001\r\nFrom: Morgan Smith <Morgan.J.Smith@outlook.com>\r\nDate: Sat, 18 Oct 2025 21:19:50 -0400\r\nSubject: [PATCH] address comments\r\n\r\n---\r\n testing\/lisp\/test-org-habit.el | 231 +++++++++++++++++++++------------\r\n 1 file changed, 146 insertions(+), 85 deletions(-)\r\n\r\ndiff --git a\/testing\/lisp\/test-org-habit.el b\/testing\/lisp\/test-org-habit.el\r\nindex 652a2ca70..37bf1d3c2 100644\r\n--- a\/testing\/lisp\/test-org-habit.el\r\n+++ b\/testing\/lisp\/test-org-habit.el\r\n@@ -100,7 +100,8 @@ test-org-habit\/simple-habit\r\n   \"Test the agenda view for a simple habit.\"\r\n   (org-test-at-time \"2009-10-22\"\r\n     (let ((org-agenda-custom-commands\r\n-           org-test-habit-no-fluff-agenda))\r\n+           org-test-habit-no-fluff-agenda)\r\n+          (org-habit-graph-column 5))\r\n       (org-test-agenda-with-agenda\r\n           \"* TODO habit\r\n SCHEDULED: <2009-10-21 Sat ++2d>\r\n@@ -111,122 +112,179 @@ test-org-habit\/simple-habit\r\n - State \\\"DONE\\\"       from \\\"TODO\\\"       [2009-10-17 Sun]\"\r\n         (should\r\n          (string-equal\r\n-          \"\\nhabit                                                   * *  !       \\n\"\r\n+          \"\\nhabit                * *  !       \\n\"\r\n           (progn\r\n             (org-agenda nil \"f\")\r\n             (buffer-string))))))))\r\n \r\n+(ert-deftest test-org-habit\/org-extend-today-until ()\r\n+  \"Test habit graph with `org-extend-today-until' set.\"\r\n+  (org-test-at-time \"2009-10-20\"\r\n+    (let ((org-agenda-custom-commands\r\n+           org-test-habit-no-fluff-agenda)\r\n+          (org-habit-preceding-days 5)\r\n+          (org-habit-following-days 5)\r\n+          (org-habit-graph-column 5)\r\n+          (org-habit-show-all-today t))\r\n+      (dolist (org-extend-today-until '(0 1 2))\r\n+        (org-test-agenda-with-agenda\r\n+            \"* TODO habit\r\n+SCHEDULED: <2009-10-20 Sat ++1d>\r\n+:PROPERTIES:\r\n+:STYLE:    habit\r\n+:END:\r\n+- State \\\"DONE\\\"       from \\\"TODO\\\"       [2009-10-19 Sun 00:20]\r\n+- State \\\"DONE\\\"       from \\\"TODO\\\"       [2009-10-17 Sun 01:20]\"\r\n+          (should\r\n+           (string-equal\r\n+            (cl-case org-extend-today-until\r\n+              (0 \"\\nhabit  * *!     \\n\")\r\n+              ;; TODO: This is not correct at all.  Should be the following\r\n+              ;; (1 \"\\nhabit  ** !   \\n\")\r\n+              ;; (2 \"\\nhabit * * !   \\n\")\r\n+              (t \"\\nhabit   * *     \\n\"))\r\n+            (progn\r\n+              (org-agenda nil \"f\")\r\n+              (buffer-string)))))))))\r\n+\r\n+(ert-deftest test-org-habit\/dst ()\r\n+  \"Test the habit graph traversing a daylight savings time transition.\"\r\n+  ;; DST transition [2009-11-01 01:59] -> [2009-11-01 01:00]\r\n+  (org-test-with-timezone \"America\/New_York\"\r\n+    (org-test-at-time \"2009-10-28\"\r\n+      (let ((org-agenda-custom-commands\r\n+             org-test-habit-no-fluff-agenda)\r\n+            (org-habit-preceding-days 5)\r\n+            (org-habit-following-days 5)\r\n+            (org-habit-graph-column 5))\r\n+        (org-test-agenda-with-agenda\r\n+            \"* TODO habit\r\n+SCHEDULED: <2009-10-28 Sat ++1d>\r\n+:PROPERTIES:\r\n+:STYLE:    habit\r\n+:END:\r\n+- State \\\"DONE\\\"       from \\\"TODO\\\"       [2009-10-27 Sun]\r\n+- State \\\"DONE\\\"       from \\\"TODO\\\"       [2009-10-25 Sun]\"\r\n+          (should\r\n+           (string-equal\r\n+            ;; TODO: we lost a day in the transition! should be:\r\n+            ;; \"\\nhabit  * *!     \\n\"\r\n+            \"\\nhabit  * *!    \\n\"\r\n+            (progn\r\n+              (org-agenda nil \"f\")\r\n+              (buffer-string)))))))))\r\n+\r\n (ert-deftest test-org-habit\/habit ()\r\n   \"Test the agenda view for a habit.\"\r\n   (org-test-at-time \"2009-10-17\"\r\n     (org-test-habit\r\n-      (should\r\n-       (string-equal\r\n-        \"\\nShave                                      *  * *     * *  * !       \\n\"\r\n-        (progn\r\n-          (org-agenda nil \"f\")\r\n-          (buffer-string)))))))\r\n+     (should\r\n+      (string-equal\r\n+       \"\\nShave                                      *  * *     * *  * !       \\n\"\r\n+       (progn\r\n+         (org-agenda nil \"f\")\r\n+         (buffer-string)))))))\r\n \r\n (ert-deftest test-org-habit\/graph-column ()\r\n   \"Test how modifiying `org-habit-graph-column' affects habits in the agenda.\"\r\n   (org-test-at-time \"2009-10-17\"\r\n     (org-test-habit\r\n-      (dolist (org-habit-graph-column '(0 1 2 3 10 20 40 100))\r\n-        (should\r\n-         (string-equal\r\n-          (cl-case org-habit-graph-column\r\n-            (0 \"\\n   *  * *     * *  * !       \\n\")\r\n-            (1 \"\\nS   *  * *     * *  * !       \\n\")\r\n-            (2 \"\\nSh   *  * *     * *  * !       \\n\")\r\n-            (3 \"\\nSha   *  * *     * *  * !       \\n\")\r\n-            ((10 20 40 100) (concat \"\\nShave\"\r\n-                                    (make-string (- org-habit-graph-column 2) 32)\r\n-                                    \"*  * *     * *  * !       \\n\"))\r\n-            (t (cl-assert nil nil \"Missing case!\")))\r\n-          (progn\r\n-            (org-agenda nil \"f\")\r\n-            (buffer-string))))))))\r\n+     (dolist (org-habit-graph-column '(0 1 2 3 10 20 40 100))\r\n+       (should\r\n+        (string-equal\r\n+         (cl-case org-habit-graph-column\r\n+           (0 \"\\n   *  * *     * *  * !       \\n\")\r\n+           (1 \"\\nS   *  * *     * *  * !       \\n\")\r\n+           (2 \"\\nSh   *  * *     * *  * !       \\n\")\r\n+           (3 \"\\nSha   *  * *     * *  * !       \\n\")\r\n+           ((10 20 40 100) (concat \"\\nShave\"\r\n+                                   (make-string (- org-habit-graph-column 2) 32)\r\n+                                   \"*  * *     * *  * !       \\n\"))\r\n+           (t (cl-assert nil nil \"Missing case!\")))\r\n+         (progn\r\n+           (org-agenda nil \"f\")\r\n+           (buffer-string))))))))\r\n \r\n (ert-deftest test-org-habit\/preceding-days ()\r\n   \"Test how modifiying `org-habit-preceding-days' affects habits in the agenda.\"\r\n   (org-test-at-time \"2009-10-17\"\r\n     (org-test-habit\r\n-      (dolist (org-habit-preceding-days '(0 1 2 3 10 20 40 100))\r\n-        (should\r\n-         (string-equal\r\n-          (cl-case org-habit-preceding-days\r\n-            (0 \"\\nShave                                   !       \\n\")\r\n-            (1 \"\\nShave                                    !       \\n\")\r\n-            (2 \"\\nShave                                   * !       \\n\")\r\n-            (3 \"\\nShave                                    * !       \\n\")\r\n-            (10 \"\\nShave                                      * *  * !       \\n\")\r\n-            (20 \"\\nShave                                     *  * *     * *  * !       \\n\")\r\n-            ((40 100) (concat \"\\nShave\"\r\n-                              (make-string org-habit-preceding-days 32)\r\n-                              \"*   *  *     *   *  * *     * *  * !       \\n\"))\r\n-            (t (cl-assert nil nil \"Missing case!\")))\r\n-          (progn\r\n-            (org-agenda nil \"f\")\r\n-            (buffer-string))))))))\r\n+     (dolist (org-habit-preceding-days '(0 1 2 3 10 20 40 100))\r\n+       (should\r\n+        (string-equal\r\n+         (cl-case org-habit-preceding-days\r\n+           (0 \" !       \\n\")\r\n+           (1 \"  !       \\n\")\r\n+           (2 \" * !       \\n\")\r\n+           (3 \"  * !       \\n\")\r\n+           (10 \"    * *  * !       \\n\")\r\n+           (20 \"   *  * *     * *  * !       \\n\")\r\n+           ((40 100) (concat (make-string (- org-habit-preceding-days 34) 32)\r\n+                             \"*   *  *     *   *  * *     * *  * !       \\n\"))\r\n+           (t (cl-assert nil nil \"Missing case!\")))\r\n+         (progn\r\n+           (org-agenda nil \"f\")\r\n+           (buffer-substring (+ 1 org-habit-graph-column) (point-max)))))))))\r\n \r\n (ert-deftest test-org-habit\/following-days ()\r\n   \"Test how modifiying `org-habit-following-days' affects habits in the agenda.\"\r\n-  (org-test-at-time \"2009-10-17\"\r\n-    (org-test-habit\r\n-      (dolist (org-habit-following-days '(0 1 2 3 10 20 40 100))\r\n-        (should\r\n-         (string-equal\r\n-          (cl-case org-habit-following-days\r\n-            (0   \"\\nShave                                      *  * *     * *  *  \\n\")\r\n-            ((1 2 3 10 20 40 100)\r\n-             (concat \"\\nShave                                      *  * *     * *  * !\"\r\n-                     (make-string org-habit-following-days 32)\r\n-                     \"\\n\"))\r\n-            (t (cl-assert nil nil \"Missing case!\")))\r\n-          (progn\r\n-            (org-agenda nil \"f\")\r\n-            (buffer-string))))))))\r\n+  (org-test-with-timezone \"UTC0\" ;; Avoid DST.  See `test-org-habit\/dst'.\r\n+    (org-test-at-time \"2009-10-17\"\r\n+      (org-test-habit\r\n+       (dolist (org-habit-following-days '(0 1 2 3 10 20 40 100))\r\n+         (should\r\n+          (string-equal\r\n+           (cl-case org-habit-following-days\r\n+             (0   \"    *  * *     * *  *  \\n\")\r\n+             ((1 2 3 10 20 40 100)\r\n+              (concat \"    *  * *     * *  * !\"\r\n+                      (make-string org-habit-following-days 32)\r\n+                      \"\\n\"))\r\n+             (t (cl-assert nil nil \"Missing case!\")))\r\n+           (progn\r\n+             (org-agenda nil \"f\")\r\n+             (buffer-substring (+ 1 org-habit-graph-column) (point-max))))))))))\r\n \r\n (ert-deftest test-org-habit\/show-habits ()\r\n   \"Test displaying habits in the agenda at various points in time.\r\n Also test modifying the variables `org-habit-show-habits',\r\n `org-habit-show-habits-only-for-today', and `org-habit-show-all-today'.\"\r\n   (org-test-habit\r\n-    (dolist (org-habit-show-habits '(nil t))\r\n-      (dolist (org-habit-show-habits-only-for-today '(nil t))\r\n-        (dolist (org-habit-show-all-today '(nil t))\r\n-          (dolist (test-time '(2009-10-15\r\n-                               2009-10-16\r\n-                               2009-10-17\r\n-                               2009-10-18\r\n-                               2009-10-19\r\n-                               2009-10-20\r\n-                               2009-10-21\r\n-                               2009-10-22))\r\n-            (let ((expected-output-string\r\n-                   (cl-case test-time\r\n+   (dolist (org-habit-show-habits '(nil t))\r\n+     (dolist (org-habit-show-habits-only-for-today '(nil t))\r\n+       (dolist (org-habit-show-all-today '(nil t))\r\n+         (dolist (test-time '(2009-10-15\r\n+                              2009-10-16\r\n+                              2009-10-17\r\n+                              2009-10-18\r\n+                              2009-10-19\r\n+                              2009-10-20\r\n+                              2009-10-21\r\n+                              2009-10-22))\r\n+           (let ((expected-output-string\r\n+                  (cl-case test-time\r\n                     (2009-10-15\r\n-                     \"\\nShave                                    *   *  * *     * *  *       \\n\")\r\n+                     \" *   *  * *     * *  *       \\n\")\r\n                     (2009-10-16\r\n-                     \"\\nShave                                   *   *  * *     * *  *!       \\n\")\r\n+                     \"*   *  * *     * *  *!       \\n\")\r\n                     (2009-10-17\r\n-                     \"\\nShave                                      *  * *     * *  * !       \\n\")\r\n+                     \"   *  * *     * *  * !       \\n\")\r\n                     (2009-10-18\r\n-                     \"\\nShave                                     *  * *     * *  *  !       \\n\")\r\n+                     \"  *  * *     * *  *  !       \\n\")\r\n                     (2009-10-19\r\n-                     \"\\nShave                                    *  * *     * *  *   !       \\n\")\r\n+                     \" *  * *     * *  *   !       \\n\")\r\n                     (2009-10-20\r\n-                     \"\\nShave                                   *  * *     * *  *    !       \\n\")\r\n+                     \"*  * *     * *  *    !       \\n\")\r\n                     (2009-10-21\r\n-                     \"\\nShave                                     * *     * *  *     !       \\n\")\r\n+                     \"  * *     * *  *     !       \\n\")\r\n                     (2009-10-22\r\n-                     \"\\nShave                                    * *     * *  *      !       \\n\")\r\n+                     \" * *     * *  *      !       \\n\")\r\n                     (t (cl-assert nil t \"Missing case for: %S!\" (symbol-name test-time))))))\r\n-              (org-test-at-time (symbol-name test-time)\r\n-                (should\r\n-                 (string-equal\r\n-                  (if org-habit-show-habits\r\n-                      (cl-case test-time\r\n+             (org-test-at-time (symbol-name test-time)\r\n+               (should\r\n+                (string-equal\r\n+                 (if org-habit-show-habits\r\n+                     (cl-case test-time\r\n                        ((2009-10-15 2009-10-16)\r\n                         (if org-habit-show-all-today\r\n                             expected-output-string\r\n@@ -234,10 +292,13 @@ test-org-habit\/show-habits\r\n                        ((2009-10-17 2009-10-18 2009-10-19 2009-10-20 2009-10-21 2009-10-22)\r\n                         expected-output-string)\r\n                        (t (cl-assert nil t \"Missing case for: %S!\" (symbol-name test-time))))\r\n-                    \"\")\r\n-                  (progn\r\n-                    (org-agenda nil \"f\")\r\n-                    (buffer-string))))))))))))\r\n+                   \"\")\r\n+                 (progn\r\n+                   (org-agenda nil \"f\")\r\n+                   (let ((result (buffer-string)))\r\n+                     (if (string-empty-p result)\r\n+                         result\r\n+                       (substring result (+ 1 org-habit-graph-column)))))))))))))))\r\n \r\n (ert-deftest test-org-habit\/toggle-display-in-agenda ()\r\n   \"Test the agenda view for a habit.\"\r\n-- \r\n2.51.0\r\n\r\n","subject":"Re: [PATCH] Add test suite for org habit"},{"date":"2025-10-18T14:41:22.523Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ms5ol1hb.fsf@localhost","message-id":"87ms5ol1hb.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","references":["m2zfc5n8v7.fsf@adamkovic.org"],"related-refs":["87ms5ol1hb.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87ms5ol1hb.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 0b29108f13e58609c6f612b188de24066dc8aaf4 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <0b29108f13e58609c6f612b188de24066dc8aaf4.1760798244.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Sat, 18 Oct 2025 16:33:55 +0200\r\nSubject: [PATCH] org-do-latex-and-related: Do not fontify trailing whitespace\r\nMIME-Version: 1.0\r\nContent-Type: text\/plain; charset=UTF-8\r\nContent-Transfer-Encoding: 8bit\r\n\r\n* lisp\/org.el (org-do-latex-and-related): Avoid fontifying trailing\r\nwhitespace after latex fragments and entities.\r\n\r\nReported-by: Rudolf Adamkovi\u010d <rudolf@adamkovic.org>\r\nLink: https:\/\/orgmode.org\/list\/m2zfc5n8v7.fsf@adamkovic.org\r\n---\r\n lisp\/org.el | 5 ++++-\r\n 1 file changed, 4 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex 95fd46b4a..17ec51fa4 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -5912,7 +5912,10 @@ (defun org-do-latex-and-related (limit)\r\n \t\t\t       1\r\n \t\t\t     0))\r\n \t\t   (start (+ offset (match-beginning 0)))\r\n-\t\t   (end (match-end 0)))\r\n+\t\t   (end (save-excursion\r\n+                          (goto-char (match-end 0))\r\n+                          ;; Do not fontify trailing whitespace.\r\n+                          (skip-chars-backward \" \\t\") (point))))\r\n \t      (if (memq 'native org-highlight-latex-and-related)\r\n \t\t  (org-src-font-lock-fontify-block \"latex\" start end)\r\n \t\t(font-lock-prepend-text-property start end\r\n-- \r\n2.50.1\r\n\r\n","subject":"Re: Fix off-by-one fontification of entities and inline LaTeX fragments"},{"date":"2025-10-12T21:13:13.655Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87qzvtuo0m.fsf@dod.no","message-id":"87qzvtuo0m.fsf@dod.no","config":false,"refs-count":4,"username":"Steinar Bang","related-refs":["87qzvtuo0m.fsf@dod.no"],"from":"sb@dod.no","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Get error when pressing TAB to toggle show child: (error \"Tab width in Org files must be 8, not 4. Please adjust your \u2018tab-width\u2019 settings for Org mode\") [9.7.11 (release_9.7.11 @ \/usr\/share\/emacs\/30.1\/lisp\/org\/)]"},{"date":"2025-10-11T17:42:06.957Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/f137a13a-8c9d-4a52-a6fb-6ac92b69f7f5@andros.dev","message-id":"f137a13a-8c9d-4a52-a6fb-6ac92b69f7f5@andros.dev","config":false,"refs-count":2,"username":"Andros Fenollosa","related-refs":["f137a13a-8c9d-4a52-a6fb-6ac92b69f7f5@andros.dev"],"from":"hi@andros.dev","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Consider Org-social for community news feeds"},{"date":"2025-10-05T18:25:29.893Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87h5wdp5ua.fsf@localhost","message-id":"87h5wdp5ua.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87tt2ccp9s.fsf@localhost"],"related-refs":["87h5wdp5ua.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nHere are the long overdue meetup notes from the meetup before previous.\r\n(Finally getting back to more stable schedules)\r\n\r\nTL;DR: xclip-mode + org-refile bug; org-transclusion bug; org-include-inline;\r\ntranscluding code files into Org; MCP tool experiments; various ways\r\nto auto-list backlinks; filetags - predecessor idea for denote; including\r\nlogbook records in agenda; repeated timestamps - scheduling a single event\r\nto other day; org-class; links inside links and image previews;\r\norg-capture'ing URLs\r\n\r\n- As usual, we started from the latest Emacs news\r\n  https:\/\/sachachua.com\/blog\/2025\/08\/2025-08-11-emacs-news\/\r\n- Jacob S. Gordon shared (and showcased) a bug where org-refile does not interact well\r\n  with xclip-mode (https:\/\/elpa.gnu.org\/packages\/xclip.html)\r\n  - xclip-mode fiddles with the kill ring and org-refile internally uses\r\n    the kill ring to carry around the refiled subtree (do not ask me\r\n    why, although it is exactly what karthink did), leading to problems\r\n  - I believe that the bug should be now fixed in\r\n    https:\/\/cgit.git.savannah.gnu.org\/cgit\/emacs\/org-mode.git\/commit\/?id=f974e85c07e80615bd35d58d3ba564b9a8ff0df9\r\n\r\n- Nick Anderson reported an issue with org-transclusion\r\n  - when org-indent-mode is active, the indentation is sometimes\r\n    broken in the transcluded text\r\n  - we tried to find the cause interactively, without much success (as\r\n    I remember by now - I am writing this two months after the meetup)\r\n- org-transclusion is a pretty complex package, with many features\r\n  - There is also https:\/\/github.com\/yibie\/org-include-inline\r\n    if one needs something simpler and more reliable\r\n- Morgan asked about including non-Org text into Org files using org-transclusion\r\n  - It should be possible with\r\n    https:\/\/nobiot.github.io\/org-transclusion\/#Transclude-source-file-into-src_002dblock\r\n\r\n- We then moved to a bit of a tangent - MCP tools\r\n  - I had some experiments in my scratch buffer and someone noticed :)\r\n  - MCP tools are for LLMs. In my case, it was playing around\r\n    mcp-hub + gptel\r\n    #+begin_src emacs-lisp\r\n      (use-package mcp\r\n        :straight t\r\n        :after gptel\r\n        :custom (mcp-hub-servers\r\n                 `(;; (\"filesystem\" . (:command \"npx\" :args (\"-y\" \"@modelcontextprotocol\/server-filesystem\" \"\/home\/lizqwer\/MyProject\/\")))\r\n                   ;; (\"fetch\" . (:command \"uvx\" :args (\"mcp-server-fetch\")))\r\n                   (\"anki-mcp-server\" . (:command \"node\" :args (\"\/home\/yantar92\/Dist\/anki-mcp-server\/build\/index.js\")))\r\n                   ;; (\"qdrant\" . (:url \"http:\/\/localhost:8000\/sse\"))\r\n                   ;; (\"browser-use-mcp-server\" . (:url \"http:\/\/localhost:8000\/sse\"))\r\n                   ;; (\"server-puppeterr\" . (:command \"npx\" :args (\"-y\" \"@modelcontextprotocol\/server-puppeteer\")))\r\n                   ;; (\"octagon\" . (:command \"npx\" :args (\"-y\" \"octagon-deep-research-mcp@latest\")))\r\n                   ;; (\"google-docs-mcp\" . (:command \"node\" :args (\"\/home\/yantar92\/test\/mcp-googledocs-server\/dist\/server.js\")))\r\n                   ;; (\"jupyter\" . (:command \"docker\" :args (\"run\" \"-i\" \"--rm\" \"--network=host\" \"-e\" \"ROOM_URL=http:\/\/localhost:8888\" \"-e\" \"ROOM_TOKEN=MY_TOKEN\" \"-e\" \"ROOM_ID=notebook.ipynb\" \"-e\" \"RUNTIME_URL=http:\/\/localhost:8888\" \"-e\" \"RUNTIME_TOKEN=MY_TOKEN\" \"datalayer\/jupyter-mcp-server:latest\")))\r\n                   ;; (\"graphlit\" . (\r\n                   ;;                :command \"npx\"\r\n                   ;;                :args (\"-y\" \"graphlit-mcp-server\")\r\n                   ;;                :env (\r\n                   ;;                      :GRAPHLIT_ORGANIZATION_ID \"your-organization-id\"\r\n                   ;;                      :GRAPHLIT_ENVIRONMENT_ID \"your-environment-id\"\r\n                   ;;                      :GRAPHLIT_JWT_SECRET \"your-jwt-secret\")))\r\n      \t     ))\r\n        :config (require 'mcp-hub)\r\n        :hook (after-init . mcp-hub-start-all-server))\r\n      (setq mcp-server-start-time 12000)\r\n      (require 'gptel-integrations)\r\n    #+end_src\r\n  - I tried multiple things with mixed success\r\n  - The latest one was connector to Anki, which did not work very well\r\n  - The tools I tried with some success (but no real use at the end)\r\n    https:\/\/github.com\/co-browser\/browser-use-mcp-server\r\n    https:\/\/github.com\/a-bonus\/google-docs-mcp\r\n    https:\/\/github.com\/datalayer\/jupyter-mcp-server\r\n  - Nick Anderson recommended https:\/\/github.com\/choplin\/jira-cli-mcp\r\n\r\n- Going back on topic, we talked about https:\/\/github.com\/meedstrom\/org-node\r\n  and linking between Org entries\r\n  - Nikita first asked about org-node specifically, but we quickly moved\r\n    to more general discussion about different ways to connect between\r\n    headings\r\n  - There is, of course, classic linking with links (especially\r\n    file-independent id: links), but the idea to create links\r\n    automatically (e.g. backlinks) is fairly popular\r\n  - There is, of course, well-known org-roam, with its backlinks\r\n    - someone raised the issue that org-roam is not actively maintained\r\n    - AFAIK, it is maintained (not by original author, but by\r\n      enthusiasts with write accesss to the repo) and is fairly stable\r\n      as for now\r\n  - Some packages implement similar functionality but without using\r\n    databases as in org-roam\r\n    - One recent example is https:\/\/github.com\/meedstrom\/org-mem\r\n      (previously called indexed)\r\n    - Another example is https:\/\/github.com\/toshism\/org-super-links, which is\r\n      closer to vanilla linking\r\n    - Nick Anderson also mentioned https:\/\/thanosapollo.org\/posts\/org-gnosis-01\/\r\n  - Nikita then clarified that he is specifically looking for an\r\n    agenda-like list of \"related\" headings from different files\r\n    - There are different ways how such list can be obtained\r\n      - https:\/\/github.com\/protesilaos\/denote has somewhat similar\r\n        functionality via dynamic blocks\r\n      - there is also less known and fragile filetag support in Org (org-ctag)\r\n      - so, the most relevant is probably org-roam's backlink buffer\r\n- we also talked a bit more about denote design with notes stored in individual files\r\n  and file names containing keywords used for searching and ids used for linking\r\n  - this denote's idea with file names is repeating an earlier idea\r\n    from https:\/\/github.com\/novoid\/filetags\r\n- karthink asked about displaying :LOGBOOK: drawer in org-agenda-entry-text-mode\r\n  - I looked into org-agenda.el, and filtering out the drawer is hard-coded there\r\n  - An alternative could be https:\/\/github.com\/alphapapa\/org-quick-peek, where\r\n    filtering can be customized\r\n- Morgan shared his problem with regular meetings that are occasionally rescheduled\r\n  - such meeting can normally be marked with =<2025-10-06 Mon +1w>=, but\r\n    when moved, say to Tuesday once (and back to Mondays next weeks), one cannot simply\r\n    change the timestamp to =<2025-10-07 Tue +1w>=\r\n  - I suggested adding an extra timestamp:\r\n    =<2025-10-06 Mon +1w>= (regular weekly), =<2025-10-07 Tue>= (one off)\r\n    - Unfortunately, there is no way (other than constructing\r\n      diary-style timestamp with direct Elisp) to exclude a single day from\r\n      timestamp with repeater. Maybe it is a feature that should be\r\n      added one day\r\n  - Another common suggestion that many people like is using\r\n    org-clone-subtree-with-timeshift\r\n  - We also have some special case for weekly timestamps excluding\r\n    certain weeks - org-class. It is to be used in diary-style\r\n    timestamps as =<%(org-class ...)>= (see the docstring).\r\n    - This has been a part of Org mode since forever, although not\r\n      mentioned in the manual\r\n  - kikingvegas also chimed in describing some Mac's (if I recall correctly)\r\n    feature to create repeated tasks not using special syntax, but simply by\r\n    human-readable description: \"Org diary timestamp for every second\r\n    Wednesday of a month\"\r\n    - This is indeed possible. Either using a set of regexp rules to match or\r\n      LLMs (well, I mentioned LLMs first, because it is that hummer\r\n      that makes everything looking like nails nowadays).\r\n\r\n- karthink asked about recent discussion about the new customizeable\r\n  link preview system. We had a bug report about previewing\r\n  links inside links like =[[https:\/\/orgmode.org][file:.\/img.png]]=\r\n  (aka clickable icon).\r\n  - the tricky part about such example is that Org markup does not allow links\r\n    inside link descriptions. Kind of. More specifically, the parser does not\r\n    allow links inside description, but other parts of Org mode, in fact, do\r\n    allow them as a special case. That special case was missed in the new preview\r\n    system implementation.\r\n  - Another part of that bug report was referring to\r\n    https:\/\/blog.tecosaur.com\/tmio\/2021-04-26-Welcome.html#inline-display-remote\r\n    that claims that links like\r\n    =[[https:\/\/github.com\/larsmagne\/meme\/raw\/master\/images\/Grandma-Finds-The-Internet.jpg]]=\r\n    can also be previewed\r\n    - The truth is that they cannot - org-display-remote-inline-images option only\r\n      works for TRAMP links. I myself keep getting confused about this, and \r\n      even claimed that such feature existed in the email thread.\r\n      - (maybe it should indeed exist)\r\n- karthink asked me about using org-capture to record links\/bookmarks\r\n  - some people configure capture templates to put link in title, or\r\n    property drawer, or inside body\r\n  - I myself use a sophisticated method, storing the link and other\r\n    metadata in properties drawer in a way compatible with\r\n    org-bibtex. I even have a very elaborate html parser package that captures\r\n    links, downloads html\/media, parses the html, and extracts author\/title\/etc\r\n    - https:\/\/github.com\/yantar92\/org-capture-ref\r\n  - Note that =C-c C-o= on heading in Org mode will offer a choice of all the links\r\n    in title, properties drawer, and also body to open. This is an easy way to follow\r\n    the link stored inside heading\r\n  - Similar to what happens with links inside link description, Org parser\r\n    does not recognize links inside property drawer. It is yet another special case\r\n    in Org mode code. Parsing links inside property drawer also has drawbacks though.\r\n\r\n:comments:\r\n[17:55] yantar92 is now the presenter\r\n[17:59] [yantar92 : MODERATOR]: The latest Emacs news: https:\/\/sachachua.com\/blog\/2025\/08\/2025-08-11-emacs-news\/\r\n[17:59] [yantar92 : MODERATOR]: Official start in a few minutes\r\n[18:00] [yantar92 : MODERATOR]: Editable notes (including after the meetup): https:\/\/pad.emacsconf.org\/orgmeetup\r\n[18:03] [Jacob S. Gordon : VIEWER]: am I audible?\r\n[18:03] [Jacob S. Gordon : VIEWER]: guess not, let me rejoin\r\n[18:04] Jacob S. Gordon is now the presenter, set by yantar92\r\n[18:25] [karthink : VIEWER]: Why does org-refile touch the kill-ring at all?\r\n[18:29] [yantar92 : MODERATOR]: https:\/\/0x0.st\/8CxO.patch\r\n[18:32] yantar92 is now the presenter, set by yantar92\r\n[18:39] [Nick Anderson : VIEWER]: I use org-transclusion pretty frequently and often using the detach option to create a  copy in whatever buffer i pulled the content in.\r\n[18:40] [Nick Anderson : VIEWER]: Sometimes there is some jank, yes.\r\n[18:40] [yantar92 : MODERATOR]: https:\/\/nobiot.github.io\/org-transclusion\/#Detach-transclusion-and-copy-source-buffer\r\n[18:40] [Nick Anderson : VIEWER]: I might have modifified my workflow to make things wqork for me \r\n[18:41] [yantar92 : MODERATOR]: https:\/\/github.com\/yibie\/org-include-inline\r\n[18:41] [Nick Anderson : VIEWER]: it does weird stuff with the source buffer during a transclusion. Breaks indention or something.\r\n[18:41] [Nick Anderson : VIEWER]: thanks for that, will check it out.\r\n[18:43] [Nick Anderson : VIEWER]: How do i share screen:?\r\n[18:44] [Nick Anderson : VIEWER]: May i \ud83d\ude01\r\n[18:44] Nick Anderson is now the presenter, set by yantar92\r\n[18:47] [Morgan : VIEWER]: If I wanted to include read only patch files in an org buffer would transclusion be good for that?\r\n[18:48] [Nick Anderson : VIEWER]: Maybe, depending what you want to include for\r\n[18:48] yantar92 is now the presenter, set by yantar92\r\n[18:48] [Nick Anderson : VIEWER]: for exporting to a doc and sending to someone else?\r\n[18:48] [Morgan : VIEWER]: just for local preview in the org buffer\r\n[18:49] [Nick Anderson : VIEWER]: nore sure if it can transclude non-org thouhg\r\n[18:49] [Nick Anderson : VIEWER]: probably can, it can use file soource \r\n[18:49] [Morgan : VIEWER]: I guess I'm going for something like the latex inline preview but for plain text files\r\n[18:50] [Nick Anderson : VIEWER]: You can, i just tried\r\n[18:50] [Nick Anderson : VIEWER]: you just need to have a file path i think\r\n[18:50] [Nick Anderson : VIEWER]: #+transclude: [[file:\/tmp\/blah.txt][HI]]\r\n\r\n[18:50] [Morgan : VIEWER]: oh that's exactly what I want.  Thank you very much \ud83d\ude0a.  I will look into this\r\n[18:52] [Nick Anderson : VIEWER]: thanks\r\n[18:54] [Nick Anderson : VIEWER]: I saw you were playing with some anki mcp toools\r\n[18:54] [Nick Anderson : VIEWER]: what other mcp tools are you using\r\n[18:55] [Nikita : VIEWER]: Anyone using org-node? I use it to have a links to connected org entries. Wanted to hear opinions regarding it.\r\n[18:55] [Nick Anderson : VIEWER]: google docs mcp ihavent seen that one\r\n[18:56] [Nick Anderson : VIEWER]: I have had good success with jira-cli-mcp in recent past.\r\n[18:56] [Nick Anderson : VIEWER]: sorry\r\n[18:56] [karthink : VIEWER]: In case there is no topic of discussion, I have a question about org-agenda-entry-text-mode: \r\n\r\nBy default it omits the :LOG: drawer of an entry.  i record updates to the status of a task  in the :LOG: drawer -- is there some way to show that instead of the entry content?\r\n[18:57] [yantar92 : MODERATOR]: https:\/\/github.com\/co-browser\/browser-use-mcp-server\r\n[18:57] [yantar92 : MODERATOR]: https:\/\/github.com\/a-bonus\/google-docs-mcp\r\n[18:57] [yantar92 : MODERATOR]: https:\/\/github.com\/datalayer\/jupyter-mcp-server\r\n[18:58] [yantar92 : MODERATOR]: https:\/\/github.com\/meedstrom\/org-node\r\n[18:59] [Nick Anderson : VIEWER]: yep\r\n[18:59] [Nikita : VIEWER]: It is. It helps to connect org entries with each other.\r\n[18:59] [Nick Anderson : VIEWER]: It's like org-roam, but no sqlite\r\n[18:59] [Nick Anderson : VIEWER]: Renamed maybe?\r\n[19:00] [Nick Anderson : VIEWER]: no that was another of his\r\n[19:00] [Nick Anderson : VIEWER]: indexed or something\r\n[19:01] [Nick Anderson : VIEWER]: Yeah, org-mem was originally called indexed.\r\n[19:02] [Nick Anderson : VIEWER]: https:\/\/github.com\/meedstrom\/indexed\r\n[19:02] [Nikita : VIEWER]: May be there is a better way to connect org entries with each other?\r\n[19:02] [Nick Anderson : VIEWER]: Nikita I use id links almost exclusively what do you mean by interconnecting?\r\n[19:03] [Nikita : VIEWER]: I want it to be backlinked and also I want to have agenda that shows all connected chain of org entries. That what I am looking for.\r\n[19:03] [Nick Anderson : VIEWER]: org-superlinks, \r\n[19:04] [Nick Anderson : VIEWER]: and org-roam, or org-node, or i think org-gnosis there are a handfull\r\n[19:04] [yantar92 : MODERATOR]: https:\/\/github.com\/toshism\/org-super-links\r\n[19:04] [Nick Anderson : VIEWER]: https:\/\/thanosapollo.org\/posts\/org-gnosis-01\/\r\n[19:06] [Nick Anderson : VIEWER]: It's another org-roam alike I htink\r\n[19:07] [Nikita : VIEWER]: What will work best if I want to construct an agenda view to see all connected org entries from different files?\r\n[19:07] [Nikita : VIEWER]: With links and backlinks\r\n[19:08] [Nikita : VIEWER]: Right!\r\n[19:09] [Nikita : VIEWER]: Okay, thank you for answering.\r\n[19:11] [Nikita : VIEWER]: Will try in my spare time. Thank you!\r\n[19:12] [sam : VIEWER]: org-roam is no longer maintained ?\r\n[19:14] [sam : VIEWER]: I read somewhere, but I dont rememeber where\r\n[19:14] [sam : VIEWER]: the author dropped its maintaince\r\n[19:16] [sam : VIEWER]: I think prot denote is a very good alternative\r\n[19:16] [sam : VIEWER]: not really ?\r\n[19:17] [sam : VIEWER]: I yes\r\n[19:17] [sam : VIEWER]: but for someone who does not have a problem with that\r\n[19:17] [sam : VIEWER]: it is a good alternative\r\n[19:18] [sam : VIEWER]: you can link to any file, not only org\r\n[19:18] [sam : VIEWER]: image, photo ,pdf\r\n[19:19] [yantar92 : MODERATOR]: https:\/\/github.com\/protesilaos\/denote\r\n[19:19] [sam : VIEWER]: using the same links\r\n[19:19] [sam : VIEWER]: note file:\r\n[19:19] [sam : VIEWER]: id: or file:\r\n[19:19] [sam : VIEWER]: but denote their is only denote: links\r\n[19:20] [yantar92 : MODERATOR]: https:\/\/github.com\/novoid\/filetags\r\n[19:21] [sam : VIEWER]: I mean it is a good alternative to org-roam\r\n[19:22] [sam : VIEWER]: specialy from maintaince point of view also\r\n[19:22] [sam : VIEWER]: ande denote has no DB\r\n[19:22] [sam : VIEWER]: yep\r\n[19:22] [sam : VIEWER]: depends on the user taste\r\n[19:23] [sam : VIEWER]: yep\r\n[19:27] [karthink : VIEWER]: Yeah, I figured I would have to advise org-agenda-get-some-entry-text.  Alternatively I can make org-add-note not use the :LOG: drawer\r\n[19:27] [karthink : VIEWER]: For which there is a customization\r\n[19:28] [karthink : VIEWER]: Ah, org-quick-peek is like org-agenda-follow-mode\r\n[19:29] [karthink : VIEWER]: With org-agenda-follow-indirect set to t\r\n[19:31] [karthink : VIEWER]: No updates from me\r\n[19:34] [Morgan : VIEWER]: that is an issue I have actually with the anchor thingy.  I have a usually monday meeting that occasionally get pushed to tuesday or wednesday.  but if i change the timestamp to tuesday and keep the same +7 then all hell breaks lose\r\n[19:34] [Jacob S. Gordon : VIEWER]: In those cases I just don't reschedule\r\n[19:35] [Morgan : VIEWER]: oh that's smart.  why didn't I think of that\r\n[19:35] [Morgan : VIEWER]: thank you \ud83d\ude0a multi timestamp is the solution\r\n[19:36] [kickingvegas : VIEWER]: fwiw, there's org-clone-subtree-with-timeshift which IMHO works better than repeating timestamps\r\n[19:36] [kickingvegas : VIEWER]: for many use cases\r\n[19:38] [karthink : VIEWER]: I had a question about previewing http links to images\r\n[19:39] [karthink : VIEWER]: As discussed here: https:\/\/list.orgmode.org\/87h5yjymth.fsf@localhost\r\n[19:40] [karthink : VIEWER]: Did Org ever preview images at http urls with org-toggle-inline-images?\r\n[19:41] [Morgan : VIEWER]: a slightly related other issue I have with scheduling: what if I know of an irregularity far in advanced.  like my monday meeting is on tuesday due to a holiday\r\n\r\nlike this:\r\n,* meeting\r\n<2025-10-27 Mon ++7d>\r\n<2025-08-26 Tue>\r\n\r\n\r\nThis will still show the meeting on the monday that it's not happening.  For one meeting it's just\r\nannoying but if it's like 6 school classes then it could get garbled real fast\r\n[19:43] [Morgan : VIEWER]: is that a recent addition?  I don't remember that from when I was in school\r\n[19:45] [karthink : VIEWER]: Also had a question about capturing links.  There are a few different ways to do it, depending on the associated data: link in the heading, as a LINK property, in the body of the entry.  What is your preferred method?\r\n[19:53] [kickingvegas : VIEWER]: gotta run - thanks! \r\n[20:19] [karthink : VIEWER]: Have to leave now, thanks for the meetup Ihor\r\n[20:19] [zaimon : VIEWER]: Thanks everyone\r\n[20:19] [Jacob S. Gordon : VIEWER]: Thanks for the help Ihor!\r\n[20:19] [cryptk : VIEWER]: thanks\r\n[20:19] [Morgan : VIEWER]: Thanks \ud83d\ude0a\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[BLOG] #21 [[bbb:OrgMeetup]] on Wed, August 13, 19:00 UTC+3"},{"date":"2025-10-02T08:13:11.626Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cy753ey5.fsf@palard.fr","message-id":"87cy753ey5.fsf@palard.fr","config":false,"refs-count":7,"username":"Julien Palard","related-refs":["87cy753ey5.fsf@palard.fr"],"from":"julien@palard.fr","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org parser error: Invalid search bound [9.7.34 (9.7.34-8b15a0 @ \/home\/mdk\/.emacs.d\/elpa\/org-9.7.34\/)]"},{"date":"2025-10-01T16:37:08.646Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/421532F2-5B58-4529-894D-D4E8E9FE064D@armyofclerks.net","message-id":"421532F2-5B58-4529-894D-D4E8E9FE064D@armyofclerks.net","config":false,"refs-count":4,"username":"Pablo Miranda Carranza","related-refs":["421532F2-5B58-4529-894D-D4E8E9FE064D@armyofclerks.net"],"from":"pablo@armyofclerks.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Crashes with fill-column set to 0 [9.7.34 (9.7.34-8b15a0 @ \/Users\/pablo\/.emacs.d\/elpa\/org-9.7.34\/)]"},{"date":"2025-09-27T15:14:04.983Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87frc853vm.fsf@stebalien.com","message-id":"87frc853vm.fsf@stebalien.com","config":false,"refs-count":2,"username":"Steven Allen","references":["87ms7v6qur.fsf@stebalien.com","87qzvve90e.fsf@stebalien.com","m2ikh651up.fsf@adamkovic.org","m28qjdkzmn.fsf@adamkovic.org","87cy7ip2zj.fsf@stebalien.com","87zfbsbqvj.fsf@stebalien.com","87seg8xfe5.fsf@localhost","m24it0p6pf.fsf@adamkovic.org","m2o6recui4.fsf@adamkovic.org","874it0sjmj.fsf@stebalien.com","m2348lv0a6.fsf@adamkovic.org","874isswxwx.fsf@stebalien.com","m2segc29lk.fsf@adamkovic.org","m21pnxh5l1.fsf@adamkovic.org","874istov8z.fsf@stebalien.com","87h5xshhll.fsf@stebalien.com","87y0qe2q7q.fsf@stebalien.com","m24isugsng.fsf@adamkovic.org","m2bjmzriet.fsf@adamkovic.org","874isz427d.fsf@stebalien.com","m25xehky9p.fsf@adamkovic.org"],"related-refs":["874it0sjmj.fsf@stebalien.com","87frc853vm.fsf@stebalien.com"],"from":"steven@stebalien.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87frc853vm.fsf@stebalien.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From d874fab5afa1da597931c853cd77bcc58b56ac66 Mon Sep 17 00:00:00 2001\r\nFrom: Steven Allen <steven@stebalien.com>\r\nDate: Sat, 27 Sep 2025 08:02:30 -0700\r\nSubject: [PATCH] ; org-refile: Fix incorrect refile target test\r\n\r\n* testing\/lisp\/test-org.el (test-org\/refile-get-targets): Make the\r\ntarget specification a proper alist.\r\n---\r\n testing\/lisp\/test-org.el | 2 +-\r\n 1 file changed, 1 insertion(+), 1 deletion(-)\r\n\r\ndiff --git a\/testing\/lisp\/test-org.el b\/testing\/lisp\/test-org.el\r\nindex aa217272b..0dc7cb1a2 100644\r\n--- a\/testing\/lisp\/test-org.el\r\n+++ b\/testing\/lisp\/test-org.el\r\n@@ -7798,7 +7798,7 @@ defmacro org-test-without-dow\r\n    (equal '(\"H1\" \"H2\" \"H3\")\r\n \t  (org-test-with-temp-text \"* H1\\n** H2\\n*** H3\"\r\n \t    (let ((org-refile-use-outline-path nil)\r\n-\t\t  (org-refile-targets `((nil t))))\r\n+\t\t  (org-refile-targets `((nil . t))))\r\n \t      (mapcar #'car (org-refile-get-targets)))))))\r\n \r\n (ert-deftest test-org\/refile ()\r\n-- \r\n2.51.0\r\n\r\n","subject":"Re: Completion when inserting ID links"},{"date":"2025-09-23T16:12:11.193Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/86F13A58-2104-422A-BDD7-62E7091CEBC4@outlook.com","message-id":"86F13A58-2104-422A-BDD7-62E7091CEBC4@outlook.com","config":false,"refs-count":4,"username":"Tsui Shaq","related-refs":["86F13A58-2104-422A-BDD7-62E7091CEBC4@outlook.com"],"from":"shaqtsui@outlook.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] incorrect link generated when org src block tangled with :comments link [9.7.11 (release_9.7.11 @ \/Applications\/Emacs.app\/Contents\/Resources\/lisp\/org\/)]"},{"date":"2025-09-19T01:09:45.133Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/877bxv45df.fsf@stebalien.com","message-id":"877bxv45df.fsf@stebalien.com","config":false,"refs-count":4,"username":"Steven Allen","references":["871po4sitl.fsf@stebalien.com","m2tt10npl3.fsf@adamkovic.org"],"related-refs":["877bxv45df.fsf@stebalien.com"],"from":"steven@stebalien.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/877bxv45df.fsf@stebalien.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 61c146032baa86953efa68abda39e0b80d76778e Mon Sep 17 00:00:00 2001\r\nFrom: Steven Allen <steven@stebalien.com>\r\nDate: Wed, 17 Sep 2025 17:13:51 -0700\r\nSubject: [PATCH] ; Fix grammar and improve ol-info documentation\r\n\r\n* lisp\/ol-info.el:\r\n(org-info--link-file-node):\r\n(org-info-description-as-command):\r\n(org-info-other-documents):\r\n(org-info-map-html-url):\r\n(org-info--expand-node-name):\r\n(org-info-export): Fix grammar, capitalize \"Info\", and improve wording\r\nof docstrings.\r\n---\r\n lisp\/ol-info.el | 32 +++++++++++++++++---------------\r\n 1 file changed, 17 insertions(+), 15 deletions(-)\r\n\r\ndiff --git a\/lisp\/ol-info.el b\/lisp\/ol-info.el\r\nindex cd797d551..a835bd403 100644\r\n--- a\/lisp\/ol-info.el\r\n+++ b\/lisp\/ol-info.el\r\n@@ -68,11 +68,12 @@ defun org-info-open\r\n   (org-info-follow-link path))\r\n \r\n (defun org-info--link-file-node (path)\r\n-  \"Extract file name and node from info link PATH.\r\n+  \"Extract the file name and Info node from the Info link PATH.\r\n \r\n-Return cons consisting of file name and node name or \\\"Top\\\" if node\r\n-part is not specified.  Components may be separated by \\\":\\\" or by \\\"#\\\".\r\n-File may be a virtual one, see `Info-virtual-files'.\"\r\n+Return a cons consisting of the file name and node name or \\\"Top\\\" if\r\n+the node part is not specified.  Components may be separated by \\\":\\\"\r\n+or by \\\"#\\\".  The file name may be a virtual one, see\r\n+`Info-virtual-files'.\"\r\n   (if (not path)\r\n       '(\"dir\" . \"Top\")\r\n     (string-match \"\\\\`\\\\([^#:]*\\\\)\\\\(?:[#:]:?\\\\(.*\\\\)\\\\)?\\\\'\" path)\r\n@@ -84,7 +85,7 @@ defun org-info--link-file-node\r\n        (if (org-string-nw-p node) (org-trim node) \"Top\")))))\r\n \r\n (defun org-info-description-as-command (link desc)\r\n-  \"Info link description that can be pasted as command.\r\n+  \"Return an Info link description that can be evaluated as a command.\r\n \r\n For the following LINK\r\n \r\n@@ -99,8 +100,8 @@ defun org-info-description-as-command\r\n in Emacs.\r\n \r\n Calling convention is similar to `org-link-make-description-function'.\r\n-DESC has higher priority and returned when it is not nil or empty string.\r\n-If LINK is not an info link then DESC is returned.\"\r\n+DESC has higher priority and returned when it is both non-nil and\r\n+non-empty.  If LINK is not an Info link, DESC is returned.\"\r\n   (let* ((prefix \"info:\")\r\n          (need-file-node (and (not (org-string-nw-p desc))\r\n                               (string-prefix-p prefix link))))\r\n@@ -144,7 +145,7 @@ defcustom org-info-other-documents\r\n     (\"libc\" . \"https:\/\/www.gnu.org\/software\/libc\/manual\/html_mono\/libc.html\")\r\n     (\"make\" . \"https:\/\/www.gnu.org\/software\/make\/manual\/make.html\"))\r\n   \"Alist of documents generated from Texinfo source.\r\n-When converting info links to HTML, links to any one of these manuals are\r\n+When converting Info links to HTML, links to any one of these manuals are\r\n converted to use these URL.\"\r\n   :group 'org-link\r\n   :type '(alist :key-type string :value-type string)\r\n@@ -152,11 +153,12 @@ defcustom org-info-other-documents\r\n   :safe #'listp)\r\n \r\n (defun org-info-map-html-url (filename)\r\n-  \"Return URL or HTML file associated to Info FILENAME.\r\n-If FILENAME refers to an official GNU document, return a URL pointing to\r\n-the official page for that document, e.g., use \\\"gnu.org\\\" for all Emacs\r\n-related documents.  Otherwise, append \\\".html\\\" extension to FILENAME.\r\n-See `org-info-emacs-documents' and `org-info-other-documents' for details.\"\r\n+  \"Return the URL or HTML file associated with the Info FILENAME.\r\n+If FILENAME refers to an official GNU document, return the URL of the\r\n+official page for that document, e.g., use \\\"gnu.org\\\" for all Emacs\r\n+related documents.  Otherwise, append \\\".html\\\" to the FILENAME.  See\r\n+`org-info-emacs-documents' and `org-info-other-documents' for\r\n+details.\"\r\n   (cond ((cdr (assoc filename org-info-other-documents)))\r\n         ((member filename org-info-emacs-documents)\r\n          (format \"https:\/\/www.gnu.org\/software\/emacs\/manual\/html_mono\/%s.html\"\r\n@@ -164,7 +166,7 @@ defun org-info-map-html-url\r\n         (t (concat filename \".html\"))))\r\n \r\n (defun org-info--expand-node-name (node)\r\n-  \"Expand Info NODE to HTML cross reference.\"\r\n+  \"Expand the Info NODE to an HTML cross reference.\"\r\n   ;; See (info \"(texinfo) HTML Xref Node Name Expansion\") for the\r\n   ;; expansion rule.\r\n   (let ((node (replace-regexp-in-string\r\n@@ -177,7 +179,7 @@ defun org-info--expand-node-name\r\n \t  (t node))))\r\n \r\n (defun org-info-export (path desc format)\r\n-  \"Export an info link.\r\n+  \"Export an Info link.\r\n See `org-link-parameters' for details about PATH, DESC and FORMAT.\"\r\n   (pcase-let ((`(,manual . ,node) (org-info--link-file-node path)))\r\n     (pcase format\r\n-- \r\n2.51.0\r\n\r\n","subject":"Re: [PATCH] ; Fix grammar and improve ol-info documentation"},{"date":"2025-09-18T00:15:58.560Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/874it0sjmj.fsf@stebalien.com","message-id":"874it0sjmj.fsf@stebalien.com","config":false,"refs-count":18,"username":"Steven Allen","references":["87ms7v6qur.fsf@stebalien.com","m28qjdkzmn.fsf@adamkovic.org","87zfbsbqvj.fsf@stebalien.com","m2o6recui4.fsf@adamkovic.org","m2348lv0a6.fsf@adamkovic.org","87h5xshhll.fsf@stebalien.com","87y0qe2q7q.fsf@stebalien.com","m25xehky9p.fsf@adamkovic.org"],"related-refs":["87qzvve90e.fsf@stebalien.com","87cy7ip2zj.fsf@stebalien.com","874it0sjmj.fsf@stebalien.com","874isswxwx.fsf@stebalien.com","87frc853vm.fsf@stebalien.com","874istov8z.fsf@stebalien.com","874isz427d.fsf@stebalien.com"],"from":"steven@stebalien.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/874it0sjmj.fsf@stebalien.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 42fbbd1c669ac6b1caeda47db82198e7291b7f49 Mon Sep 17 00:00:00 2001\r\nFrom: Steven Allen <steven@stebalien.com>\r\nDate: Wed, 27 Aug 2025 09:05:08 -0700\r\nSubject: [PATCH] org-id: implement org-insert-link completion for ID links\r\n\r\n* lisp\/org-id.el (org-id-complete): Add a function to prompt for a\r\nheadline in both the the current buffer and all known files with IDs,\r\nreturning a valid \"id\" link to said headline.\r\n(org-id-description): Add a function to describe an ID link based on its\r\ntarget heading.\r\n(org-link-set-parameters \"id\" ...): Use the aforementioned functions for\r\n`org-insert-link' completion.\r\n* etc\/ORG-NEWS: Document the change.\r\n---\r\n etc\/ORG-NEWS   |  4 ++++\r\n lisp\/org-id.el | 40 +++++++++++++++++++++++++++++++++++++++-\r\n 2 files changed, 43 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 3f17e223e..4e102e2d3 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -717,6 +717,10 @@ additionally set the ~datetime~ attribute with a machine readable\r\n variant of the timestamp. The format used for the attribute can be\r\n customized using ~org-html-datetime-formats~.\r\n \r\n+*** Add completion for ID links\r\n+\r\n+Completion is enabled for ID links inserted with ~org-insert-link~. Completion candidates will be sourced from all files known to contain headlines with IDs.\r\n+\r\n * Version 9.7\r\n \r\n ** Important announcements and breaking changes\r\ndiff --git a\/lisp\/org-id.el b\/lisp\/org-id.el\r\nindex 6ff63b295..1590d7537 100644\r\n--- a\/lisp\/org-id.el\r\n+++ b\/lisp\/org-id.el\r\n@@ -888,9 +888,47 @@ defun org-id-open\r\n                          (org-element-lineage (org-element-at-point) 'headline t))))\r\n     (org-fold-show-context)))\r\n \r\n+(defun org-id-complete (&optional _arg)\r\n+  \"Complete IDs for `org-insert-link'.\r\n+\r\n+If a headline without an ID is selected, one will automatically be\r\n+created.\"\r\n+  (unless org-id-locations (org-id-locations-load))\r\n+  (or (ignore-errors ; Catch the error if we have no refile targets.\r\n+        (when-let* ((id (org-id-get-with-outline-path-completion\r\n+                         `((nil . ,(if (buffer-file-name)\r\n+                                       '(:maxlevel . 10)\r\n+                                     ;; IDs can only be used to link to\r\n+                                     ;; buffers with file names.\r\n+                                     '(:level . 0)))\r\n+                           (org-id-files . (:maxlevel . 10))))))\r\n+          (concat \"id:\" id)))\r\n+      (read-string \"Link: \" \"id:\")))\r\n+\r\n+(defun org-id-description (link desc)\r\n+  \"Return a description for an ID link, derived from the linked headline.\r\n+\r\n+Calling convention is similar to `org-link-make-description-function'.\r\n+DESC has higher priority and is returned if it is both non-nil and\r\n+non-empty.  Otherwise, if the passed LINK is an ID link and can be\r\n+resolved to an existing headline, the target headline is returned.  If\r\n+all else fails, DESC is returned as-is.\r\n+\r\n+TODO keywords, tags, and priorities are stripped from the description.\"\r\n+  (or (org-string-nw-p desc)\r\n+      (when-let* ((loc (org-id-find (string-remove-prefix \"id:\" link))))\r\n+        (org-with-file-buffer (car loc)\r\n+          (org-with-wide-buffer\r\n+           (goto-char (cdr loc))\r\n+           (org-link-display-format\r\n+            (org-get-heading t t t t)))))\r\n+      desc))\r\n+\r\n (org-link-set-parameters \"id\"\r\n   :follow #'org-id-open\r\n-  :store #'org-id-store-link-maybe)\r\n+  :store #'org-id-store-link-maybe\r\n+  :complete #'org-id-complete\r\n+  :insert-description #'org-id-description)\r\n \r\n (provide 'org-id)\r\n \r\n-- \r\n2.51.0\r\n\r\n","subject":"Re: Completion when inserting ID links"},{"date":"2025-09-16T20:29:07.704Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/83baca62-ae63-4647-9c38-71c843b0f96b@app.fastmail.com","message-id":"83baca62-ae63-4647-9c38-71c843b0f96b@app.fastmail.com","config":false,"refs-count":3,"username":"Rohit Patnaik","related-refs":["83baca62-ae63-4647-9c38-71c843b0f96b@app.fastmail.com"],"from":"quanticle@quanticle.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow \"independent\" parent plain list checkboxes"},{"date":"2025-09-04T16:03:33.916Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/93e3d8ad-8576-4a65-ac73-1e9f81ee1f03@gmail.com","message-id":"93e3d8ad-8576-4a65-ac73-1e9f81ee1f03@gmail.com","config":false,"refs-count":9,"username":"Max Nikulin","references":["1faa0fa8-c086-45bf-a993-6b4401e0c6ec@gmail.com","87zfbci2hz.fsf@icloud.com","877byeqrg8.fsf@ucl.ac.uk"],"related-refs":["93e3d8ad-8576-4a65-ac73-1e9f81ee1f03@gmail.com"],"from":"manikulin@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/93e3d8ad-8576-4a65-ac73-1e9f81ee1f03@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/lisp\/ox-latex.el b\/lisp\/ox-latex.el\nindex 6442ff20b..dbdbc0f01 100644\n--- a\/lisp\/ox-latex.el\n+++ b\/lisp\/ox-latex.el\n@@ -2428,7 +2428,7 @@ (defun org-latex-headline (headline contents info)\n \t      ;; Maybe end local TOC (see `org-latex-keyword').\n \t      (contents\n \t       (concat\n-\t\tcontents\n+\t\t(or contents \"\\\\leavevmode\")\n \t\t(let ((case-fold-search t)\n \t\t      (section\n \t\t       (let ((first (car (org-element-contents headline))))\n","subject":"Re: [BUG?] Export to Latex with Visibility On"},{"date":"2025-08-31T10:51:57.756Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87iki3epf9.fsf@gmail.com","message-id":"87iki3epf9.fsf@gmail.com","config":false,"refs-count":4,"username":"S\u0142awomir Grochowski","related-refs":["87iki3epf9.fsf@gmail.com"],"from":"slawomir.grochowski@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] displaying the ':narrow' value in clocktable"},{"date":"2025-08-25T20:38:00.051Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ms7n6t47.fsf@daniel-mendler.de","message-id":"87ms7n6t47.fsf@daniel-mendler.de","config":false,"refs-count":9,"username":"Daniel Mendler via General discussions about Org-mode.","related-refs":["87ms7n6t47.fsf@daniel-mendler.de"],"from":"emacs-orgmode@gnu.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-habit-build-graph breaks on recent master with unicode glyphs [9.8-pre (9.8-pre-526a7d)]"},{"date":"2025-08-17T12:19:24.846Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2ikimta5y.fsf@adamkovic.org","message-id":"m2ikimta5y.fsf@adamkovic.org","config":false,"refs-count":7,"username":"Rudolf Adamkovi\u010d","related-refs":["m2ikimta5y.fsf@adamkovic.org","m2jyz0rite.fsf@adamkovic.org"],"from":"rudolf@adamkovic.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/m2ikimta5y.fsf@adamkovic.org","source-id":"emacs-orgmode@gnu.org","patch-body":"From d538dcadc581b0c43e554c8300b9a60b053ce651 Mon Sep 17 00:00:00 2001\r\nFrom: =?UTF-8?q?Rudolf=20Adamkovi=C4=8D?= <rudolf@adamkovic.org>\r\nDate: Sun, 17 Aug 2025 14:12:07 +0200\r\nSubject: [PATCH] Fix eaten escaping backslash in the documentation\r\n\r\n* lisp\/org-keys.el (org-use-speed-commands): Add a missing backslash\r\nto the documentation string of the custom variable.  Also, update\r\n`setq' to `setopt' and re-indent for clarity.\r\n---\r\n lisp\/org-keys.el | 6 ++++--\r\n 1 file changed, 4 insertions(+), 2 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-keys.el b\/lisp\/org-keys.el\r\nindex f5f005727..98645b0be 100644\r\n--- a\/lisp\/org-keys.el\r\n+++ b\/lisp\/org-keys.el\r\n@@ -690,8 +690,10 @@ (defcustom org-use-speed-commands nil\r\n For example, to activate speed commands when the point is on any\r\n star at the beginning of the headline, you can do this:\r\n \r\n-  (setq org-use-speed-commands\r\n-      (lambda () (and (looking-at org-outline-regexp) (looking-back \\\"^\\\\**\\\"))))\"\r\n+  (setopt org-use-speed-commands\r\n+          (lambda ()\r\n+            (and (looking-at org-outline-regexp)\r\n+                 (looking-back \\\"^\\\\\\\\**\\\"))))\"\r\n   :group 'org-structure\r\n   :type '(choice\r\n \t  (const :tag \"Never\" nil)\r\n-- \r\n2.39.5 (Apple Git-154)\r\n\r\n","subject":"Fix eaten escaping backslash in `org-use-speed-commands' docstring"},{"date":"2025-08-16T13:51:20.215Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87frdrs7g6.fsf@2001-14ba-a144-3c0b-b4b4-c628-3137-f65e.rev.dnainternet.fi","message-id":"87frdrs7g6.fsf@2001-14ba-a144-3c0b-b4b4-c628-3137-f65e.rev.dnainternet.fi","config":false,"refs-count":10,"username":"Jarmo Hurri","references":["87ikj353w0.fsf@localhost","878qjr8q30.fsf@localhost","87cy9461gt.fsf@2001-14ba-a15c-2a0b-e3e4-4019-647a-2a11.rev.dnainternet.fi","875xp476pt.fsf@iki.fi","877bzn8ef5.fsf@2001-14ba-a03c-c50b-805f-6216-3bd1-1d05.rev.dnainternet.fi","87h5yoli5s.fsf@localhost","87ectrky4p.fsf@2001-14ba-a021-9b0b-6d5f-f405-6191-1b43.rev.dnainternet.fi","87msiggqjm.fsf@localhost"],"related-refs":["87frdrs7g6.fsf@2001-14ba-a144-3c0b-b4b4-c628-3137-f65e.rev.dnainternet.fi","87frawvbj6.fsf@2001-14ba-a0d6-470b-a488-694-43cb-842c.rev.dnainternet.fi","878qjr8q30.fsf@localhost","87cy9461gt.fsf@2001-14ba-a15c-2a0b-e3e4-4019-647a-2a11.rev.dnainternet.fi"],"from":"jarmo.hurri@iki.fi","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87frdrs7g6.fsf@2001-14ba-a144-3c0b-b4b4-c628-3137-f65e.rev.dnainternet.fi","source-id":"emacs-orgmode@gnu.org","patch-body":"From 2241d9d86233bc13f8989747285d403de52dcfb9 Mon Sep 17 00:00:00 2001\r\nFrom: Jarmo Hurri <jarmo.hurri@iki.fi>\r\nDate: Sat, 16 Aug 2025 14:35:45 +0300\r\nSubject: [PATCH] ob-ditaa.el: ditaa executable, SVG output, and output type\r\n control\r\n\r\n* lisp\/ob-ditaa.el (org-babel-default-header-args:ditaa) Add graphics\r\nto default value of :results.  Add png as default value of header arg\r\n:file-ext.\r\n(org-ditaa-default-exec-mode): Define new customizable variable for\r\ncontrolling ditaa execution via jar or executable.\r\n(org-ditaa-exec): Define new customizable variable for controlling\r\npath to ditaa executable.\r\n(org-ditaa-java-exec): Rename old customizable variable to conform to\r\nditaa variable naming (not containing word babel).  Provide an\r\nobsolete alias for backwards-compatibility.\r\n(org-ditaa--ensure-jar-file): Write a small helper function checking\r\nexistence of jar file.\r\n(org-babel-execute:ditaa): Use standard\r\n`org-babel-graphical-output-file' to determine output file and type.\r\nAdd support for ditaa executable.  Add support for SVG output.\r\nClarify code structure and local variable naming.  Provide\r\nbackwards-compatibility for :eps and :pdf header arguments.\r\n* doc\/org-manual.org (List of contributors): Remove reference to\r\nnon-existing location of ditaa.jar in org contrib, refer to ditaa\r\ngithub page instead.\r\n* etc\/ORG-NEWS: Document new features, new options and renamed\r\nvariable.\r\n\r\nThere was a mismatch between what ob-ditaa expected and what some\r\noperating systems provide.  In particular, ob-ditaa expected a JAR\r\nexecutable via java -jar, while some operating systems provide a shell\r\nscript which executes the JAR in a more complicated manner.  Therefore\r\nsupport for executing ditaa source code blocks directly via an\r\nexecutable was added.\r\n\r\nNewer versions of ditaa can generate SVG output, which was not\r\nsupported by ob-ditaa.  This is now fixed. Output type is deduced\r\nautomatically, and defaults to PNG.  Legacy output-type controlling\r\nheader arguments :eps and :pdf are still there for\r\nbackwards-compatibility, and override output type determination from\r\nfile type.\r\n---\r\n doc\/org-manual.org |   3 +-\r\n etc\/ORG-NEWS       |  23 ++++++\r\n lisp\/ob-ditaa.el   | 179 +++++++++++++++++++++++++++++++--------------\r\n 3 files changed, 151 insertions(+), 54 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 5a4045271..f178b7416 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -23275,7 +23275,8 @@ community and the code.\r\n   literal examples, and remote highlighting for referenced code lines.\r\n \r\n - Stathis Sideris wrote the =ditaa.jar= ASCII to PNG converter that is\r\n-  now packaged into the [[https:\/\/git.sr.ht\/~bzg\/org-contrib][org-contrib]] repository.\r\n+  available as a package in some operating systems or can be\r\n+  downloaded from [[https:\/\/github.com\/stathissideris\/ditaa]].\r\n \r\n - Daniel Sinder came up with the idea of internal archiving by locking\r\n   subtrees.\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 1f7cb2cbc..29070a833 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -239,6 +239,15 @@ appropriate major mode is unavailable.\r\n \r\n When editing Dot source blocks, Org now uses Graphviz Dot mode, if installed.\r\n \r\n+*** =ob-ditaa=: ditaa executable, and SVG output\r\n+\r\n+In order to use a ditaa executable instead of a JAR file, you can set\r\n+=org-ditaa-default-exec-mode= to ='ditaa=.  The location of the\r\n+executable can be configured via =org-ditaa-exec=.\r\n+\r\n+SVG output can now be generated; note, however, that this requires a\r\n+ditaa version of at least 0.11.0.\r\n+\r\n ** New and changed options\r\n \r\n # Changes dealing with changing default values of customizations,\r\n@@ -406,6 +415,13 @@ symbol ~attach~ or a string -- directory name.  Now it can also be a\r\n function, which will be called with no arguments and its return value\r\n will be used as a directory to save the image to.\r\n \r\n+*** =ob-ditaa=: output type control\r\n+\r\n+Output file type is determined as specified in Babel documentation:\r\n+the suffix of =:file= is the primary determinant, and =:file-ext=\r\n+secondary.  Header arguments =:pdf= and =:eps= are supported for\r\n+backwards compatibility.  Default output type is still PNG.\r\n+\r\n ** New functions and changes in function arguments\r\n \r\n # This also includes changes in function behavior from Elisp perspective.\r\n@@ -540,6 +556,13 @@ capture ~:tree-type~ options]], the internal variable\r\n ~org-datetree-base-level~ has been removed, as well as the\r\n undocumented helper function ~org-datetree-insert-line~.\r\n \r\n+*** =ob-ditaa=: new name for variable controlling java\r\n+\r\n+To align with other customizable variable names, which do not contain\r\n+the word =babel=, variable =org-babel-ditaa-java-cmd= has been renamed\r\n+to =org-ditaa-java-exec=.  The old variable =org-babel-ditaa-java-cmd=\r\n+is still available as an obsolete alias.\r\n+\r\n ** Miscellaneous\r\n *** ~org-capture~ target pointing to headline is now handled uniformly for =plain= entry type\r\n \r\ndiff --git a\/lisp\/ob-ditaa.el b\/lisp\/ob-ditaa.el\r\nindex 77eadd6c2..744c50d30 100644\r\n--- a\/lisp\/ob-ditaa.el\r\n+++ b\/lisp\/ob-ditaa.el\r\n@@ -2,7 +2,7 @@\r\n \r\n ;; Copyright (C) 2009-2025 Free Software Foundation, Inc.\r\n \r\n-;; Author: Eric Schulte\r\n+;; Authors: Eric Schulte, Jarmo Hurri\r\n ;; Keywords: literate programming, reproducible research\r\n ;; URL: https:\/\/orgmode.org\r\n \r\n@@ -25,15 +25,52 @@\r\n \r\n ;; Org-Babel support for evaluating ditaa source code.\r\n ;;\r\n-;; This differs from most standard languages in that\r\n+;; Source code blocks of type ditaa have some special features:\r\n ;;\r\n-;; 1) there is no such thing as a \"session\" in ditaa\r\n+;; - there is no such thing as a \"session\"\r\n ;;\r\n-;; 2) we are generally only going to return results of type \"file\"\r\n+;; - :export results is the default\r\n ;;\r\n-;; 3) we are adding the \"file\" and \"cmdline\" header arguments\r\n+;; - only results of type \"file\" are returned\r\n ;;\r\n-;; 4) there are no variables (at least for now)\r\n+;; - there are no variables\r\n+;;\r\n+;; - three different variants of \"ditaa\" exist: a ditaa executable\r\n+;;   (shell script), ditaa.jar Java archive and DitaaEPS.jar Java\r\n+;;   archive; the third one is a fork generating eps output, and is\r\n+;;   also a prerequisite for producing pdf output; ob-ditaa supports\r\n+;;   all three of these; if ditaa.jar or DitaaEPS.jar is used, paths\r\n+;;   to file(s) must be set; the following table summarizes which\r\n+;;   variant is used in which case; column mode refers to\r\n+;;   `org-ditaa-default-exec-mode'\r\n+;;\r\n+;;   | mode           | output   | command                                             |\r\n+;;   |----------------+----------+-----------------------------------------------------|\r\n+;;   | `ditaa'        | png, svg | `org-ditaa-exec'                                    |\r\n+;;   | `jar'          | png, svg | `org-ditaa-java-exec' -jar `org-ditaa-jar-path'     |\r\n+;;   | `ditaa', `jar' | eps      | `org-ditaa-java-exec' -jar `org-ditaa-eps-jar-path' |\r\n+;;   | `ditaa', `jar' | pdf      | `org-ditaa-java-exec' -jar `org-ditaa-eps-jar-path' |\r\n+;;\r\n+;; - standard header argument \"cmdline\" controls command line parameters passed to ditaa\r\n+;; - the following header arguments are added:\r\n+;;   \"java\" : additional parameters passed to java if ditaa run via a jar\r\n+;;\r\n+\r\n+;;; Requirements:\r\n+\r\n+;; at least one of the following:\r\n+;;\r\n+;; ditaa (executable)\r\n+;; - packaged in some distributions\r\n+;; - configurable via `org-ditaa-exec'\r\n+;;\r\n+;; ditaa.jar | when exec mode is `jar'\r\n+;; - `org-ditaa-jar-path' must point to this jar file\r\n+;; - see https:\/\/github.com\/stathissideris\/ditaa\r\n+;;\r\n+;; DitaaEps.jar | when generating eps or pdf output\r\n+;; - `org-ditaa-eps-jar-path' must point to this jar file\r\n+;; - see https:\/\/sourceforge.net\/projects\/ditaa-addons\/files\/DitaaEps\/\r\n \r\n ;;; Code:\r\n \r\n@@ -44,11 +81,36 @@\r\n (require 'org-compat)\r\n \r\n (defvar org-babel-default-header-args:ditaa\r\n-  '((:results . \"file\")\r\n+  '((:results . \"file graphics\")\r\n     (:exports . \"results\")\r\n-    (:java . \"-Dfile.encoding=UTF-8\"))\r\n+    (:file-ext . \"png\"))\r\n   \"Default arguments for evaluating a ditaa source block.\")\r\n \r\n+(defcustom org-ditaa-default-exec-mode 'jar\r\n+  \"Method to use for ditaa diagram generation when generating png or svg output.\r\n+`jar' means to use java together with a JAR.\r\n+The JAR must be set via `org-ditaa-jar-path'.\r\n+\r\n+`ditaa' means to use the ditaa executable.\r\n+The executable can be configured via `org-ditaa-exec'.\"\r\n+\r\n+  :group 'org-babel\r\n+  :package-version '(Org . \"9.8\")\r\n+  :type '(choice (const :tag \"Use java together with a JAR file.\" jar)\r\n+                 (const :tag \"Use ditaa executable.\" ditaa)))\r\n+\r\n+(defcustom org-ditaa-exec \"ditaa\"\r\n+  \"File name of the ditaa executable.\"\r\n+  :group 'org-babel\r\n+  :package-version '(Org . \"9.8\")\r\n+  :type 'string)\r\n+\r\n+(define-obsolete-variable-alias 'org-babel-ditaa-java-cmd 'org-ditaa-java-exec \"9.8\")\r\n+(defcustom org-ditaa-java-exec \"java\"\r\n+  \"Java executable to use when evaluating ditaa blocks using a JAR.\"\r\n+  :group 'org-babel\r\n+  :type 'string)\r\n+\r\n (defcustom org-ditaa-jar-path (expand-file-name\r\n \t\t\t       \"ditaa.jar\"\r\n \t\t\t       (file-name-as-directory\r\n@@ -58,64 +120,75 @@\r\n \t\t\t\t  (expand-file-name\r\n \t\t\t\t   \"..\/contrib\"\r\n \t\t\t\t   (file-name-directory (org-find-library-dir \"org\")))))))\r\n-  \"Path to the ditaa jar executable.\"\r\n-  :group 'org-babel\r\n-  :type 'string)\r\n-\r\n-(defcustom org-babel-ditaa-java-cmd \"java\"\r\n-  \"Java executable to use when evaluating ditaa blocks.\"\r\n+  \"Path to the ditaa.jar file.\"\r\n   :group 'org-babel\r\n   :type 'string)\r\n \r\n (defcustom org-ditaa-eps-jar-path\r\n   (expand-file-name \"DitaaEps.jar\" (file-name-directory org-ditaa-jar-path))\r\n-  \"Path to the DitaaEps.jar executable.\"\r\n+  \"Path to the DitaaEps.jar executable.\r\n+Used when generating eps or pdf output.\"\r\n   :group 'org-babel\r\n   :version \"24.4\"\r\n   :package-version '(Org . \"8.0\")\r\n   :type 'string)\r\n \r\n-(defcustom org-ditaa-jar-option \"-jar\"\r\n-  \"Option for the ditaa jar file.\r\n-Do not leave leading or trailing spaces in this string.\"\r\n-  :group 'org-babel\r\n-  :version \"24.1\"\r\n-  :type 'string)\r\n+(defun ob-ditaa--ensure-jar-file (file)\r\n+  \"Return FILE if it exists, signal error otherwise.\"\r\n+  (if (file-exists-p file)\r\n+      file\r\n+    (error \"(ob-ditaa) Could not find jar file %s\" file)))\r\n \r\n (defun org-babel-execute:ditaa (body params)\r\n-  \"Execute BODY of Ditaa code with org-babel according to PARAMS.\r\n+  \"Execute BODY of ditaa code with org-babel according to PARAMS.\r\n This function is called by `org-babel-execute-src-block'.\"\r\n-  (let* ((out-file (or (cdr (assq :file params))\r\n-\t\t       (error\r\n-\t\t\t\"Ditaa code block requires :file header argument\")))\r\n-\t (cmdline (cdr (assq :cmdline params)))\r\n-\t (java (cdr (assq :java params)))\r\n-\t (in-file (org-babel-temp-file \"ditaa-\"))\r\n-\t (eps (cdr (assq :eps params)))\r\n-\t (eps-file (when eps\r\n-\t\t     (org-babel-process-file-name (concat in-file \".eps\"))))\r\n-\t (pdf-cmd (when (and (or (string= (file-name-extension out-file) \"pdf\")\r\n-\t\t\t\t (cdr (assq :pdf params))))\r\n-\t\t    (concat\r\n-\t\t     \"epstopdf\"\r\n-\t\t     \" \" eps-file\r\n-\t\t     \" -o=\" (org-babel-process-file-name out-file))))\r\n-\t (cmd (concat org-babel-ditaa-java-cmd\r\n-\t\t      \" \" java \" \" org-ditaa-jar-option \" \"\r\n-\t\t      (shell-quote-argument\r\n-\t\t       (expand-file-name\r\n-\t\t\t(if eps org-ditaa-eps-jar-path org-ditaa-jar-path)))\r\n-\t\t      \" \" cmdline\r\n-\t\t      \" \" (org-babel-process-file-name in-file)\r\n-\t\t      \" \" (if pdf-cmd\r\n-\t\t\t      eps-file\r\n-\t\t\t    (org-babel-process-file-name out-file)))))\r\n-    (unless (file-exists-p org-ditaa-jar-path)\r\n-      (error \"Could not find ditaa.jar at %s\" org-ditaa-jar-path))\r\n-    (with-temp-file in-file (insert body))\r\n-    (shell-command cmd)\r\n-    (when pdf-cmd (shell-command pdf-cmd))\r\n-    nil)) ;; signal that output has already been written to file\r\n+  (let* ((out-file (org-babel-graphical-output-file params))\r\n+         (out-file-suffix (file-name-extension out-file))\r\n+         ;; backwards-compatibility of :eps and :pdf header arguments\r\n+         ;; notice that these take precedence over file type (suffix)\r\n+         (legacy-eps (cdr (assq :eps params)))\r\n+         (legacy-pdf (cdr (assq :pdf params))))\r\n+    (when (and legacy-eps legacy-pdf)\r\n+      (error \"(ob-ditaa) Both :eps and :pdf legacy output types specified\"))\r\n+    (let* ((legacy-output-type (or legacy-eps legacy-pdf))\r\n+           (eps (or legacy-eps (string= out-file-suffix \"eps\")))\r\n+           (pdf (or legacy-pdf (string= out-file-suffix \"pdf\")))\r\n+           (svg (and (not legacy-output-type) (string= out-file-suffix \"svg\")))\r\n+           (png (and (not legacy-output-type)\r\n+                     (or (string= out-file-suffix \"png\")\r\n+                         (not (or svg pdf eps))))) ;; default output type is png\r\n+           (ditaa-options (cdr (assq :cmdline params)))\r\n+\t   (java-options (cdr (assq :java params)))\r\n+           (use-eps-jar (or eps pdf))\r\n+           (exec-form (if (or (equal org-ditaa-default-exec-mode 'jar) use-eps-jar)\r\n+                          (concat org-ditaa-java-exec\r\n+                                  (when java-options (concat \" \" java-options))\r\n+                                  \" \" \"-jar\" \" \"\r\n+                                  (shell-quote-argument\r\n+                                   (ob-ditaa--ensure-jar-file (if use-eps-jar org-ditaa-eps-jar-path\r\n+                                                                org-ditaa-jar-path))))\r\n+                        org-ditaa-exec))\r\n+\t   (in-file (org-babel-temp-file \"ditaa-\"))\r\n+           (ditaa-out-file (org-babel-process-file-name (if pdf (concat in-file \".eps\") out-file)))\r\n+           (ditaa-coding-system 'utf-8)\r\n+\t   (cmd (concat exec-form\r\n+                        (when ditaa-options (concat \" \" ditaa-options))\r\n+                        (when svg (concat \" \" \"--svg\"))\r\n+                        \" \" \"-e\" \" \" (symbol-name ditaa-coding-system)\r\n+                        \" \" in-file \" \" ditaa-out-file)))\r\n+      ;; verify that output file type is specified - note that this\r\n+      ;; error should in fact never happen, since default png type is\r\n+      ;; set above if no other supported type is specified\r\n+      (unless (or eps pdf svg png)\r\n+        (error (concat \"(ob-ditaa) Unknown output file extension: \" out-file-suffix)))\r\n+      (with-temp-file in-file\r\n+        (set-buffer-file-coding-system ditaa-coding-system)\r\n+        (insert body))\r\n+      (shell-command cmd)\r\n+      (when pdf\r\n+        (shell-command (concat \"epstopdf\" \" \" ditaa-out-file \" \"\r\n+\t\t               \"-o=\" (org-babel-process-file-name out-file))))\r\n+      nil))) ;; signal that output has already been written to file\r\n \r\n (defun org-babel-prep-session:ditaa (_session _params)\r\n   \"Return an error because ditaa does not support sessions.\"\r\n-- \r\n2.50.1\r\n\r\n","subject":"Re: [PATCH] ob-ditaa.el: custom var name, ditaa executable, SVG output, and chararacter encoding"},{"date":"2025-08-10T16:26:57.911Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CH3PR84MB3424B751D66A363BB31AF013C529A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","message-id":"CH3PR84MB3424B751D66A363BB31AF013C529A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","config":false,"refs-count":1,"username":"Morgan Smith","references":["875xev8ohp.fsf@localhost","CH3PR84MB34247D1E74C5DECBE07789E2C52EA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB3424DC5A13943A4A500FEE3CC5152@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","87y18vxgjs.fsf@localhost"],"related-refs":["CH3PR84MB3424B751D66A363BB31AF013C529A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"from":"morgan.j.smith@outlook.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/CH3PR84MB3424B751D66A363BB31AF013C529A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","source-id":"emacs-orgmode@gnu.org","patch-body":"From 3a008af13c25f3b87cc4cd7c440255c925a5c5b1 Mon Sep 17 00:00:00 2001\r\nFrom: Morgan Smith <Morgan.J.Smith@outlook.com>\r\nDate: Wed, 17 Apr 2024 17:51:35 -0400\r\nSubject: [PATCH 1\/5] Testing: Test clock times without timestamps\r\n\r\n* testing\/lisp\/test-org-clock.el (test-org-clock\/clocktable\/insert):\r\nAdd a clock time that does not include timestamps.\r\n---\r\n testing\/lisp\/test-org-clock.el | 9 ++++-----\r\n 1 file changed, 4 insertions(+), 5 deletions(-)\r\n\r\ndiff --git a\/testing\/lisp\/test-org-clock.el b\/testing\/lisp\/test-org-clock.el\r\nindex 8a196ee96..62e4d7507 100644\r\n--- a\/testing\/lisp\/test-org-clock.el\r\n+++ b\/testing\/lisp\/test-org-clock.el\r\n@@ -345,13 +345,12 @@ test-org-clock\/clocktable\/insert\r\n    (equal\r\n     \"| Headline     | Time   |\r\n |--------------+--------|\r\n-| *Total time* | *1:00* |\r\n+| *Total time* | *2:00* |\r\n |--------------+--------|\r\n-| H1           | 1:00   |\"\r\n+| H1           | 2:00   |\"\r\n     (org-test-with-temp-text \"* H1\\n<point>\"\r\n-      (insert (org-test-clock-create-clock \". 1:00\" \". 2:00\"))\r\n-\r\n-      (goto-line 2)\r\n+      (insert (org-test-clock-create-clock \". 1:00\" \". 2:00\")\r\n+              \"CLOCK: => 1:00\\n\")\r\n       (require 'org-clock)\r\n       (org-dynamic-block-insert-dblock \"clocktable\")\r\n \r\n-- \r\n2.50.1\r\n\r\n","subject":"Re: [PATCH] Rewrite `org-clock-sum'"},{"date":"2025-08-10T09:52:27.258Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/878qjr8q30.fsf@localhost","message-id":"878qjr8q30.fsf@localhost","config":false,"refs-count":11,"username":"Ihor Radchenko","references":["87ikj353w0.fsf@localhost","87cy9461gt.fsf@2001-14ba-a15c-2a0b-e3e4-4019-647a-2a11.rev.dnainternet.fi","875xp476pt.fsf@iki.fi","877bzn8ef5.fsf@2001-14ba-a03c-c50b-805f-6216-3bd1-1d05.rev.dnainternet.fi","87h5yoli5s.fsf@localhost","87ectrky4p.fsf@2001-14ba-a021-9b0b-6d5f-f405-6191-1b43.rev.dnainternet.fi","87msiggqjm.fsf@localhost"],"related-refs":["87frdrs7g6.fsf@2001-14ba-a144-3c0b-b4b4-c628-3137-f65e.rev.dnainternet.fi","87frawvbj6.fsf@2001-14ba-a0d6-470b-a488-694-43cb-842c.rev.dnainternet.fi","878qjr8q30.fsf@localhost","87cy9461gt.fsf@2001-14ba-a15c-2a0b-e3e4-4019-647a-2a11.rev.dnainternet.fi"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/878qjr8q30.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/lisp\/ob-ditaa.el b\/lisp\/ob-ditaa.el\r\nindex 072b4c8df..3f71cfa04 100644\r\n--- a\/lisp\/ob-ditaa.el\r\n+++ b\/lisp\/ob-ditaa.el\r\n@@ -136,10 +136,7 @@ (defcustom org-ditaa-eps-jar-path\r\n   :type 'string)\r\n \r\n (defun ob-ditaa--ensure-jar-file (file)\r\n-  \"Check whether file exists.\r\n-\r\n-Return file if it exists, signal error otherwise. Small internal helper\r\n-function used by ob-ditaa.\"\r\n+  \"Return FILE if it exists, signal error otherwise.\"\r\n   (if (file-exists-p file)\r\n       file\r\n     (error \"(ob-ditaa) Could not find jar file %s\" file)))\r\n@@ -151,10 +148,10 @@ (defun org-babel-execute:ditaa (body params)\r\n          (out-file-suffix (file-name-extension out-file))\r\n          ;; backwards-compatibility of :eps and :pdf header arguments\r\n          ;; notice that these take precedence over file type (suffix)\r\n-         (legacy-eps (cdr (assq :eps params))) \r\n+         (legacy-eps (cdr (assq :eps params)))\r\n          (legacy-pdf (cdr (assq :pdf params))))\r\n     (when (and legacy-eps legacy-pdf)\r\n-      (error \"(ob-ditaa) Both :eps and :pdf legacy output types specified.\"))\r\n+      (error \"(ob-ditaa) Both :eps and :pdf legacy output types specified\"))\r\n     (let* ((legacy-output-type (or legacy-eps legacy-pdf))\r\n            (eps (or legacy-eps (string= out-file-suffix \"eps\")))\r\n            (pdf (or legacy-pdf (string= out-file-suffix \"pdf\")))\r\n@@ -181,6 +178,8 @@ (defun org-babel-execute:ditaa (body params)\r\n                         (when svg (concat \" \" \"--svg\"))\r\n                         (when ditaa-encoding (concat \" \" \"-e \" ditaa-encoding))\r\n                         \" \" in-file \" \" ditaa-out-file)))\r\n+      (unless (or eps pdf svg png)\r\n+        (error \"Unknown output file extension: %s\" out-file-suffix))\r\n       (with-temp-file in-file (insert body))\r\n       (shell-command cmd)\r\n       (when pdf\r\n","subject":"Re: [PATCH] ob-ditaa.el: custom var name, ditaa executable, SVG output, and chararacter encoding"},{"date":"2025-08-09T14:00:03.540Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cy9461gt.fsf@2001-14ba-a15c-2a0b-e3e4-4019-647a-2a11.rev.dnainternet.fi","message-id":"87cy9461gt.fsf@2001-14ba-a15c-2a0b-e3e4-4019-647a-2a11.rev.dnainternet.fi","config":false,"refs-count":12,"username":"Jarmo Hurri","references":["87ikj353w0.fsf@localhost","875xp476pt.fsf@iki.fi","877bzn8ef5.fsf@2001-14ba-a03c-c50b-805f-6216-3bd1-1d05.rev.dnainternet.fi","87h5yoli5s.fsf@localhost","87ectrky4p.fsf@2001-14ba-a021-9b0b-6d5f-f405-6191-1b43.rev.dnainternet.fi","87msiggqjm.fsf@localhost"],"related-refs":["87frdrs7g6.fsf@2001-14ba-a144-3c0b-b4b4-c628-3137-f65e.rev.dnainternet.fi","87frawvbj6.fsf@2001-14ba-a0d6-470b-a488-694-43cb-842c.rev.dnainternet.fi","878qjr8q30.fsf@localhost","87cy9461gt.fsf@2001-14ba-a15c-2a0b-e3e4-4019-647a-2a11.rev.dnainternet.fi"],"from":"jarmo.hurri@iki.fi","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87cy9461gt.fsf@2001-14ba-a15c-2a0b-e3e4-4019-647a-2a11.rev.dnainternet.fi","source-id":"emacs-orgmode@gnu.org","patch-body":"From cf2dbd5a9f26f753bc83a92536f7ebf2632a7cbf Mon Sep 17 00:00:00 2001\r\nFrom: Jarmo Hurri <jarmo.hurri@iki.fi>\r\nDate: Mon, 4 Aug 2025 16:08:02 +0300\r\nSubject: [PATCH] ob-ditaa.el: output type control, ditaa executable, SVG\r\n output, and chararacter encoding\r\n\r\n* lisp\/ob-ditaa.el (org-babel-default-header-args:ditaa) Include new\r\nheader arg :encoding.  Add graphics to default value of :results.  Add\r\npng as default value of header arg :file-ext.\r\n(org-ditaa-default-exec-mode): Define new customizable variable for\r\ncontrolling ditaa execution via jar or executable.\r\n(org-ditaa-exec): Define new customizable variable for controlling\r\npath to ditaa executable.\r\n(org-ditaa-java-exec): Rename old customizable variable to conform to\r\nditaa variable naming (not containing word babel).  Provide an\r\nobsolete alias for backwards-compatibility.\r\n(org-ditaa--ensure-jar-file): Write a small helper function checking\r\nexistence of jar file.\r\n(org-babel-execute:ditaa): Use standard\r\n`org-babel-graphical-output-file' to determine output file and type.\r\nAdd support for ditaa executable.  Add support for SVG output.\r\nClarify code structure and local variable naming.  Provide\r\nbackwards-compatibility for :eps and :pdf header arguments.\r\n* doc\/org-manual.org (List of contributors): Remove reference to\r\nnon-existing location of ditaa.jar in org contrib, refer to ditaa\r\ngithub page instead.\r\n* etc\/ORG-NEWS: Document new features, new options and renamed\r\nvariable.\r\n\r\nThere was a mismatch between what ob-ditaa expected and what some\r\noperating systems provide.  In particular, ob-ditaa expected a JAR\r\nexecutable via java -jar, while some operating systems provide a shell\r\nscript which executes the JAR in a more complicated manner.  Therefore\r\nsupport for executing ditaa source code blocks directly via an\r\nexecutable was added.\r\n\r\nNewer versions of ditaa can generate SVG output, which was not\r\nsupported by ob-ditaa.  This is now fixed. Output type is deduced\r\nautomatically, and defaults to PNG.  Legacy output-type controlling\r\nheader arguments :eps and :pdf are still there for\r\nbackwards-compatibility, and override output type determination from\r\nfile type.\r\n\r\nCharacter encoding of ditaa source code blocks was passed via Java,\r\nwhile the encoding can be specified directly as a parameter to ditaa.\r\nCharacter encoding is now passed directly to ditaa, with a\r\ncorresponding header argument :encoding.\r\n---\r\n doc\/org-manual.org |   3 +-\r\n etc\/ORG-NEWS       |  26 +++++++\r\n lisp\/ob-ditaa.el   | 177 +++++++++++++++++++++++++++++++--------------\r\n 3 files changed, 152 insertions(+), 54 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex e4be10a3b..0af834e04 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -23275,7 +23275,8 @@ community and the code.\r\n   literal examples, and remote highlighting for referenced code lines.\r\n \r\n - Stathis Sideris wrote the =ditaa.jar= ASCII to PNG converter that is\r\n-  now packaged into the [[https:\/\/git.sr.ht\/~bzg\/org-contrib][org-contrib]] repository.\r\n+  available as a package in some operating systems or can be\r\n+  downloaded from [[https:\/\/github.com\/stathissideris\/ditaa]].\r\n \r\n - Daniel Sinder came up with the idea of internal archiving by locking\r\n   subtrees.\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 08d2bd938..5d25a05be 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -224,6 +224,15 @@ appropriate major mode is unavailable.\r\n \r\n When editing Dot source blocks, Org now uses Graphviz Dot mode, if installed.\r\n \r\n+*** =ob-ditaa=: ditaa executable, and SVG output\r\n+\r\n+In order to use a ditaa executable instead of a JAR file, you can set\r\n+=org-ditaa-default-exec-mode= to ='ditaa=.  The location of the\r\n+executable can be configured via =org-ditaa-exec=.\r\n+\r\n+SVG output can now be generated; note, however, that this requires a\r\n+ditaa version of at least 0.11.0.\r\n+\r\n ** New and changed options\r\n \r\n # Changes dealing with changing default values of customizations,\r\n@@ -391,6 +400,16 @@ symbol ~attach~ or a string -- directory name.  Now it can also be a\r\n function, which will be called with no arguments and its return value\r\n will be used as a directory to save the image to.\r\n \r\n+*** =ob-ditaa=: output type control, and chararacter encoding\r\n+\r\n+Output file type is determined as specified in Babel documentation:\r\n+the suffix of =:file= is the primary determinant, and =:file-ext=\r\n+secondary.  Header arguments =:pdf= and =:eps= are supported for\r\n+backwards compatibility.  Default output type is still PNG.\r\n+\r\n+Character encoding is passed directly to ditaa (earlier to Java) and\r\n+can be controlled by new header argument =:encoding=.\r\n+\r\n ** New functions and changes in function arguments\r\n \r\n # This also includes changes in function behavior from Elisp perspective.\r\n@@ -525,6 +544,13 @@ capture ~:tree-type~ options]], the internal variable\r\n ~org-datetree-base-level~ has been removed, as well as the\r\n undocumented helper function ~org-datetree-insert-line~.\r\n \r\n+*** =ob-ditaa=: new name for variable controlling java\r\n+\r\n+To align with other customizable variable names, which do not contain\r\n+the word =babel=, variable =org-babel-ditaa-java-cmd= has been renamed\r\n+to =org-ditaa-java-exec=.  The old variable =org-babel-ditaa-java-cmd=\r\n+is still available as an obsolete alias.\r\n+\r\n ** Miscellaneous\r\n *** ~org-capture~ target pointing to headline is now handled uniformly for =plain= entry type\r\n \r\ndiff --git a\/lisp\/ob-ditaa.el b\/lisp\/ob-ditaa.el\r\nindex 77eadd6c2..072b4c8df 100644\r\n--- a\/lisp\/ob-ditaa.el\r\n+++ b\/lisp\/ob-ditaa.el\r\n@@ -2,7 +2,7 @@\r\n \r\n ;; Copyright (C) 2009-2025 Free Software Foundation, Inc.\r\n \r\n-;; Author: Eric Schulte\r\n+;; Authors: Eric Schulte, Jarmo Hurri\r\n ;; Keywords: literate programming, reproducible research\r\n ;; URL: https:\/\/orgmode.org\r\n \r\n@@ -25,15 +25,53 @@\r\n \r\n ;; Org-Babel support for evaluating ditaa source code.\r\n ;;\r\n-;; This differs from most standard languages in that\r\n+;; Source code blocks of type ditaa have some special features:\r\n ;;\r\n-;; 1) there is no such thing as a \"session\" in ditaa\r\n+;; - there is no such thing as a \"session\"\r\n ;;\r\n-;; 2) we are generally only going to return results of type \"file\"\r\n+;; - :export results is the default\r\n ;;\r\n-;; 3) we are adding the \"file\" and \"cmdline\" header arguments\r\n+;; - only results of type \"file\" are returned\r\n+;;\r\n+;; - there are no variables\r\n+;;\r\n+;; - three different variants of \"ditaa\" exist: a ditaa executable\r\n+;;   (shell script), ditaa.jar Java archive and DitaaEPS.jar Java\r\n+;;   archive; the third one is a fork generating eps output, and is\r\n+;;   also a prerequisite for producing pdf output; ob-ditaa supports\r\n+;;   all three of these; if ditaa.jar or DitaaEPS.jar is used, paths\r\n+;;   to file(s) must be set; the following table summarizes which\r\n+;;   variant is used in which case; column mode refers to\r\n+;;   `org-ditaa-default-exec-mode'\r\n+;;\r\n+;;   | mode           | output   | command                                             |\r\n+;;   |----------------+----------+-----------------------------------------------------|\r\n+;;   | `ditaa'        | png, svg | `org-ditaa-exec'                                    |\r\n+;;   | `jar'          | png, svg | `org-ditaa-java-exec' -jar `org-ditaa-jar-path'     |\r\n+;;   | `ditaa', `jar' | eps      | `org-ditaa-java-exec' -jar `org-ditaa-eps-jar-path' |\r\n+;;   | `ditaa', `jar' | pdf      | `org-ditaa-java-exec' -jar `org-ditaa-eps-jar-path' |\r\n+;;\r\n+;; - standard header argument \"cmdline\" controls command line parameters passed to ditaa\r\n+;; - the following header arguments are added:\r\n+;;   \"encoding\" : character encoding (default UTF-8)\r\n+;;   \"java\" : additional parameters passed to java if ditaa run via a jar\r\n ;;\r\n-;; 4) there are no variables (at least for now)\r\n+\r\n+;;; Requirements:\r\n+\r\n+;; at least one of the following:\r\n+;;\r\n+;; ditaa (executable)\r\n+;; - packaged in some distributions\r\n+;; - configurable via `org-ditaa-exec'\r\n+;;\r\n+;; ditaa.jar | when exec mode is `jar'\r\n+;; - `org-ditaa-jar-path' must point to this jar file\r\n+;; - see https:\/\/github.com\/stathissideris\/ditaa\r\n+;;\r\n+;; DitaaEps.jar | when generating eps or pdf output\r\n+;; - `org-ditaa-eps-jar-path' must point to this jar file\r\n+;; - see https:\/\/sourceforge.net\/projects\/ditaa-addons\/files\/DitaaEps\/\r\n \r\n ;;; Code:\r\n \r\n@@ -44,11 +82,37 @@\r\n (require 'org-compat)\r\n \r\n (defvar org-babel-default-header-args:ditaa\r\n-  '((:results . \"file\")\r\n+  '((:results . \"file graphics\")\r\n     (:exports . \"results\")\r\n-    (:java . \"-Dfile.encoding=UTF-8\"))\r\n+    (:encoding . \"UTF-8\")\r\n+    (:file-ext . \"png\"))\r\n   \"Default arguments for evaluating a ditaa source block.\")\r\n \r\n+(defcustom org-ditaa-default-exec-mode 'jar\r\n+  \"Method to use for ditaa diagram generation when generating png or svg output.\r\n+`jar' means to use java together with a JAR.\r\n+The JAR must be set via `org-ditaa-jar-path'.\r\n+\r\n+`ditaa' means to use the ditaa executable.\r\n+The executable can be configured via `org-ditaa-exec'.\"\r\n+\r\n+  :group 'org-babel\r\n+  :package-version '(Org . \"9.8\")\r\n+  :type '(choice (const :tag \"Use java together with a JAR file.\" jar)\r\n+                 (const :tag \"Use ditaa executable.\" ditaa)))\r\n+\r\n+(defcustom org-ditaa-exec \"ditaa\"\r\n+  \"File name of the ditaa executable.\"\r\n+  :group 'org-babel\r\n+  :package-version '(Org . \"9.8\")\r\n+  :type 'string)\r\n+\r\n+(define-obsolete-variable-alias 'org-babel-ditaa-java-cmd 'org-ditaa-java-exec \"9.8\")\r\n+(defcustom org-ditaa-java-exec \"java\"\r\n+  \"Java executable to use when evaluating ditaa blocks using a JAR.\"\r\n+  :group 'org-babel\r\n+  :type 'string)\r\n+\r\n (defcustom org-ditaa-jar-path (expand-file-name\r\n \t\t\t       \"ditaa.jar\"\r\n \t\t\t       (file-name-as-directory\r\n@@ -58,64 +122,71 @@\r\n \t\t\t\t  (expand-file-name\r\n \t\t\t\t   \"..\/contrib\"\r\n \t\t\t\t   (file-name-directory (org-find-library-dir \"org\")))))))\r\n-  \"Path to the ditaa jar executable.\"\r\n-  :group 'org-babel\r\n-  :type 'string)\r\n-\r\n-(defcustom org-babel-ditaa-java-cmd \"java\"\r\n-  \"Java executable to use when evaluating ditaa blocks.\"\r\n+  \"Path to the ditaa.jar file.\"\r\n   :group 'org-babel\r\n   :type 'string)\r\n \r\n (defcustom org-ditaa-eps-jar-path\r\n   (expand-file-name \"DitaaEps.jar\" (file-name-directory org-ditaa-jar-path))\r\n-  \"Path to the DitaaEps.jar executable.\"\r\n+  \"Path to the DitaaEps.jar executable.\r\n+Used when generating eps or pdf output.\"\r\n   :group 'org-babel\r\n   :version \"24.4\"\r\n   :package-version '(Org . \"8.0\")\r\n   :type 'string)\r\n \r\n-(defcustom org-ditaa-jar-option \"-jar\"\r\n-  \"Option for the ditaa jar file.\r\n-Do not leave leading or trailing spaces in this string.\"\r\n-  :group 'org-babel\r\n-  :version \"24.1\"\r\n-  :type 'string)\r\n+(defun ob-ditaa--ensure-jar-file (file)\r\n+  \"Check whether file exists.\r\n+\r\n+Return file if it exists, signal error otherwise. Small internal helper\r\n+function used by ob-ditaa.\"\r\n+  (if (file-exists-p file)\r\n+      file\r\n+    (error \"(ob-ditaa) Could not find jar file %s\" file)))\r\n \r\n (defun org-babel-execute:ditaa (body params)\r\n-  \"Execute BODY of Ditaa code with org-babel according to PARAMS.\r\n+  \"Execute BODY of ditaa code with org-babel according to PARAMS.\r\n This function is called by `org-babel-execute-src-block'.\"\r\n-  (let* ((out-file (or (cdr (assq :file params))\r\n-\t\t       (error\r\n-\t\t\t\"Ditaa code block requires :file header argument\")))\r\n-\t (cmdline (cdr (assq :cmdline params)))\r\n-\t (java (cdr (assq :java params)))\r\n-\t (in-file (org-babel-temp-file \"ditaa-\"))\r\n-\t (eps (cdr (assq :eps params)))\r\n-\t (eps-file (when eps\r\n-\t\t     (org-babel-process-file-name (concat in-file \".eps\"))))\r\n-\t (pdf-cmd (when (and (or (string= (file-name-extension out-file) \"pdf\")\r\n-\t\t\t\t (cdr (assq :pdf params))))\r\n-\t\t    (concat\r\n-\t\t     \"epstopdf\"\r\n-\t\t     \" \" eps-file\r\n-\t\t     \" -o=\" (org-babel-process-file-name out-file))))\r\n-\t (cmd (concat org-babel-ditaa-java-cmd\r\n-\t\t      \" \" java \" \" org-ditaa-jar-option \" \"\r\n-\t\t      (shell-quote-argument\r\n-\t\t       (expand-file-name\r\n-\t\t\t(if eps org-ditaa-eps-jar-path org-ditaa-jar-path)))\r\n-\t\t      \" \" cmdline\r\n-\t\t      \" \" (org-babel-process-file-name in-file)\r\n-\t\t      \" \" (if pdf-cmd\r\n-\t\t\t      eps-file\r\n-\t\t\t    (org-babel-process-file-name out-file)))))\r\n-    (unless (file-exists-p org-ditaa-jar-path)\r\n-      (error \"Could not find ditaa.jar at %s\" org-ditaa-jar-path))\r\n-    (with-temp-file in-file (insert body))\r\n-    (shell-command cmd)\r\n-    (when pdf-cmd (shell-command pdf-cmd))\r\n-    nil)) ;; signal that output has already been written to file\r\n+  (let* ((out-file (org-babel-graphical-output-file params))\r\n+         (out-file-suffix (file-name-extension out-file))\r\n+         ;; backwards-compatibility of :eps and :pdf header arguments\r\n+         ;; notice that these take precedence over file type (suffix)\r\n+         (legacy-eps (cdr (assq :eps params))) \r\n+         (legacy-pdf (cdr (assq :pdf params))))\r\n+    (when (and legacy-eps legacy-pdf)\r\n+      (error \"(ob-ditaa) Both :eps and :pdf legacy output types specified.\"))\r\n+    (let* ((legacy-output-type (or legacy-eps legacy-pdf))\r\n+           (eps (or legacy-eps (string= out-file-suffix \"eps\")))\r\n+           (pdf (or legacy-pdf (string= out-file-suffix \"pdf\")))\r\n+           (svg (and (not legacy-output-type) (string= out-file-suffix \"svg\")))\r\n+           (png (and (not legacy-output-type)\r\n+                     (or (string= out-file-suffix \"png\")\r\n+                         (not (or svg pdf eps))))) ;; default output type is png\r\n+           (ditaa-options (cdr (assq :cmdline params)))\r\n+           (ditaa-encoding (cdr (assq :encoding params)))\r\n+\t   (java-options (cdr (assq :java params)))\r\n+           (use-eps-jar (or eps pdf))\r\n+           (exec-form (if (or (equal org-ditaa-default-exec-mode 'jar) use-eps-jar)\r\n+                          (concat org-ditaa-java-exec\r\n+                                  (when java-options (concat \" \" java-options))\r\n+                                  \" \" \"-jar\" \" \"\r\n+                                  (shell-quote-argument\r\n+                                   (ob-ditaa--ensure-jar-file (if use-eps-jar org-ditaa-eps-jar-path\r\n+                                                                org-ditaa-jar-path))))\r\n+                        org-ditaa-exec))\r\n+\t   (in-file (org-babel-temp-file \"ditaa-\"))\r\n+           (ditaa-out-file (org-babel-process-file-name (if pdf (concat in-file \".eps\") out-file)))\r\n+\t   (cmd (concat exec-form\r\n+                        (when ditaa-options (concat \" \" ditaa-options))\r\n+                        (when svg (concat \" \" \"--svg\"))\r\n+                        (when ditaa-encoding (concat \" \" \"-e \" ditaa-encoding))\r\n+                        \" \" in-file \" \" ditaa-out-file)))\r\n+      (with-temp-file in-file (insert body))\r\n+      (shell-command cmd)\r\n+      (when pdf\r\n+        (shell-command (concat \"epstopdf\" \" \" ditaa-out-file \" \"\r\n+\t\t               \"-o=\" (org-babel-process-file-name out-file))))\r\n+      nil))) ;; signal that output has already been written to file\r\n \r\n (defun org-babel-prep-session:ditaa (_session _params)\r\n   \"Return an error because ditaa does not support sessions.\"\r\n-- \r\n2.50.1\r\n\r\n","subject":"Re: [PATCH] ob-ditaa.el: custom var name, ditaa executable, SVG output, and chararacter encoding"},{"date":"2025-07-31T06:53:24.638Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/820F0E20-4AB4-4437-9A73-0D5180EC02D6@gmail.com","message-id":"820F0E20-4AB4-4437-9A73-0D5180EC02D6@gmail.com","config":false,"refs-count":9,"username":"Jonas Olofsson","related-refs":["CH3PR84MB3424E84B9F2B7252FE397885C562A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","820F0E20-4AB4-4437-9A73-0D5180EC02D6@gmail.com","CH3PR84MB34243FB1BFCDBF5F39EC3016C5DDA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB342487A0383BD1628FD49A91C5C3A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"from":"pjw.olofsson@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Not being able to sort deadline-up and scheduled-up in the same agenda-command [9.7.31 (9.7.31-??-4e6d38d @ \/Users\/jolofsson\/.config\/emacs\/.local\/straight\/build-29.4\/org\/)]"},{"date":"2025-07-24T08:54:44.863Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/6ed27187-879f-1c4e-6df5-ed9f56273722@free.fr","message-id":"6ed27187-879f-1c4e-6df5-ed9f56273722@free.fr","config":false,"refs-count":2,"username":"tbanelwebmin","related-refs":["6ed27187-879f-1c4e-6df5-ed9f56273722@free.fr"],"from":"tbanelwebmin@free.fr","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-table-recalculate not fully completing its task"},{"date":"2025-07-21T12:25:08.603Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CAJqVjv-rO9QnO6uw-QtinrFdwMkkHza5CPS6QXgkgWzaxBA45Q@mail.gmail.com","message-id":"CAJqVjv-rO9QnO6uw-QtinrFdwMkkHza5CPS6QXgkgWzaxBA45Q@mail.gmail.com","config":false,"refs-count":1,"username":"Jake","related-refs":["CAJqVjv-rO9QnO6uw-QtinrFdwMkkHza5CPS6QXgkgWzaxBA45Q@mail.gmail.com"],"from":"jforst.mailman@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] false positive error from org-compile-command [9.7.25 (N\/A @ \/gnu\/store\/pya76mlyr24zgwyb6fwv13ab2j04g31h-emacs-org-9.7.25\/share\/emacs\/site-lisp\/org-9.7.25\/)]"},{"date":"2025-07-20T13:38:50.847Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87y0sjnfxj.fsf@localhost","message-id":"87y0sjnfxj.fsf@localhost","config":false,"refs-count":15,"username":"Ihor Radchenko","references":["874ix2xl0j.fsf@city17.xyz","87msaxsn6c.fsf@city17.xyz","887f7177-f2ab-42a3-b8bd-fab8d6c976b2@gmail.com","7654d5e1-845f-4092-bf98-c4d8322e0284@gmail.com","87bjrb5l1e.fsf@city17.xyz"],"related-refs":["87y0sjnfxj.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87y0sjnfxj.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From a75e575a0ae8172d0d50c738d67b36f518ad5f98 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <a75e575a0ae8172d0d50c738d67b36f518ad5f98.1753018325.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Sun, 20 Jul 2025 15:30:33 +0200\r\nSubject: [PATCH] org-refile: Do not assume that kill ring cannot change under\r\n our feet\r\n\r\n* lisp\/org-refile.el (org-refile): Store region to be refiled in\r\nvariable rather than relying upon it being held as the first entry in\r\nthe kill ring.\r\n\r\nReported-by: jman <emacs-orgmode@city17.xyz>\r\nLink: https:\/\/orgmode.org\/list\/87msaxsn6c.fsf@city17.xyz\r\n---\r\n lisp\/org-refile.el | 7 +++++--\r\n 1 file changed, 5 insertions(+), 2 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-refile.el b\/lisp\/org-refile.el\r\nindex 5caed50a6..4bca6ee85 100644\r\n--- a\/lisp\/org-refile.el\r\n+++ b\/lisp\/org-refile.el\r\n@@ -484,7 +484,7 @@ (defun org-refile (&optional arg default-buffer rfloc msg)\r\n \t   (region-start (and regionp (region-beginning)))\r\n \t   (region-end (and regionp (region-end)))\r\n \t   (org-refile-keep (if (equal arg 3) t org-refile-keep))\r\n-\t   pos it nbuf file level reversed)\r\n+\t   pos it nbuf file level reversed tree)\r\n       (setq last-command nil)\r\n       (when regionp\r\n \t(goto-char region-start)\r\n@@ -557,6 +557,9 @@ (defun org-refile (&optional arg default-buffer rfloc msg)\r\n \t\t  (org-kill-new (buffer-substring region-start region-end))\r\n \t\t  (org-save-markers-in-region region-start region-end))\r\n \t      (org-copy-subtree 1 nil t))\r\n+            ;; We cannot rely on the kill remaining intact before we\r\n+            ;; paste.  See https:\/\/orgmode.org\/list\/87msaxsn6c.fsf@city17.xyz\r\n+            (setq tree (current-kill 0))\r\n             (let ((origin (point-marker)))\r\n               ;; Handle special case when we refile to exactly same\r\n               ;; location with tree promotion\/demotion.  Point marker\r\n@@ -583,7 +586,7 @@ (defun org-refile (&optional arg default-buffer rfloc msg)\r\n \t\t     (goto-char (point-min))\r\n \t\t     (or (outline-next-heading) (goto-char (point-max)))))\r\n \t         (unless (bolp) (newline))\r\n-\t         (org-paste-subtree level nil nil t)\r\n+\t         (org-paste-subtree level tree nil t)\r\n \t         ;; Record information, according to `org-log-refile'.\r\n \t         ;; Do not prompt for a note when refiling multiple\r\n \t         ;; headlines, however.  Simply add a time stamp.\r\n-- \r\n2.50.1\r\n\r\n","subject":"Re: org-refile confusing refiling"},{"date":"2025-07-20T12:28:42.721Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87bjpfoxqs.fsf@localhost","message-id":"87bjpfoxqs.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["31b4dc62-34f6-4328-a297-b67938dbb8f8@dgfip.finances.gouv.fr"],"related-refs":["87bjpfoxqs.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Org export: expanding links to included files (was: [BUG] Export backend cross-references are broken [9.7.30 (release_9.7.30 @ \/home\/user\/org-mode-git\/lisp\/)])"},{"date":"2025-07-12T21:04:41.918Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CH3PR84MB3424D728F955CE4FB5AFA41AC54AA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","message-id":"CH3PR84MB3424D728F955CE4FB5AFA41AC54AA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","config":false,"refs-count":1,"username":"Morgan Smith","references":["87sej1ib8i.fsf@localhost","874j9ugu57.fsf@localhost","CH3PR84MB34246AE8F1F154B61C76A8D0C5032@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","877c35rfia.fsf@localhost","87fri2lq0v.fsf@localhost","87v7osdnai.fsf@localhost","87ttas18i5.fsf@localhost","CH3PR84MB3424A9AAE6AD02DF7D483D32C561A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB3424C03A7D026DC66E15DB14C5C32@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB342451F9E57F6D2FC2C35226C5B82@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB3424E701CCCA8C274B68EC9EC57FA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"related-refs":["CH3PR84MB3424D728F955CE4FB5AFA41AC54AA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"from":"morgan.j.smith@outlook.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/CH3PR84MB3424D728F955CE4FB5AFA41AC54AA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","source-id":"emacs-orgmode@gnu.org","patch-body":"From 8e82972b3b69c8510769e2a33f4c4742376235be Mon Sep 17 00:00:00 2001\r\nFrom: Morgan Smith <Morgan.J.Smith@outlook.com>\r\nDate: Tue, 27 May 2025 15:14:34 -0400\r\nSubject: [PATCH 1\/2] Allow `org-tags-sort-function' to be a list of functions\r\n\r\n* lisp\/org.el (org-tags-sort-function): Describe new feature.  Add\r\n'(repeat function) to the type.\r\n(org-tags-sort): New function\r\n* lisp\/org-agenda.el (org-cmp-tag): Use `org-tags-sort'.\r\n* lisp\/org-mouse.el (org-mouse-tag-menu, org-mouse-popup-global-menu):\r\nUse `org-tags-sort'.\r\n* testing\/lisp\/test-org-agenda.el (test-org-agenda\/tags-sorting): Test\r\nnew functionality.\r\n* etc\/ORG-NEWS: Announce the new feature.\r\n---\r\n etc\/ORG-NEWS                    |  6 ++++++\r\n lisp\/org-agenda.el              |  4 ++--\r\n lisp\/org-mouse.el               |  8 ++++----\r\n lisp\/org.el                     | 33 ++++++++++++++++++++++++++++++---\r\n testing\/lisp\/test-org-agenda.el | 32 ++++++++++++++++++++++++--------\r\n 5 files changed, 66 insertions(+), 17 deletions(-)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 62502a678..1f29415ee 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -349,6 +349,12 @@ behaviour of other exporters. In this case, to exclude a section from\r\n the table of contents, mark it as =:UNNUMBERED: notoc= in its\r\n properties.\r\n \r\n+*** ~org-tags-sort-function~ can now be a list of functions\r\n+\r\n+~org-tags-sort-function~ can now be set to a list of functions.\r\n+Subsequent sorting functions will be used if two tags are found to be\r\n+equivalent.  See docstring for more information.\r\n+\r\n *** New option ~org-cite-basic-complete-key-crm-separator~\r\n \r\n This option makes ~org-cite~'s ~basic~ insert processor use\r\ndiff --git a\/lisp\/org-agenda.el b\/lisp\/org-agenda.el\r\nindex 7f0a6ee75..a10ae1888 100644\r\n--- a\/lisp\/org-agenda.el\r\n+++ b\/lisp\/org-agenda.el\r\n@@ -7570,8 +7570,8 @@ org-cmp-tag\r\n     (cond ((not (or ta tb)) nil)\r\n \t  ((not ta) +1)\r\n \t  ((not tb) -1)\r\n-\t  ((funcall (or org-tags-sort-function #'org-string<) ta tb) -1)\r\n-\t  ((funcall (or org-tags-sort-function #'org-string<) tb ta) +1))))\r\n+\t  ((org-tags-sort ta tb) -1)\r\n+\t  ((org-tags-sort tb ta) +1))))\r\n \r\n (defsubst org-cmp-time (a b)\r\n   \"Compare the time-of-day values of strings A and B.\"\r\ndiff --git a\/lisp\/org-mouse.el b\/lisp\/org-mouse.el\r\nindex a282f004c..bc0857d3c 100644\r\n--- a\/lisp\/org-mouse.el\r\n+++ b\/lisp\/org-mouse.el\r\n@@ -427,13 +427,13 @@ org-mouse-tag-menu\r\n    (let ((tags (org-get-tags nil t)))\r\n      (org-mouse-keyword-menu\r\n       (sort (mapcar #'car (org-get-buffer-tags))\r\n-            (or org-tags-sort-function #'org-string<))\r\n+            #'org-tags-sort)\r\n       (lambda (tag)\r\n \t(org-mouse-set-tags\r\n \t (sort (if (member tag tags)\r\n \t\t   (delete tag tags)\r\n \t\t (cons tag tags))\r\n-\t       (or org-tags-sort-function #'org-string<))))\r\n+               #'org-tags-sort)))\r\n       (lambda (tag) (member tag tags))\r\n       ))\r\n    '(\"--\"\r\n@@ -504,7 +504,7 @@ org-mouse-popup-global-menu\r\n      (\"Check Tags\"\r\n       ,@(org-mouse-keyword-menu\r\n \t (sort (mapcar #'car (org-get-buffer-tags))\r\n-               (or org-tags-sort-function #'org-string<))\r\n+               #'org-tags-sort)\r\n          (lambda (tag) (org-tags-sparse-tree nil tag)))\r\n       \"--\"\r\n       [\"Custom Tag ...\" org-tags-sparse-tree t])\r\n@@ -515,7 +515,7 @@ org-mouse-popup-global-menu\r\n      (\"Display Tags\"\r\n       ,@(org-mouse-keyword-menu\r\n \t (sort (mapcar #'car (org-get-buffer-tags))\r\n-               (or org-tags-sort-function #'org-string<))\r\n+               #'org-tags-sort)\r\n          (lambda (tag) (org-tags-view nil tag)))\r\n       \"--\"\r\n       [\"Custom Tag ...\" org-tags-view t])\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex 0a406d7cc..7198ebf12 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -3009,13 +3009,21 @@ org-tags-sort-function\r\n   \"When set, tags are sorted using this function as a comparator.\r\n When the value is nil, use default sorting order.  The default sorting\r\n is alphabetical, except in `org-set-tags' where no sorting is done by\r\n-default.\"\r\n+default.\r\n+\r\n+This can also be a list of functions.  If a function returns nil when\r\n+sorting two tags regardless of order (to indicate both tags are equal),\r\n+then the next function in the list will be called to determine sort\r\n+order.  The functions are allowed to call `org-tag-sort' which will skip\r\n+to the next sort function in the list.  If the last function in the list\r\n+calls `org-tag-sort' then it will use the default sorting order.\"\r\n   :group 'org-tags\r\n   :type '(choice\r\n \t  (const :tag \"Default sorting\" nil)\r\n \t  (const :tag \"Alphabetical\" org-string<)\r\n \t  (const :tag \"Reverse alphabetical\" org-string>)\r\n-\t  (function :tag \"Custom function\" nil)))\r\n+          (function :tag \"Custom function\" nil)\r\n+          (repeat function)))\r\n \r\n (defvar org-tags-history nil\r\n   \"History of minibuffer reads for tags.\")\r\n@@ -4333,6 +4341,25 @@ org--tag-add-to-alist\r\n       ;; Preserve order of ALIST1.\r\n       (append (nreverse to-add) alist2)))))\r\n \r\n+(defun org-tags-sort (tag1 tag2)\r\n+  \"Sort tags TAG1 and TAG2 according to the value of `org-tags-sort-function'.\"\r\n+  (let ((org-tags-sort-function\r\n+         (cond ((functionp org-tags-sort-function) (list org-tags-sort-function))\r\n+               ((consp     org-tags-sort-function) org-tags-sort-function)\r\n+               ;; Default sorting as described in docstring of `org-tags-sort-function'.\r\n+               ((null      org-tags-sort-function) (list #'org-string<)))))\r\n+    (catch :org-tags-sort-return\r\n+      (dolist (sort-fun org-tags-sort-function)\r\n+        ;; So the function can call `org-tags-sort'\r\n+        (let ((org-tags-sort-function (cdr org-tags-sort-function)))\r\n+          (cond\r\n+           ((funcall sort-fun tag1 tag2) ; tag1 < tag2\r\n+            (throw :org-tags-sort-return t))\r\n+           ((funcall sort-fun tag2 tag1) ; tag1 > tag2\r\n+            (throw :org-tags-sort-return nil))\r\n+           (t ; tag1 = tag2\r\n+            'continue-loop)))))))\r\n+\r\n (defun org-priority-to-value (s)\r\n   \"Convert priority string S to its numeric value.\"\r\n   (or (save-match-data\r\n@@ -12114,7 +12141,7 @@ org-set-tags\r\n \t\t   (_ (error \"Invalid tag specification: %S\" tags))))\r\n \t   (old-tags (org-get-tags nil t))\r\n \t   (tags-change? nil))\r\n-       (when (functionp org-tags-sort-function)\r\n+       (when org-tags-sort-function\r\n          (setq tags (sort tags org-tags-sort-function)))\r\n        (setq tags-change? (not (equal tags old-tags)))\r\n        (when tags-change?\r\ndiff --git a\/testing\/lisp\/test-org-agenda.el b\/testing\/lisp\/test-org-agenda.el\r\nindex 06d5abc43..3c2102905 100644\r\n--- a\/testing\/lisp\/test-org-agenda.el\r\n+++ b\/testing\/lisp\/test-org-agenda.el\r\n@@ -657,7 +657,9 @@ test-org-agenda\/skip-scheduled-repeats-after-deadline\r\n \r\n (ert-deftest test-org-agenda\/tags-sorting ()\r\n   \"Test if `org-agenda' sorts tags according to `org-tags-sort-function'.\"\r\n-  (let ((org-agenda-custom-commands\r\n+  (let ((string-length< (lambda (s1 s2)\r\n+                          (< (length s1) (length s2))))\r\n+        (org-agenda-custom-commands\r\n          '((\"f\" \"no fluff\" todo \"\"\r\n             ((org-agenda-todo-keyword-format \"\")\r\n              (org-agenda-overriding-header \"\")\r\n@@ -667,14 +669,19 @@ test-org-agenda\/tags-sorting\r\n     (org-test-agenda-with-agenda\r\n      (string-join\r\n       '(\"* TODO group_a :group_a:\"\r\n-        \"* TODO tag_a_1 :tag_a_1:\"\r\n         \"* TODO tag_a_2 :tag_a_2:\"\r\n-        \"* TODO tag_b_1 :tag_b_1:\"\r\n         \"* TODO tag_b_2 :tag_b_2:\"\r\n         \"* TODO groupless :groupless:\"\r\n-        \"* TODO lonely :lonely:\")\r\n+        \"* TODO tag_a_1 :tag_a_1:\"\r\n+        \"* TODO tag_b_1 :tag_b_1:\"\r\n+        \"* TODO lonely :lonely:\"\r\n+        \"* TODO blueberry :blueberry:\")\r\n       \"\\n\")\r\n-     (dolist (org-tags-sort-function '(nil org-string< org-string> ignore))\r\n+     (dolist (org-tags-sort-function `(nil\r\n+                                       org-string< org-string> ignore\r\n+                                       ,string-length<\r\n+                                       (,string-length<)\r\n+                                       (,string-length< org-string<)))\r\n        (should\r\n         (string-equal\r\n          (string-trim\r\n@@ -685,15 +692,24 @@ test-org-agenda\/tags-sorting\r\n            ;; Not sorted\r\n            ('ignore\r\n             (string-join\r\n-             '(\"group_a\" \"tag_a_1\" \"tag_a_2\" \"tag_b_1\" \"tag_b_2\" \"groupless\" \"lonely\")\r\n+             '(\"group_a\" \"tag_a_2\" \"tag_b_2\" \"groupless\" \"tag_a_1\" \"tag_b_1\" \"lonely\" \"blueberry\")\r\n              \"\\n\"))\r\n            ((or 'nil 'org-string<)\r\n             (string-join\r\n-             '(\"group_a\" \"groupless\" \"lonely\" \"tag_a_1\" \"tag_a_2\" \"tag_b_1\" \"tag_b_2\")\r\n+             '(\"blueberry\" \"group_a\" \"groupless\" \"lonely\" \"tag_a_1\" \"tag_a_2\" \"tag_b_1\" \"tag_b_2\")\r\n              \"\\n\"))\r\n            ('org-string>\r\n             (string-join\r\n-             '(\"tag_b_2\" \"tag_b_1\" \"tag_a_2\" \"tag_a_1\" \"lonely\" \"groupless\" \"group_a\")\r\n+             '(\"tag_b_2\" \"tag_b_1\" \"tag_a_2\" \"tag_a_1\" \"lonely\" \"groupless\" \"group_a\" \"blueberry\")\r\n+             \"\\n\"))\r\n+           ((or (pred (equal string-length<))\r\n+                `(,string-length<))\r\n+            (string-join\r\n+             '(\"lonely\" \"group_a\" \"tag_a_2\" \"tag_b_2\" \"tag_a_1\" \"tag_b_1\" \"groupless\" \"blueberry\")\r\n+             \"\\n\"))\r\n+           (`(,string-length< org-string<)\r\n+            (string-join\r\n+             '(\"lonely\" \"group_a\" \"tag_a_1\" \"tag_a_2\" \"tag_b_1\" \"tag_b_2\" \"blueberry\" \"groupless\")\r\n              \"\\n\")))))))))\r\n \r\n (ert-deftest test-org-agenda\/goto-date ()\r\n-- \r\n2.50.0\r\n\r\n","subject":"Re: [PATCH] lisp\/org.el: Add ability to sort tags by hierarchy"},{"date":"2025-07-06T08:53:48.763Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/878ql1bt4s.fsf@localhost","message-id":"878ql1bt4s.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87zfefsbb5.fsf@localhost"],"related-refs":["878ql1bt4s.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nHere are the meetup notes.\r\n\r\nTL;DR: neosilator; feature\/all-tex-fonts; backwards compatibility; \\end{...}% in latex;\r\ntypst; multi-page export; async LaTeX preview; ox-hugo, hugo; LaTeX formula alignment;\r\nMathML; org-table formula parser; how global id: links are searched; live LaTeX previews;\r\nindicating LaTeX errors in fragments; GNU licensing and money; Org\r\nmode is not a GNU project; GNU & ethical payments; two meetups per month?\r\n\r\nIt was a rather long meetup. 4+ hours.\r\n\r\n- As usual, we started from https:\/\/sachachua.com\/blog\/2025\/06\/2025-06-09-emacs-news\/\r\n  - Before the meetup I went through the news, capturing interesting\r\n    links. But not many people were present yet.\r\n\r\n- We had a bit of (off-topic) discussion about russian word\r\n  \"neosilator\" (\u043d\u0435\u043e\u0441\u0438\u043b\u044f\u0442\u043e\u0440), which I did not immediately recognize (despite being\r\n  native-ish speaker). Pedro did though :)\r\n  - Apparently it is one of jargon words popular in the early days of\r\n    internet that refers to someone who has difficulties with learning\r\n    curve of a software (or not software)\r\n  - Zororg asked if I am russian\r\n    - I am not. I am Ukrainian. My russian is mostly spoken, often\r\n      mixed with Ukrainian (also English now). I am also not trained\r\n      in writing in russian.\r\n\r\n- (that's where the proper meeting started)\r\n  - we also had issues with several people keeping their microphones turned on\r\n  - should not happen in the future. Sacha changed BBB settings to disable\r\n    microphones by default when people join.\r\n\r\n- Pedro demoed an update on the WIP feature branch that implements\r\n  out-of-the-box export for non-latin Org documents\r\n  https:\/\/list.orgmode.org\/CAO48Bk9oiqRy0Gj-MRVjNjkkuhyrK0nVxq7q2g+jnhG+vqpJ=A@mail.gmail.com\/T\/#t\r\n  - He showcased Greek with LaTeX's polyglossia and babel (automatically configured)\r\n    In lualatex. Materials: https:\/\/list.orgmode.org\/87ecvn4g94.fsf@localhost\/T\/#u\r\n  - Presentation as plain text is provided at the end\r\n  - *Pedro is interested in people familiar with various non-latin*\r\n    *scripts to test the branch and report any issues*\r\n  - We briefly discussed where to find examples of non-latin texts\r\n    - I recalled that I once found free version of Quran (https:\/\/tanzil.net\/download\/)\r\n      - That won't help with checking if export right 100% right though\r\n      - We need people who know how things should be typeset\r\n  - Jacob S. Gordon asked about the new variable\r\n    ~org-latex-fontspec-config~ introduced in the branch\r\n    - the variable sets (1) default fonts to be used for unicode scripts,\r\n      (2) backup fonts is the defaults are not available.\r\n      - the fonts are set independently for different rendering types:\r\n\tmain, sans, math, and mono\r\n      - that includes \"math\" that is used in equations (unicode-math\r\n        package that is used by default in the new branch)\r\n  - Pedro asked me about guidelines to handle backwards compatibility\r\n    - He has some issues maintaining backwards compatibility as the existing code\r\n      does a lot of latex source fiddling with complex regexp replaces\r\n      that handle special \"AUTO\" language names (see \"13.10.3 LaTeX\r\n      header and sectioning structure\" section of Org manual\r\n      describing polyglossia\/babel setup (that part is what is being\r\n      automated on the branch)\r\n    - We generally try to avoid breaking things as much as possible\r\n      See https:\/\/orgmode.org\/worg\/org-maintenance.html#guidelines\r\n    - For the purposes of developing the branch, Pedro may go ahead\r\n      and break things for the first iteration of the branch development.\r\n      First, let's make sure that the new feature is working\r\n    - We will tackle backwards compatibility later, closer to the time\r\n      when the review is completed and the branch is ready to be merged\r\n\r\n- During his presentation, Pedro mentioned some issue with minipage\r\n  environment for LaTeX\r\n  - Apparently, it is necessary to end the minipage as\r\n    ~\\end{minipage}%~ - a common trick to suppress newline\r\n    and triggering new paragraph at the end of the environment\r\n    - without this trick, two adjacent minipages cannot be arranged\r\n      horizontally side-by-side\r\n  - I asked Pedro to consider fixing this in ~org-latex-special-block~\r\n    - We probably want to introduce a list of special latex environments\r\n      that are sensitive to the final newline\r\n\r\n- we then moved to alternative typesetting system: typst\r\n  https:\/\/typst.app\/\r\n  https:\/\/oylenshpeegul.gitlab.io\/blog\/posts\/20250427\/\r\n  https:\/\/github.com\/jmpunkt\/ox-typst\r\n  - The main selling point of typst is that it is \/much faster\/ than\r\n    LaTeX (because of incremental compilation + rust)\r\n  - A couple of years ago someone proposed to include typst export\r\n    support to Org mode: https:\/\/list.orgmode.org\/orgmode\/87jzwjlovj.fsf@localhost\/\r\n  - At that time, typst just had it early alpha release, so I rejected the idea\r\n    - Considering our backwards compatibility policies, it is not the best idea to\r\n      add support to unstable\/new software\r\n  - At this time, typst is getting fairly popular, but still has some\r\n    issues and is still fairly young (by Emacs's standards, heh)\r\n    - For example, I heard that it has problems typesetting large documents\r\n    - Although, Zororg shared his experience writing 50 pages thesis\r\n      purely in typst\r\n      - \"... for me, it generates pdf within 1 second. For 500+ lines of 50 pages\"\r\n    - Pedro A. Aranda shared his prior bad experience with typst\r\n      - They tried to replicate latex + overleaf workflow for typst\r\n      - However, getting collaborative editing part proved to be\r\n        tricky (that's what unstable software sometimes do)\r\n\t- this might have nothing to do with compilation though\r\n\r\n- Rudy asked about the status of the WIP multi-page HTML export\r\n  - Unfortunately, it is something that have been sitting on my backlog\r\n    since last August\r\n  - Since that time I have much, much less time and is still struggling to\r\n    keep up with the inflow of the new bug reports, patches, and feature requests\r\n    (I can barely manage to, but anything extra is tricky)\r\n  - But that feature is important, so I need to do something to get things going there\r\n    one way or another\r\n    - So, I now did HOLD -> NEXT status switch for that project. It gotta be prioritized after waiting for so many months\r\n    - Since designing generic API for ox.el for multipage export remains tricky (I will need to dedicate more than several days in a row), I can at least attempt to get more\r\n      people involved into brainstorming and discussion\r\n      - In https:\/\/list.orgmode.org\/orgmode\/87tt4i1a2t.fsf@localhost\/,\r\n        I attempted to get the ox-hugo maintainer involved. ox-hugo\r\n        does support multi-page export (by essentially implementing it\r\n        for MD export, similar to how Orm Finnendahl, the author of\r\n        multipage export idea, implemented it for HTML export)\r\n\r\n- Rudy also asked about the status of async LaTeX preview by Karthink and Timothy\r\n  - The project is taking quite a lot of time, partially because\r\n    Timothy is extremely loaded IRL and because Karthink is now\r\n    developing gptel (enough said)\r\n    - As Karthink pointed, the original plan was to merge the branch back in 2023\r\n      - the deadline kept shifting since then\r\n  - The branch has actually been sent for the review quite a while\r\n    ago, but I gave comments mostly on Timothy's part. That ain't\r\n    happening unfortunately due to RL\u00a9\r\n  - So, the plan is to get to do what we can and first try to review\r\n    the parts written by Karthink without putting too much load on\r\n    him (in other words, slowly, and prioritizing the most important\r\n    parts)\r\n    - see https:\/\/list.orgmode.org\/orgmode\/87bjqr4g2f.fsf@localhost\/\r\n    - there are some backwards-incompatible changes for ob-latex\r\n      - but those are not as critical because ob-latex itself is buggy\r\n\tand we have no goal of keeping all the bugs at all costs :)\r\n  - Unfortunately, we cannot merge the branch as is\r\n    1. It has breaking changes that should be carefully considered\r\n    2. It does not come with the manual, with many instructions scattered\r\n       across blog posts, readmes, etc. This needs to be sorted out\r\n       - Rudy commented that citations did not have a good manual at\r\n         the time of merging\r\n\t - That's exactly the reason I am emphasizing to have the manual!!\r\n\t   We got enough headache with citations\r\n    3. I had some questions to specific design decisions and wanted to\r\n       make things maximally flexible in several areas\r\n\r\n- Corwin Brust asked about the advantages of using ox-hugo vs. hugo\r\n  itself (hugo supports Org markup natively)\r\n  - The advantages are similar to advantages of ox-pandoc\r\n  - Hugo has no way to honor Elisp customizations\/hooks\/advices\/custom\r\n    export config one can do for Org export: https:\/\/orgmode.org\/manual\/Advanced-Export-Configuration.html\r\n  - Hugo also cannot handle babel and code evaluation\r\n  - Advanced Elisp macros also cannot be done with hugo (one needs Emacs for those)\r\n\r\n- Jacob S. Gordon asked about using MathML during export\r\n  - I am not very familiar with MathML, except that it is\r\n    something used by ox-odt\r\n  - I did not touch this area except a single security fix we did\r\n    for ~org-latex-to-mathml-convert-command~\r\n\r\n- Corwin Brust shared his work on re-implementing Org table\r\n  formula parser and specifically regexps used there\r\n  https:\/\/cgit.git.savannah.gnu.org\/cgit\/dungeon.git\/tree\/src\/ox-ox-test.el\r\n  https:\/\/cgit.git.savannah.gnu.org\/cgit\/dungeon.git\/tree\/src\/ox-ox.el\r\n  - Contributing such improvements will be *very* welcome\r\n  - org-table is one of the legacy libraries I myself (despite being the maintainer)\r\n    is not familiar with\r\n    - As a result, I have limited ability to fix things (let alone add new features)\r\n      to spreadsheet functionality\r\n    - Even the fixes\/improvements took a lot of time because org-table's global state\r\n      often makes it difficult to keep things working after the most innocent changes\r\n  - It would be really nice is someone worked on org-table code to make it more\r\n    modular and maintainable\r\n  - For example one can start by splitting ~org-table-eval-formula~ into smaller pieces\r\n    and clearly documenting the process of formula reference expansion\r\n  - converting table formula regexps to rx notation, as Corwin did in\r\n    the above links would also be helpful\r\n\r\n- somebody asked how global id: links in Org mode are searched (more\r\n  specifically, where they are searched)\r\n  - Org mode uses a combination of pre-defined list of files + all Org\r\n    buffers to search id: links in and dynamic cache that is\r\n    periodically saved to disk and contains links that have been\r\n    interactively created\/references during Emacs session (links\r\n    created by manually typing :ID: <id> will not be auto-tracked\r\n    unless referenced via org-store-link later)\r\n  - by default, Org searches all agenda files, archives, and\r\n    ~org-agenda-text-search-extra-files~, but this can be customized.\r\n    See ~org-id-extra-files~.\r\n  - The docstring of ~org-id-extra-files~ also details where Org\r\n    searches the id: links\r\n\r\n- around this time or partially before Org table discussion we went on discussing\r\n  LaTeX formula alignment in HTML pages and LaTeX previews\r\n  - most of the rendering systems (except Wikipedia's) do it wrong\r\n    - in many cases formula baseline is not well-aligned with the rest of the text\r\n    - ... which gets worse when you zoom-in\/out the HTML page\r\n  - the async latex preview branch does it much better than anything out there\r\n    (credit to Timothy for the implementation)\r\n    - Rudy tried to install the async preview branch live with screen\r\n      sharing and see how the LaTeX formulas are rendered live and in\r\n      HTML export\r\n    - Rudy has Mac machine, and we ran into a couple of svg library\r\n      problems (documented in FAQ, related to awkward Mac's\r\n      packaging), but eventually solved them\r\n      https:\/\/abode.karthinks.com\/org-latex-preview\/#orga2efcf6\r\n      - we had a strange issue with SVG previews being oversized\r\n    - We have managed to get an order of magnitude faster previews (~30\r\n      seconds for thousands of previews in the document) compared to\r\n      Org release branch (though Karthink says that it should be no\r\n      longer than 14 seconds, and that Rudy has some weird issues and\r\n      things are too slow on his machine)\r\n    - then we went on and looked into live latex preview with complex tikz \r\n      diagram being updated instantly as we were editing the latex sources\r\n    - when we made syntax errors, those were highlighted (and there\r\n      were errors in the example tikz diagram we checked, to Rudy's\r\n      surprise)\r\n      - that happened on mouse-over, but Karthink also shared a code\r\n\tfor bind error popup on C-c C-c\r\n\t#+begin_src emacs-lisp\r\n\t  (defun my\/org-latex-preview-show-error ()\r\n\t    (display-local-help t))\r\n\t  (add-hook 'org-ctrl-c-ctrl-c-final-hook\r\n\t            #'my\/org-latex-preview-show-error -10)\r\n\t#+end_src\r\n\t- we also discussed ways to integrade the error indicator into something like\r\n\t  flycheck\r\n\t  - I hope that we can eventually make org-lint library\r\n            integrate with flycheck (and be generally faster)\r\n\t  - then, it will be a natural fit for auto-indication of\r\n            problems like with latex previews\r\n      - Karthink also accidentally shared a similar hook, but for\r\n        looking through latex preview logs (will also work on main)\r\n\t#+begin_src emacs-lisp\r\n\t  ;; Custom DWIM functionality for `org-ctrl-c-ctrl-c'\r\n\t  (use-package org\r\n\t    :after (org ox-latex org-latex-preview)\r\n\t    :config\r\n\t    (defvar my\/org-output-buffers\r\n\t      '(\"*Org Preview LaTeX Output*\"\r\n\t        \"*Org Preview Convert Output*\"\r\n\t        \"*Org PDF LaTeX Output*\"\r\n\t        \"*Org Preview Preamble Precompilation*\"\r\n\t        \"*Org LaTeX Precompilation*\"))\r\n\t    (defun my\/org-output-next-buffer ()\r\n\t      \"Cycle through Org output buffers\"\r\n\t      (let* ((org-buffer (current-buffer))\r\n\t             (bufnames\r\n\t              (cl-sort\r\n\t               (cl-remove-if-not\r\n\t                #'buffer-live-p\r\n\t                (cl-mapcar #'get-buffer my\/org-output-buffers))\r\n\t               #'> :key #'buffer-modified-tick))\r\n\t             (next-output-buffer\r\n\t              (lambda () (interactive)\r\n\t                (setq bufnames\r\n\t                      (nconc (cdr bufnames) (list (car bufnames))))\r\n\t                (switch-to-buffer (car bufnames))))\r\n\t             (back-to-org\r\n\t              (lambda () (interactive)\r\n\t                (while (memq (current-buffer) bufnames)\r\n\t                  (quit-window))\r\n\t                (pop-to-buffer org-buffer))))\r\n\t        (when bufnames\r\n\t          (pop-to-buffer (car bufnames))\r\n\t          (set-transient-map\r\n\t           (define-keymap\r\n\t             \"C-c C-c\" next-output-buffer\r\n\t             \"<remap> <keyboard-quit>\" back-to-org)\r\n\t           (lambda () (eq (current-buffer) (car bufnames)))))))\r\n\t    (add-hook 'org-ctrl-c-ctrl-c-final-hook\r\n\t              #'my\/org-output-next-buffer 99))\r\n\t#+end_src\r\n    - (this is where some people in the chat got a bit too excited, up\r\n      to the point of posting NSFW memes; not posting those links here \ud83d\ude42)\r\n      - I am also not posting the huge amount of flattery dumped onto Karthink :)\r\n    - Karthink was still concerned about the degraded performance\r\n      though (by his standards!). So, we also tried to explore a bit\r\n      what might be the cause and tweaked a couple of internal-ish settings.\r\n      No luck live.\r\n    - ... so we moved on to trying the HTML export\r\n    - SVG-rendered latex formulas were indeed well-aligned on their\r\n      baseline with the normal text, even as we zoomed in\/out the page\r\n    - After some tweaking of CSS stylesheet, we even managed the SVG formulas\r\n      to respect dark\/light browser theme\r\n      - (it also worked for latex exported as PNG images)\r\n\r\n- We then talked about GNU project, licensing, and money in free software\r\n  - nat asked about why GNU license can't somehow force companies using free\r\n    software to pay some money back\r\n    - my personal answer is the following\r\n      - first, ethically, forcing to pay for libre software is against\r\n        the idea of \"libre\". Although this ethical consideration\r\n\tcan be challenged and, indeed, it has been challenged by others\r\n\tin the meetup. But there is other, more practical, consideration\r\n\t- of course, GPL does not prevent monetization, but that monetization\r\n\t  usually concerns some extra services (support, cloud services, etc), not\r\n\t  using the libre source code itself\r\n      - the current situation is that companies *do not want* to use\r\n\tfree software because of the copyleft that forces them to\r\n\topen their own code\r\n      - the whole thing about \"Open source\" vs. \"Libre software\"\r\n\tthat FSF pushes is caused by companies actively trying to\r\n\tsabotage copyleft and try to get open source code that does not\r\n\tenforce them to open their code, let alone paying for that open\r\n\tsource software\r\n      - this sabotage is also the reason why assigning copyright to\r\n        FSF (or other similar organizations) is necessary\r\n\t- by default (in most countries), if a company employee writes\r\n          GPL-licensed software, that GPL-licensed code belongs to the\r\n          company\r\n\t- such ownership does not prevent using that GPL-licensed software\r\n\t  freely, but what it does is transferring the right to sue\r\n          any GPL violations to the companies\r\n\t  - if GPL violations do happen, companies never sue with\r\n\t    effective nullification of the whole idea of copyleft\r\n\t  - see https:\/\/sfconservancy.org\/blog\/2021\/jun\/30\/who-should-own-foss-copyrights\/\r\n      - now imagine if we add payment to GPL license\r\n\t- companies already try to avoid GPL like fire. If we add more to it,\r\n\t  the situation with GPL adoption will only get worse.\r\n\t- of course, whether adding payment requirement will make things \/worse\/\r\n\t  is debatable. Maybe it will be about the same, but with great benefit\r\n\t  for GPL software. But ethical considerations will likely prevent\r\n\t  GPL changes like the proposed. And only FSF\/similar companies can practically\r\n\t  enforce such requirement in courts\r\n    - More generally, the problem with financing is indeed very real in\r\n      libre software world\r\n      - Bastien has been collecting some links on this topic in https:\/\/github.com\/bzg\/opensource-challenges?tab=readme-ov-file#business-models\r\n\r\n- Not everyone may know it, but Org mode is *not* a GNU project, even\r\n  though we practically try to follow all the ethical guidelines set by GNU\r\n  - In fact, for some time, I have been exploring the possibility for Org mode\r\n    to become an actual GNU project (just like TRAMP or Auctex)\r\n  - Note that Org mode being \"a part of Emacs\" does not mean that we\r\n    are subordinate of Emacs developers\r\n    - Similar to any other ELPA package, Emacs is free to distribute the source\r\n      code of any of the packages as a part of Emacs. Simply because\r\n      \/all\/ ELPA packages are GPL-compatible.\r\n    - But it does not put any authority of Emacs maintainers onto how\r\n      ELPA packages are developed and maintained. For example, GNU or Emacs devs\r\n      cannot prohibit using Github. They cannot prohibit advertising\r\n      proprietary software either.\r\n  - Despite not being a GNU package, Org is allowed to use savannah\r\n    for hosting, and we do use GNU mailing list hosting as our mailing\r\n    list server. What we do independently is website hosting (done by\r\n    Bastien), hosting an alternative mailing list UI (done by Kyle), and\r\n    hosting our CI infrastructure (done by me and Bastien on Sourcehut\r\n    via paid accounts)\r\n  - If Org does become a GNU project, we will be enforced to follow GNU\r\n    software guidelines\r\n    (https:\/\/www.gnu.org\/prep\/standards\/standards.html), including\r\n    1. New maintainers will have to be approved by GNU\r\n    2. Obligation not to reference proprietary software (we currently don't)\r\n    3. Obligation to have our home page at https:\/\/gnu.org\/software\/org-mode\r\n       (easy; a simple redirect to https:\/\/orgmode.org is acceptable)\r\n    4. Obligation not to refer to websites that use non-libre JS\r\n  - There are at least two potential consequences of these obligations\r\n    1. WORG will not be able to reference proprietary software or even\r\n       JS-based websites like reddit\/youtube\/github\r\n    2. We won't be able to accept donations via Liberapay, because Liberapay\r\n       only provides Paypal and Stripe as payment options - both require non-free JS\r\n       to do the payments\r\n  - The GNU's demand about payments is somewhat debatable though\r\n    - The ethically OK options available to do payments without running\r\n      non-free software are (1) crypto (well.. this one is just ok from GNU perspective);\r\n      (2) GNU Taler (only working recently and only in Switzerland)\r\n    - GNU itself suggest \"FSF working together fund\", which is,\r\n      awkwardly offering Paypal for payments (with a warning that it\r\n      requires running non-free JS). Although, admittedly, they do\r\n      allow card payments without running JS at all\r\n      - notably, FSF fund charges 10% fee. It is fine as it is also working as\r\n\tfiscal host and provides other services, but awkward when GNU\r\n        software is forced to use it\r\n\t- the only alternative is https:\/\/www.spi-inc.org\/ that charges 5%\r\n\t  but I have no clue about its reputation. (and they also offer Paypal...)\r\n  - Here, someone asked why FSF is not offering financial support to GNU maintainers\r\n    - The answer is simple - FSF is short on money by itself\r\n    - AFAIK, they had to lay off a number of people and the current FSF staff is\r\n      already overstretched. They have no ability to hire people they need\r\n      for necessary operations, let alone allocating money to support GNU package maintainers\r\n    - ... and yes, it was related to scandals with RMS, which did hit FSF pretty badly\r\n      - that said, people in the chat who worked with RMS shared their experience\r\n\tthat RMS is not a bad guy, especially within the context of free software\r\n\t- the fact that his reputation in the areas he has less knowledge affects FSF\r\n\t  is rather unfortunate side effect of how small communities work in our society\r\n\t  (community reputation is often tied to leader reputation,\r\n          even outside the community scope)\r\n\r\n- At the very end, we discussed a possibility to have this meetup twice a month\r\n  - I personally doubt that I can make it, given the amount of time I usually\r\n    spend to create meeting notes\r\n  - Crowin offered to help with the extra meetup time, possibly also to fit better\r\n    to non-european time zones.\r\n  - But we will need to figure if meeting notes can work\r\n  - (we are discussing this option further now via email)\r\n\r\n\r\nThe Org source of Pedro's presentation during the meetup:\r\n\r\n#+STARTUP: beamer\r\n#+LATEX_COMPILER: lualatex\r\n#+TITLE: feature\/all-tex-fonts\r\n#+SUBTITLE: Progress\r\n#+AUTHOR: Pedro A. Aranda Guti\u00e9rrez \\linebreak mailto:paaguti@gmail.com\r\n#+LANGUAGE: en\r\n#+MACRO: pause @@latex: \\pause@@\r\n#+LATEX_CLASS_OPTIONS: [presentation,11pt,t,aspectratio=169]\r\n#+LATEX_HEADER: \\renewcommand*\\familydefault{\\sfdefault}\r\n# +LATEX_HEADER: \\input{packages}\r\n#+BEAMER_THEME: Marburg\r\n#+OPTIONS: H:2 toc:t num:t\r\n\r\n\r\n* What's new?\r\n** What's new?\r\n- This is WIP: *things WILL break*\r\n- Relying on local variables and document options\r\n  - Maximum flexibility for the user. {{{pause}}}\r\n  - By providing a minimalist default you can complement with ~#+LATEX_HEADER:~ {{{pause}}}\r\n- Splitting the different configuration tasks into functions\r\n  - PDFLATEX -> WIP\r\n  - LUALATEX\/XELATEX:\r\n    - Plain FONTSPEC: same as last time\r\n    - BABEL: initial support\r\n    - POLYGLOSSIA: initial support\r\n\r\n** What's new?\r\n\r\n- Instead of guessing font management \/a posteriori\/, we proactively generate a\r\n  full configuration from document options for lua\/xelatex {{{pause}}}\r\n- Use ~#+LANGUAGE:~ for the language list\r\n- ~#+LATEX_MULTI_LANG:~ to derive the backend\r\n  1. ~babel~\r\n  1. ~polyglossia~\r\n  3. plain ~fontspec~ (if ~nil~) {{{pause}}}\r\n- We use short language names and Org translates them appropriately to long\r\n  names.\r\n  - Suitable for the multi-language package selected\r\n\r\n** Configuration for ~babel~\r\n# +BEAMER: \\framesubtitle{\\textcolor{red}{\\textbf{CAVEAT:}} Work in \\textbf{early} progress}\r\n\r\n# - Early stage, still some coding needed (!)\r\n- We start by defining ~#+LANGUAGE:~ and ~#+LATEX_MULTI_LANG:~\r\n  #+BEGIN_SRC org :results node :exports code\r\n    ,#+LANGUAGE: de,el\r\n    ,#+LATEX_COMPILER: lualatex\r\n    ,#+LATEX_MULTI_LANG: babel\r\n  #+END_SRC\r\n- draw font definitions from ~org-latex-babel-font-config~ only.\r\n\r\n** Configuration for ~polyglossia~\r\n\r\n- We start by defining ~#+LANGUAGE:~ and ~#+LATEX_MULTI_LANG:~\r\n  #+BEGIN_SRC org :results node :exports code\r\n    ,#+LANGUAGE: de,el-polyton\r\n    ,#+LATEX_COMPILER: lualatex\r\n    ,#+LATEX_MULTI_LANG: polyglossia\r\n  #+END_SRC\r\n- First language in the resulting language list is chosen as the main language\r\n  for the LaTeX export.\r\n- Font definitions drawn from ~org-latex-polyglossia-font-config~ and\r\n  ~org-latex-fontspec-config~\r\n\r\n* Demo\r\n** For the ~polyglossia~ demo\r\n\r\n- I'm using the following header options:\r\n  #+BEGIN_SRC org :results none :exports code\r\n    ,#+LANGUAGE: de,el-polyton\r\n    ,#+LATEX_CLASS: article\r\n    ,#+LATEX_CLASS_OPTIONS: [11pt,oneside,a4paper]\r\n    ,#+LATEX_COMPILER: lualatex\r\n    ,#+LATEX_MULTI_LANG: polyglossia\r\n  #+END_SRC\r\n- and the following font configuration in ~.dir-locals.el~\r\n  #+BEGIN_SRC elisp :results none :exports code\r\n    ((org-mode\r\n      . ((org-latex-fontspec-config\r\n          . ((\"main\" :font \"CMU Sans Serif\")))\r\n         (org-latex-polyglossia-font-config\r\n          . ((\"greek\" :font \"Noto Serif\" :props \"Script=Greek\"))))))\r\n  #+END_SRC\r\n\r\n* Next steps, discussion\r\n\r\n** This is a living development\r\n- My objectives:\r\n  - Cover all features people need:\r\n    - My documents are basically monolingual and can live with a ~fontspec~ only\r\n      configuration. {{{pause}}}\r\n  - Reduce the complexity of the code\r\n    - Making it more maintainable in the future {{{pause}}}\r\n- Test it if you have free cycles.\r\n  - I need \/your\/ feedback, your font setups will be better than mine.\r\n  - It's only a =git checkout= away if you are using =main=.{{{pause}}}\r\n- I'm on LuaLaTeX\r\n  - \/Please\/ send me MWEs with your (PDF)LaTeX font configurations.\r\n\r\n** Keeping package detection from ~#+LATEX_HEADER:~\r\n#+BEAMER: \\framesubtitle{Or not...}\r\n\r\n- The feature branch provides the same functionality\r\n  - on lualatex\/xelatex {{{pause}}}\r\n- You can continue to use ~#+LATEX_HEADER:~ for\r\n  - your font settings\r\n  - extra options using ~\\PassOptionsToPackage~ {{{pause}}}\r\n- We don't need the stacked functions with the string replacement stuff\r\n  - Hard to read and understand\r\n\r\n* Extras from the discussion\r\n** Controlling the =math=\r\n\r\n#+BEGIN_SRC elisp\r\n  ((org-mode .\r\n  \t   ((org-latex-fontspec-config .\r\n  \t\t\t\t       ((\"main\". (:font \"FreeSerif\"\r\n  \t\t\t\t\t\t\t:fallback ((\"emoji\" . \"Noto Color Emoji:mode=harf\")\r\n  \t\t\t\t\t\t\t\t   (\"han\"   . \"Noto Serif CJK JP:\")\r\n  \t\t\t\t\t\t\t\t   (\"kana\"  . \"Noto Serif CJK JP:\"))))\r\n  \t\t\t\t\t(\"sans\" . (:font \"FreeSans\"\r\n  \t\t\t\t\t\t\t :fallback ((\"emoji\" . \"Noto Color Emoji:mode=harf\")\r\n  \t\t\t\t\t\t\t\t    (\"han\"   . \"Noto Sans CJK JP:\")\r\n  \t\t\t\t\t\t\t\t    (\"kana\"  . \"Noto Sans CJK JP:\"))))\r\n  \t\t\t\t\t(\"math\" . (:font \"TeX Gyre Termes Math\"))\r\n  \t\t\t\t\t(\"mono\" . (:font \"Noto Sans Mono\"\r\n  \t\t\t\t\t\t\t :features (\"Scale=MatchLowercase\"))))))))\r\n\r\n#+END_SRC\r\n\r\n- From last month's meetup (see ZIP in mailing list)\r\n\r\n\r\n# local variables:\r\n# eval: (auto-fill-mode t)\r\n# spell-check-lang: \"en_GB\"\r\n# org-latex-fontspec-config: nil\r\n# End:\r\n\r\n\r\n:chat:\r\n[17:34] yantar92 is now the presenter\r\n[17:39] [yantar92 : MODERATOR]: The most recent Emacs News: https:\/\/sachachua.com\/blog\/2025\/06\/2025-06-09-emacs-news\/\r\n[17:44] [Obsidian : VIEWER]: Nice typing skills\r\n[17:46] [yantar92 : MODERATOR]: The official start is in 15 minutes\r\n[17:46] [yantar92 : MODERATOR]: we should have more people joining around that time\r\n[17:46] [Obsidian : VIEWER]: np. I just take obsidian nick\r\n[17:50] [Obsidian : VIEWER]: Iam switch to obsidian for neosilator reason. Want to see how actually people working in org.\r\n[17:52] [yantar92 : MODERATOR]: what is \"neosilator\"?\r\n[17:53] [Obsidian : VIEWER]: On russian neosilator means man who not mastered in something)\r\n[17:56] [Obsidian : VIEWER]: Google it like \u043d\u0435\u043e\u0441\u0438\u043b\u044f\u0442\u043e\u0440 \r\n[17:58] [Zororg : VIEWER]: wait, yantar not russian?\r\n[17:58] [Zororg : VIEWER]: Oh I thought name was like russia. Ihor Ra....\r\n[17:59] [Fade : VIEWER]: \ud83d\udc4b\r\n[17:59] [Lumi : VIEWER]: Heya\r\n[17:59] [Zororg : VIEWER]: hi fade, welcome \ud83d\ude0a\r\n[18:03] [Zororg : VIEWER]: I was recently trying typst. Imo it was so easy and I got hyped up for it. I hope ox-typst expands more.\r\n[18:04] Pedro A. Aranda is now the presenter, set by yantar92\r\n[18:10] [Matthew Page-Lieberman : VIEWER]: Can the people who are not presenting turn off their microphones?\r\n[18:10] [yantar92 : MODERATOR]: Done \ud83d\ude0a\r\n[18:15] [Rudy : VIEWER]: This is all Greek to me.\r\n[18:16] [yantar92 : MODERATOR]: if someone wants a different language we can request a change \r\n[18:16] [yantar92 : MODERATOR]: maybe we can break something \ud83d\ude01\r\n[18:18] [oylenshpeegul : VIEWER]: I might suggest a right-to-left language, but it looks justified anyway, so maybe it wouldn't make much difference.\r\n[18:19] [yantar92 : MODERATOR]: yeah\r\n[18:19] [yantar92 : MODERATOR]: can try https:\/\/tanzil.net\/download\/\r\n[18:19] [Jake : VIEWER]: I think a couple people  are activating their microphone without realizing it.\r\n[18:19] [yantar92 : MODERATOR]: yeah\r\n[18:21] [Fade : VIEWER]: this is very cool.\r\n[18:22] [Jacob S. Gordon : VIEWER]: Nice work! Slight tangent:\r\n\r\nI like the org-latex-fontspec-config, is the unicode-math font done in a similar way?\r\n[18:24] [Jacob S. Gordon : VIEWER]: Fallback is great too, thanks!\r\n[18:27] [yantar92 : MODERATOR]: About backwards compatibility: https:\/\/orgmode.org\/worg\/org-maintenance.html#guidelines\r\n[18:34] yantar92 is now the presenter, set by yantar92\r\n[18:35] Pedro A. Aranda is now the presenter, set by yantar92\r\n[18:36] yantar92 is now the presenter, set by yantar92\r\n[18:38] [oylenshpeegul : VIEWER]: I messed with typst a bit\r\n\r\nhttps:\/\/oylenshpeegul.gitlab.io\/blog\/posts\/20250427\/\r\n[18:39] [Zororg : VIEWER]: I wrote my thesis of about 50 pages\r\n[18:40] [yantar92 : MODERATOR]: https:\/\/github.com\/jmpunkt\/ox-typst\r\n[18:42] [Zororg : VIEWER]: Yes, I used ox-typst and wrote\r\n[18:42] [Zororg : VIEWER]: I had to embed lot of typst code tho, since ox-typst was not complete\r\n[18:44] [Rudy : VIEWER]: I would like to ask about the status of (1) the revamped LaTeX subsystem by Karthink and (2) the WIP multi-page HTML export.\r\n[18:47] [Zororg : VIEWER]: Maybe your issue can be reproduced. \r\n\r\nBut for me, it generates pdf within 1 second. For 500+ lines of 50 pages\r\n[18:49] [Zororg : VIEWER]: yea, what i believe more is that typst syntax is similar to org\r\nLooks more like yaml\r\n\r\n#image((\"file.png\", width: 80%), caption: [title], ..) \r\n[18:50] [Zororg : VIEWER]: ^\r\n[18:59] [Rudy : VIEWER]: Last year, it was estimated that this work would be shipped at around Christmas.  Do we have a new estimate now?\r\n[19:00] [Rudy : VIEWER]: Sounds like the project is stuck, if Timothy is needed but moved on. Oops! \r\n[19:00] [Rudy : VIEWER]: 2023?  Ha-ha.\r\n[19:01] [Rudy : VIEWER]: Cannot we merge it into main and take it from there?\r\n[19:02] [Rudy : VIEWER]: I asked because citations also did not have a perfect manual.\r\n[19:02] [Rudy : VIEWER]: [They still do not.]\r\n[19:02] [Rudy : VIEWER]: So, about 2030.  Optimistically. \ud83d\ude0a\r\n[19:06] [Zororg : VIEWER]: karthink nice to hear kannada lol.\r\nI'm from bangalore cheers \ud83d\ude09\r\n[19:23] [Corwin Brust : VIEWER]: I think hugo doesn't require any js what so ever.  there are many themes. \r\n[19:23] [Corwin Brust : VIEWER]: am i wrong?  i think it is a ruby program\r\n[19:25] [Corwin Brust : VIEWER]: Whoops.  No.  It's Go.\r\n[19:26] [Corwin Brust : VIEWER]: I have been using hugo directly to read org-mode files, without using ox-hugo at all.  \r\n\r\nCan you talk about advantages of using ox-hugo?\r\n[19:27] [Rudy : VIEWER]: Per the docs, Hugo supports MathJax and KaTeX, both JS.\r\n[19:27] [Corwin Brust : VIEWER]: ohhhh!\r\n[19:27] [Corwin Brust : VIEWER]: thank you.\r\n[19:28] [Corwin Brust : VIEWER]: Nice!  Makes sense!  Right now II don't have that but it sounds great.\r\n[19:30] [Jacob S. Gordon : VIEWER]: Has anyone tried \/ had success with using MathML?\r\n[19:33] [Jacob S. Gordon : VIEWER]: Not necessarily! In HTML\r\n[19:33] [Jacob S. Gordon : VIEWER]: Sorry no mic, will try to have one next time\r\n[19:35] [Jacob S. Gordon : VIEWER]: Thanks! I'll take a closer look\r\n[19:42] [Corwin Brust : VIEWER]: https:\/\/cgit.git.savannah.gnu.org\/cgit\/dungeon.git\/tree\/src\/ox-ox-test.el\r\n[19:46] [Corwin Brust : VIEWER]: https:\/\/cgit.git.savannah.gnu.org\/cgit\/dungeon.git\/tree\/src\/ox-ox.el\r\n[19:48] Rudy is now the presenter, set by yantar92\r\n[19:49] yantar92 is now the presenter\r\n[19:49] [Sacha Chua : VIEWER]: I'm here\r\n[19:50] [Sacha Chua : VIEWER]: oh yeah, I should change that setting\r\n[19:50] [Sacha Chua : VIEWER]: let me go do that\r\n[19:50] Rudy is now the presenter, set by yantar92\r\n[19:50] [Sacha Chua : VIEWER]: updated\r\n[19:50] [yantar92 : MODERATOR]: thanks!\r\n[19:51] [Sacha Chua : VIEWER]: ha =)\r\n[19:57] [Corwin Brust : VIEWER]: I also am usually on the release branch, fwiw\r\n[19:59] [Corwin Brust : VIEWER]: There's a NSFW meme I really want to use here.  Wow!\r\n[20:00] [Jacob S. Gordon : VIEWER]: this is awesome\r\n[20:05] [Corwin Brust : VIEWER]: <redacted link to NSFW meme>\r\n[20:05] [Corwin Brust : VIEWER]: NSFW ^\r\n[20:13] [Corwin Brust : VIEWER]: ha!\r\n[20:28] [Corwin Brust : VIEWER]: \ud83d\udc4f\ud83d\udc4f\ud83d\udc4f\r\n[20:50] [Sacha Chua : VIEWER]: gotta head off, see y'all!\r\n[20:50] [Jacob S. Gordon : VIEWER]: I have to run, thanks for the discussion!\r\n[20:53] [karthink : VIEWER]: This message was deleted by karthink\r\n[21:10] [karthink : VIEWER]: https:\/\/paste.karthinks.com\/eece0f9c-show-latex-errors.html\r\n[21:12] [karthink : VIEWER]: https:\/\/paste.karthinks.com\/c9773599-show-latex-errors-2.html\r\n[21:12] [Corwin Brust : VIEWER]: \ud83c\udfb5 love it!\r\n[21:42] [nat : VIEWER]: I have a question:\r\nIf the GNU license is free as in libre, not money, why it does not include a clause to make companies making money out of using free software pay back even a very very very small percentage. When the profit is higher the percentage is higher. For any personal or educational use, it will be totally free.\r\n[21:45] [Corwin Brust : VIEWER]: He isn't a bad guy\r\n[21:45] [Corwin Brust : VIEWER]: he says stuff\r\n[21:45] [Corwin Brust : VIEWER]: and and turns people off\r\n[21:46] [Corwin Brust : VIEWER]: preach\r\n[21:46] [j8 : VIEWER]: i second this.  I worked for rms a little bit.  he isn't a bad guy\r\n[21:47] [yantar92 : MODERATOR]: auctex is a gnu project\r\n[21:47] [yantar92 : MODERATOR]: https:\/\/www.gnu.org\/software\/auctex\/\r\n[21:48] [Corwin Brust : VIEWER]: Gotcha.  That's one of the most sensitive pieces of information that is on any shared VM we have.\r\n[21:49] [nat : VIEWER]: What is the difference of org being a gnu project ? is it some persones signature needed ?\r\n[21:49] [nat : VIEWER]: that is all ? or is there something else ?\r\n[21:50] [Rudy : VIEWER]: EMMS is also a GNU project \/and\/ an Emacs package.\r\n[21:51] [Corwin Brust : VIEWER]: GNU is a project to create a free software only os\r\n[21:51] [Corwin Brust : VIEWER]: packages are anything that is installable within that\r\n[21:51] [nat : VIEWER]: no\r\n[21:51] [Corwin Brust : VIEWER]: It's tricky because the frame of reference for most users has changed since the 80s when this paradime was created\r\n[21:51] [nat : VIEWER]: it is free as in libre\r\n[21:52] [nat : VIEWER]: not free money\r\n[21:52] [nat : VIEWER]: I did not get it \r\n[21:52] [Corwin Brust : VIEWER]: When RMS created GNU linux didn't exist.  We now think about GNU as coming with a \"distro\" which wasn't a thing when GNU started out.\r\n[21:52] [nat : VIEWER]: can you please repeat ?\r\n[21:53] yantar92 is now the presenter\r\n[21:53] [nat : VIEWER]: If the GNU license is free as in libre, not money, why it does not include a clause to make companies making money out of using free software pay back even a very very very small percentage. When the profit is higher the percentage is higher. For any personal or educational use, it will be totally free.\r\n[21:54] [nat : VIEWER]: no no\r\n[21:54] [nat : VIEWER]: exactly\r\n[21:54] [nat : VIEWER]: thanks Ihor\r\n[21:54] [nat : VIEWER]: it is etheical\r\n[21:54] [nat : VIEWER]: no no no \r\n[21:54] [nat : VIEWER]: I disagree\r\n[21:55] [Corwin Brust : VIEWER]: \ud83d\udc4f\r\n[21:55] [nat : VIEWER]: it is totally ethical\r\n[21:55] [nat : VIEWER]: no no no\r\n[21:55] [Corwin Brust : VIEWER]: \ud83d\udc4f\ud83d\udc4f\ud83d\udc4f\r\n[21:55] [nat : VIEWER]: everybody agrees\r\n[21:55] [nat : VIEWER]: that it is ethical\r\n[21:55] [Corwin Brust : VIEWER]: It's a great debate!  I agree with Yantar (so far!)\r\n[21:55] [nat : VIEWER]: GPL does not prevent you from making money\r\n[21:55] [nat : VIEWER]: out of it\r\n[21:56] [nat : VIEWER]: I totally agree with you\r\n[21:56] [nat : VIEWER]: but making money is totally ethical\r\n[21:56] [nat : VIEWER]: from a GPL POV\r\n[21:57] [karthink : VIEWER]: Ihor is saying that companies will not use free software if they have to pay a percent of their profit in return\r\n[21:57] [karthink : VIEWER]: So it doesn't matter if GNU thinks it's ethical\r\n[21:58] [nat : VIEWER]: @kathink even if it is a 0.00001%\r\n[21:58] [yantar92 : MODERATOR]: yup\r\n[21:58] [nat : VIEWER]: it does not impact them\r\n[21:58] [karthink : VIEWER]: This is generally not how they think\r\n[21:58] [nat : VIEWER]: but it is a big help for free software\r\n[21:58] [nat : VIEWER]: Ihor it is just0.000001%\r\n[21:59] [karthink : VIEWER]: Companies avoid GPLv3 code like the plague\r\n[21:59] [nat : VIEWER]: but they will have to pay much more for other softwares\r\n[21:59] [nat : VIEWER]: it is just 0.00000001%\r\n[21:59] [nat : VIEWER]: basically nothing\r\n[22:00] [nat : VIEWER]: and if the profit are higher\r\n[22:00] [karthink : VIEWER]: The part of GPLv3 they disagree with is having to share what they build using it\r\n[22:00] [nat : VIEWER]: the % became higher\r\n[22:00] [karthink : VIEWER]: So the money is irrelevant\r\n[22:00] [Corwin Brust : VIEWER]: +1\r\n[22:00] [karthink : VIEWER]: What they build with it is their moat against their competitors\r\n[22:01] [karthink : VIEWER]: So they don't want to release it\r\n[22:01] [Corwin Brust : VIEWER]: If someone's point is to have a technology nobody else does there is not a good way to compromise that with the principles of free software.\r\n[22:02] [Corwin Brust : VIEWER]: Even removing monel it self likely would not fix it.  it is a motive conflict.\r\n[22:02] [j8 : VIEWER]: Like if I use emacs to create some software do I have to release the created software under GPLv3?\r\n[22:02] [nat : VIEWER]: companies dont have to share anything\r\n[22:02] [j8 : VIEWER]: I'm good.  Thanks for your time \ud83d\ude0a\r\n[22:03] [nat : VIEWER]: I just hope if you can take tmie to think abou the idea\r\n[22:03] [nat : VIEWER]: not now\r\n[22:03] [nat : VIEWER]: but later\r\n[22:03] [Corwin Brust : VIEWER]: i will!\r\n[22:03] [nat : VIEWER]: Thank you all\r\n[22:03] [Corwin Brust : VIEWER]: \ud83d\udc97\r\n[22:03] [karthink : VIEWER]: Thanks for the meetup Ihor\r\n[22:04] [nat : VIEWER]: because everyone needs to make a liveing\r\n[22:04] [nat : VIEWER]: Thanks Ihor for your time\r\nIhor\r\n22:04\r\nReply to message 164\r\none more thing\r\nis it possible to make the meetup twice a month ?\r\n22:04\r\n2 shorter better than one longer ?\r\nReply to message 167\r\neveryone is leaving early\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n\r\n","subject":"[BLOG] #19 [[bbb:OrgMeetup]] on Wed, June 11, 19:00 UTC+3"},{"date":"2025-07-04T14:57:06.741Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/855xg8f2xl.fsf@yahoo.com.ar","message-id":"855xg8f2xl.fsf@yahoo.com.ar","config":false,"refs-count":5,"username":"Diego Ezequiel Vommaro","references":["855xg8f2xl.fsf.ref@yahoo.com.ar"],"related-refs":["855xg8f2xl.fsf@yahoo.com.ar"],"from":"diego_vommaro@yahoo.com.ar","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Given timestamp with repeater, then it gets broken when it is manually updated [9.6.15 (release_9.6.15 @ \/usr\/share\/emacs\/29.3\/lisp\/org\/)]"},{"date":"2025-06-15T15:18:20.420Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87msa96nnr.fsf@7d.nz","message-id":"87msa96nnr.fsf@7d.nz","config":false,"refs-count":9,"username":"Phil Estival","references":["87ikq9qpcc.fsf@localhost","875xmq31vr.fsf@localhost","d693e368-5823-48bd-8f8b-c8aa9b18b480@7d.nz","87a5bps4l1.fsf@localhost","646f7d12-a3d1-4a7c-83e2-5eecd7ca6817@7d.nz","87seqrh3wl.fsf@localhost","a934b93f-eff2-4f2a-9c71-8815ede5f481@7d.nz","87o6vrkt9k.fsf@localhost","2c80ecf8-e114-45fd-8116-49ce0f975070@7d.nz","87sel7mfjl.fsf@7d.nz","87r03zcgzu.fsf@localhost"],"related-refs":["87msa96nnr.fsf@7d.nz"],"from":"pe@7d.nz","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87msa96nnr.fsf@7d.nz","source-id":"emacs-orgmode@gnu.org","patch-body":"From e27f8231c2f97e6f7f84b6acb793eec7060b8396 Mon Sep 17 00:00:00 2001\r\nFrom: Phil Estival <pe@7d.nz>\r\nDate: Wed, 13 June 2025 17:00:00 +0200\r\nSubject: [PATCH 01\/08] ob-sql: add session support\r\n\r\nlisp\/ob-sql.el: add session support to ob-sql\r\n\r\n* ob-sql.el: declare the maintainer of the following changes\r\n\r\n---\r\n\r\ndiff --git a\/lisp\/ob-sql.el b\/lisp\/ob-sql.el\r\nindex 14ca6bc48..caee4502a 100644\r\n--- a\/lisp\/ob-sql.el\r\n+++ b\/lisp\/ob-sql.el\r\n@@ -4,5 +4,6 @@\r\n\r\n ;; Author: Eric Schulte\r\n ;; Maintainer: Daniel Kraus <daniel@kraus.my>\r\n+;; Maintainer: Philippe Estival <pe@7d.nz>\r\n ;; Keywords: literate programming, reproducible research\r\n ;; URL: https:\/\/orgmode.org\r\n","subject":"Re: [PATCH] ob-sql: session"},{"date":"2025-06-13T05:20:53.759Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/75059a24-4e56-4b9d-ab71-1c4db00db1b7@gmail.com","message-id":"75059a24-4e56-4b9d-ab71-1c4db00db1b7@gmail.com","config":false,"refs-count":1,"username":"martinoidar","related-refs":["75059a24-4e56-4b9d-ab71-1c4db00db1b7@gmail.com"],"from":"martinoidar@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Variable in python org-babel sessions cannot be named =f= [9.7.11 (release_9.7.11 @ \/usr\/share\/emacs\/30.1\/lisp\/org\/)]"},{"date":"2025-06-12T07:31:35.206Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2ikl1zadj.fsf@ego.team","message-id":"m2ikl1zadj.fsf@ego.team","config":false,"refs-count":1,"username":"YE","related-refs":["m2ikl1zadj.fsf@ego.team"],"from":"yet@ego.team","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-element--list-struct: Tab width in Org files must be 8, not 4 [9.7.11 (release_9.7.11 @ \/Applications\/MacPorts\/Emacs.app\/Contents\/Resources\/lisp\/org\/)]"},{"date":"2025-06-12T06:25:46.200Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2bjquglnc.fsf@gmail.com","message-id":"m2bjquglnc.fsf@gmail.com","config":false,"refs-count":3,"username":"Georges Dupret","related-refs":["m2bjquglnc.fsf@gmail.com"],"from":"georges.dupret@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-element--cache: Org parser error [9.7.11 (release_9.7.11 @ \/Applications\/Emacs.app\/Contents\/Resources\/lisp\/org\/)]"},{"date":"2025-06-10T18:25:49.121Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8734c7tq38.fsf@localhost","message-id":"8734c7tq38.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["87v7qnc4o5.fsf@localhost"],"related-refs":["8734c7tq38.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nA bit late (the next meetup is tomorrow), but I managed to finish the\r\nnotes now.\r\n\r\nTL;DR: latex export for non-English org documents (WIP); iOS apps for\r\nOrg; WORG policy about proprietary apps (needs discussion); Emacs on Android\r\nand widgets; table-like agenda line format; presentations during the\r\nmeetup (feel free); future updates of WORG pages about Org capture;\r\nnew approach to literal config; radio buttons in Org; self-deploying\r\nnix-based modules Emacs config from niklauz; Org mode refactoring update;\r\ntimezones in timestamps update; interaction fiction tutorial for Org;\r\ngptel + Org\r\n\r\n\r\n- As usual, we started from the latest Emacs News\r\n  https:\/\/sachachua.com\/blog\/2025\/05\/2025-05-12-emacs-news\/\r\n\r\n- Pedro A. Aranda made a presentation\r\n  - He showcased the new ox-latex feature he is currently working on\r\n    The new feature is introducing automatic font configuration\r\n    for lualatex and xelatex export\r\n    - Rather than forcing users to configure each font manually in order to\r\n      export non-Latin Org documents, we want to provide some defaults\r\n      to configure UTF8 export automatically\r\n    - Ideally, any given org document containing Cyrillic,\r\n      right-to-left, CJK, etc. scripts should export to PDF by default,\r\n      without needed any extra config\r\n    - Mailing list discussion\r\n      https:\/\/list.orgmode.org\/orgmode\/87semr869p.fsf@localhost\/\r\n      https:\/\/list.orgmode.org\/orgmode\/df48f6d0-6240-4545-aa19-5c95fd0f6230@gmail.com\/\r\n    - Pedro got some scripts working using some toy examples, but we will need help from\r\n      the users who know the languages for better testing\r\n    - Pedro's slides: https:\/\/list.orgmode.org\/orgmode\/CAO48Bk-hujcZDwrmPuqjNVORY8E2GP+98dBbqbWEAkdWMr03Bg@mail.gmail.com\/\r\n\r\n- We then moved to various mobile apps that can open .org files and\r\n  implement some Org's functionality (e.g. capture templates)\r\n  - The discussion mostly focused on iOS apps\r\n  - Unfortunately, there are very few apps for iOS that do not have closed source\r\n    - Orgro (and several browser based apps: Org Note and Organice)\r\n  - The more popular ones (according to people involved in the discussion)\r\n    are several paid xenodium's apps\r\n    - It uses capture templates and allow storing current GPS location\r\n      right in the property drawer. Neat.\r\n      #+begin_src org\r\n\t,* [2025-05-14 Wed 16:45] @ WorldClass MegaMall\r\n\t:PROPERTIES:\r\n\t:LATITUDE: 44.XXXX\r\n\t:LONGITUDE: 36.XXXX\r\n\t:WEATHER_TEMPERATURE: 62.4\u00b0F\r\n\t:WEATHER_CONDITION: Mostly Clear\r\n\t:WEATHER_SYMBOL: sun.max\r\n\t:END:\r\n      #+end_src\r\n    - Apparently, beorg (also paid) implements scripting in Scheme\r\n      but that's a bit awkward for users used to Elisp in Emacs\r\n\r\n- Note that https:\/\/orgmode.org\/tools.html page intentionally does not list\r\n  closed source apps, following GNU package requirements that forbid us to\r\n  encourage people using non-Libre software\r\n  - Christian asked whether we can relax the requirement in WORG\r\n    (which is community-driven and specifically aims to be more relaxed)\r\n    - I'd say yes, especially if we mention libre alternatives, but\r\n      I am not 100% sure. RMS certainly disagrees (that a quote in a\r\n      discussion about WORG):\r\n      : ... pointing to websites that require nonfree software is pressure to\r\n      : run nonfree software.  \"If you want to follow this discussion, you\r\n      : must run this nonfree program.\"  That influence devalues the goal of\r\n      : freedom.  It also excludes those who refuse to run nonfree software.\r\n      : \r\n      : Pleaase look for a workaround so you can avoid those references.\r\n    - basically, we may want to discuss this with more people on the list\r\n\r\n- As Emacs itself can now run on mobile (well, on Android), we further discussed\r\n  about using Emacs + Org mode directly\r\n  - niklauz suggested that transient can somehow be expanded to provide touch screen\r\n    experience\r\n    - (that's just an idea though)\r\n  - I remembered https:\/\/www.youtube.com\/watch?v=n-AfvuV-bYo\r\n    where karthink uses a nice sidebar with buttons - something that might\r\n    as well be useful for mobile UI\r\n    - karthink commented that those are just Emacs widgets from\r\n      built-in widget.el (docs: [[info:widget#Top][widget#Top]])\r\n\r\n- Matthew Page-Lieberman asked about the layout of my Org agenda views\r\n  #+begin_example\r\n    Day-agenda (W23):\r\n    Sunday        8 June 2025\r\n                  OrgMeetup[T]:  [    ] 2w\u21b0 +1.0x     [announce on mastodon] NEXT [#A] Schedule another Org meetup                                                     :COMMON:@home:emacsdev::\r\n    ,* 22 d. ago  OrgMeetup[T]:  [0:10]      +1.0x     DOING [#A] Ihor Radchenko [ML:Org mode] (2025) #18 [[bbb:OrgMeetup]] on Wed, May 14, 19:00 UTC+3    :COMMON:@home:emacsdev::BOOKMARK:misc:email:\r\n    ,* 20 d. ago  Emacs-dev[FR]: [    ]      +1.0x     [followup] WAITING Ihor Radchenko [ML:Org mode] (2025) Re: [PATCH v2] ox-texinfo: Preserve source block language fields during export :COMMON:@home:emacsdev:feature::BOOKMARK:misc:email:\r\n    ,* 20 d. ago  Emacs-dev[FR]: [    ]      +1.0x     [followup] WAITING Ihor Radchenko [ML:Org mode] (2025) Re: [PATCH] Use full timestamp in todo-list sorts :COMMON:@home:emacsdev:feature::BOOKMARK:misc:email:\r\n    ,* 20 d. ago  Emacs-dev[Mod: [    ]      +1.0x     WAITING Ihor Radchenko [ML:Org mode] (2025) Re: [BUG?] in pcomplete???           :COMMON:@home:emacsdev:maintenance::BOOKMARK:misc:email:\r\n  #+end_example\r\n  - I make use of ~org-agenda-prefix-format~ to archieve the above layout, assigning fixed width\r\n    to various task line components\r\n    - See the docstring of ~org-agenda-prefix-format~\r\n    - For my specific setup, I use a custom format function (=%(my-custom-function)=) that\r\n      does the alignment via ~format~ (which see)\r\n    - https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#agenda\r\n\r\n- niklauz asked if presenting during the meetup needs to be announced in advance\r\n  - Anyone if free to present without advance warning\r\n  - Of course, you can also announce presentation in advance; but\r\n    that's, again, not mandatory\r\n\r\n- kickingvegas hinted his interest to update WORG pages about Org capture system\r\n  - WORG is free to contribute. It is Org wiki, and we always welcome more improvements there by anyone; no copyright assignment necessary\r\n  - We also have a dedicated maintainer for WORG since recently: Christian Moe\r\n    https:\/\/list.orgmode.org\/878qn3h98b.fsf@christianmoe.com\/T\/#me3cbb275768b8c871f47c63906aea95b5531b9cc\r\n    - Christian can be contacted on mastodon, in addition to the mailing list https:\/\/toot.si\/@noctuaminervae\r\n      - also see https:\/\/orgmode.org\/worg\/org-maintenance.html#web-presense-maintainers\r\n\r\n- NP shared his recent post of Org mailing list\r\n  https:\/\/lists.gnu.org\/archive\/html\/emacs-orgmode\/2025-04\/msg00350.html\r\n  - He has an idea to create a new approach to literal configuration,\r\n    but aimed at both entry level users and more advanced users\r\n  - We had a long voice discussion about the idea, because I did not fully get it from\r\n    the email itself\r\n    - Here is an example of a portion in the proposed literal configuration\r\n      #+begin_example\r\n\t,**** auto-save-interval\r\n\tNumber of input events (keystrokes\/characters typed) between auto-saves.\r\n\t- [ ] after 300 events (default)\r\n\t- [X] after 1000 events\r\n\t,#+begin_src emacs-lisp\r\n\t  (setq auto-save-interval 1000)\r\n\t,#+end_src\r\n\t- [  ] disable auto-saving due to number of characters typed\r\n\t,#+begin_src emacs-lisp\r\n\t  (setq auto-save-interval 0)\r\n\t,#+end_src\r\n      #+end_example\r\n    - The idea is providing a library for Emacs configuration that can be\r\n      used a little bit like Emacs customization interface.\r\n      Similar to Emacs customization, users can switch between different options\r\n      simply by checking\/unchecking items\r\n      However, unlike the Emacs customization, there is no limitation that config\r\n      is just for setting variables. And the whole thing is an Org file that can be edited\r\n      freely.\r\n      - New users will just click around checkboxes\r\n\tenabling\/disabling the corresponding src block snippets\r\n\t- there needs to be some helper code that can handle this and\r\n\t  produce Emacs config that only corresponds to checked items\r\n\t  - Sacha Chua quickly prototyped a demo to make checkboxes work\r\n\t    https:\/\/gist.githubusercontent.com\/sachac\/5eeac2c5b58802b1b4de7ed2bf567681\/raw\/bcf8cd76aa7aea92f5eb13fc24a9d8e20bb59744\/test.org\r\n      - More advanced users can directly edit the src blocks\r\n      - Power users can just copy paste into init.el :)\r\n    - The proposed configuration is proposed to be curated\r\n      - My main comment to this idea is that such configuration\r\n\twill quickly overgrow and thus can scare off new users\r\n      - Rather than having everything in the same file, it may be a good\r\n\tidea to split the configuration into something akin Spacemacs layers\r\n\tor Doom's modules, so that there is some \"top level\" file\r\n\twhere groups of features can be enabled\/disabled together\r\n\t- Interested users can follow a link to each individual \"layer\"\r\n\t  and explore the actual code and individual options\r\n\r\n- Sacha Chua asked about toggling radio buttons in headings\r\n  - it is not possible\r\n  - the notion of radio buttons is only present in checklist items\r\n      \r\n- niklauz later presented his configuration system\r\n  that does not only build Emacs configuration, but the whole system\r\n  setup (Nix)\r\n  https:\/\/rapport-org.gitlab.io\/emacs\/\r\n  - (we had some technical issues before niklauz was able to share his screen)\r\n  - niklauz uses the idea with setting shebang for an Org file to make it executable\r\n    - he formats the top section in such a way that \"running\" an Org file\r\n      initialized nix environment appropriate Emacs installation and\r\n      other necessary programs (something akin guix-home)\r\n    - later, the same file is tangled to deploy Emacs configuration on\r\n      the same nix system\r\n  - his setup makes use of a defcustom to allow enabling\/disabling various\r\n    configuration components (again, similar idea to Doom's modules\r\n    and Spacemacs layers, but implemented differently)\r\n\r\n- karthink asked about the status of Org mode refactoring in the last two months\r\n  - the answer is that it is at the same point as it was at the end of\r\n    summer (I did not touch it since that time)\r\n  - my current job only allowed me barely enough time to keep up with\r\n    bug reports and patches. In fact, at the time of the meetup I only\r\n    just managed to finish the backlog all the way since August last year\r\n    - Yeah, it is that bad. I kind of miss the time I was working on\r\n      Org full time, but that was not financially sustainable. So,\r\n      alas - the progress is much slower now\r\n\r\n- niklauz also asked about another important feature we should eventually have:\r\n  timezone support in timestamps\r\n  - we recently got a voluteer willing to work on it:\r\n    https:\/\/list.orgmode.org\/orgmode\/m2zffjwlyy.fsf@cao.sh\/\r\n    - hope that the enthusiasm will result in progress\r\n\r\n- I then steered into my recent musings with LLMs\r\n  - I have been toying around with an idea to create an interactive fiction\r\n    that will serve as Org mode tutorial. Not very seriously, but the idea\r\n    is actually promising\r\n  - niklauz shared some potentially relevant blog posts and packages:\r\n    https:\/\/blog.tendollaradventure.com\/automating-story-logic-with-llms\/\r\n    https:\/\/melpa.org\/#\/org-if\r\n    - (unfortunately not too relevant to this specific idea, as I figured\r\n      after inspecting them later; I'd rather need something that assists\r\n      story-planning)\r\n  - I also shared an example story (see below)\r\n    - I wrote created the example with gptel and the latest chatgpt\r\n      with high temperature setting\r\n\r\n- We continued talking about LLMs and gptel, including some showcasing of\r\n  my workflow integrating Org capture with gptel (I bind C-l to\r\n  gptel-send and make a habit to routinely use gptel to expand the\r\n  notes and quickly elaborate\/improve on the ideas I put into the\r\n  notes)\r\n  - I complained that some LLMs output Org headings (* Heading) and mess up\r\n    Org capture when I capture into a deeply nested subtree\r\n  - kathink first suggested ~gptel-prompt-prefix-alist~ and\r\n    ~gptel-response-prefix-alist~, but I was talking about gptel-send\r\n    in an Org bufer; not a gptel-mode buffer when the prefixes are used\r\n    - also, prefixes do not help with LLM outputting headings directly\r\n    - So, ~gptel-post-response-functions~ is the solution (and the\r\n      latest addtion to my config)\r\n      #+begin_src emacs-lisp\r\n\t(use-package gptel\r\n\t  :config\r\n\t  (defun yant\/itemize-text (beg end)\r\n\t    \"Itemize all the Org headings in region BEG..END.\"\r\n\t    (when (derived-mode-p 'org-mode)\r\n\t      (save-excursion\r\n\t\t(deactivate-mark)\r\n\t\t(goto-char beg)\r\n\t\t(when (re-search-forward org-outline-regexp-bol end t)\r\n\t\t  (push-mark)\r\n\t\t  (goto-char end)\r\n\t\t  (activate-mark)\r\n\t\t  (call-interactively #'org-toggle-item)\r\n\t          (deactivate-mark)))))\r\n\t  (add-hook 'gptel-post-response-functions #'yant\/itemize-text))\r\n      #+end_src\r\n  - We then discussed about very long conversations when gptel buffer\r\n    becomes too long and exceeds model context length\r\n    - kathink mentioned that we can limit the number of previous\r\n      responses sent to the model, but that's not ideal as the number\r\n      of responses has little relation with the context length\r\n    - Ideally, gptel should auto-detect errors when context length is\r\n      exceeded and truncate\/summarize parts of the history before sending\r\n      - it is not easy though as the error is not standardized across LLM APIs\r\n\r\nAnd the \"tutorial story\" I generated with LLM:\r\n\r\n  I am looking to create an Org mode tutorial that is written like an\r\n  interactive book story.  The story text will be written using\r\n  recognizable style of the classic interactive books like stainless\r\n  steel rat, gradually introducing Org mode features. The features will\r\n  start from basic concepts, but later allow users to take directions\r\n  according to preferred use cases.\r\n\r\n  The tutorial will itself be an Org mode file with text, todo tasks,\r\n  and other Org mode features described in Org mode manual, followed by\r\n  extended features available in popular Org mode extensions.\r\n\r\n  The tutorial will try to resemble typical RPG game tutorials, so that\r\n  the concepts from RPG can be linked to Org mode concepts when possible.\r\n\r\n  The user should be able to come back to current progress in the\r\n  tutorial any time by making use agenda views.\r\n\r\n  Please write me this story.\r\n\r\n\r\n\r\n  * *Org Mode: The Interactive Codex*  \r\n  \/A Choose-Your-Own-Adventure Guide to Mastering Emacs\u2019 Most Powerful Tool\/  \r\n\r\n  ---\r\n\r\n  ** *Prologue: The Awakening*\r\n\r\n  You wake\r\n   up in a dimly lit chamber, the air humming with unseen energy. Before you, a glowing screen flickers to life, displaying strange symbols\u2014yet somehow, you understand them.  \r\n\r\n  A voice echoes in your mind:  \r\n\r\n  > *\"Welcome, Traveler. You have been chosen to wield the *Codex of Org*, a tool of infinite potential. But first, you must learn its secrets.\"*  \r\n\r\n  A prompt appears:  \r\n\r\n  #+begin_src org\r\n  ,* TODO Begin your journey  \r\n  #+end_src  \r\n\r\n  You reach out\u2014your fingers brush the keys\u2014and the world reshapes around you.  \r\n\r\n  ---\r\n\r\n  ** *Chapter 1: The Basics of the Codex*\r\n\r\n  *** *1.1 The Structure of Reality*\r\n\r\n  The screen shifts, revealing a new message:  \r\n\r\n  > *\"All knowledge in the Codex is organized in *headings*. These are your foundation.\"*  \r\n\r\n  #+begin_src org\r\n  ,* The First Heading  \r\n  #+end_src  \r\n\r\n  A whisper in your ear explains:  \r\n\r\n  - =*= creates a top-level heading.  \r\n  - =**= is a subheading, =***= goes deeper, and so on.  \r\n\r\n  You experiment, typing:  \r\n\r\n  #+begin_src org\r\n  ,* The First Heading  \r\n  ,** A Subheading  \r\n  ,*** Even deeper  \r\n  #+end_src  \r\n\r\n  The Codex responds\u2014lines folding and unfolding as you press =TAB=.  \r\n\r\n  > *\"Good. Now, mark your progress.\"*  \r\n\r\n  #+begin_src org\r\n  ,* TODO Learn headings  \r\n  ,* DONE First step complete  \r\n  #+end_src  \r\n\r\n  The words shift color\u2014red for =TODO=, green for =DONE=.  \r\n\r\n  ---\r\n\r\n  *** *1.2 The Power of Lists*\r\n\r\n  A new prompt appears:  \r\n\r\n  > *\"To survive, you must *organize*. Lists will be your weapon.\"*  \r\n\r\n  #+begin_src org\r\n  - A simple list item  \r\n    - Indented for sub-items  \r\n  1. Numbered lists work too  \r\n     a) And lettered sub-items  \r\n  #+end_src  \r\n\r\n  You feel the Codex responding\u2014each keystroke shaping reality.  \r\n\r\n  > *\"Now, try a checklist.\"*  \r\n\r\n  #+begin_src org\r\n  ,* TODO Gather supplies  \r\n    - [ ] Rations  \r\n    - [ ] Map  \r\n    - [ ] Light source  \r\n  #+end_src  \r\n\r\n  Pressing =C-c C-c= on a checkbox toggles it\u2014=[X]= means complete.  \r\n\r\n  ---\r\n\r\n  ** *Chapter 2: The Art of Navigation*\r\n\r\n  *** *2.1 Moving Through the Codex*\r\n\r\n  The voice returns:  \r\n\r\n  > *\"The Codex is vast. You must learn to traverse it.\"*  \r\n\r\n  - =C-c C-n= \/ =C-c C-p= \u2192 Jump to next\/previous heading.  \r\n  - =C-c C-f= \/ =C-c C-b= \u2192 Move between same-level headings.  \r\n  - =C-c C-u= \u2192 Move up to parent heading.  \r\n\r\n  You practice, darting through the document like a shadow.  \r\n\r\n  ---\r\n\r\n  *** *2.2 The Magic of Links*\r\n\r\n  A glowing portal appears\u2014a hyperlink.  \r\n\r\n  > *\"Links bind knowledge together.\"*  \r\n\r\n  #+begin_src org\r\n  [[https:\/\/orgmode.org][Org Mode Website]]  \r\n  [[file:~\/path\/to\/file.org][Another part of the Codex]]  \r\n  #+end_src  \r\n\r\n  You click\u2014the world shifts again.  \r\n\r\n  ---\r\n\r\n  ** *Chapter 3: The Forge of Productivity*\r\n\r\n  *** *3.1 The Agenda\u2014Your Quest Log*\r\n\r\n  The voice deepens:  \r\n\r\n  > *\"To master the Codex, you must track your destiny.\"*  \r\n\r\n  You create a new file, =quests.org=:  \r\n\r\n  #+begin_src org\r\n  ,* TODO Defeat the Dragon of Procrastination  \r\n    DEADLINE: <2024-12-31 Wed>  \r\n  ,* NEXT Gather the Scrolls of Documentation  \r\n  #+end_src  \r\n\r\n  Then, in your =init.el=:  \r\n\r\n  #+begin_src emacs-lisp\r\n  (setq org-agenda-files '(\"~\/org\/quests.org\"))  \r\n  #+end_src  \r\n\r\n  Pressing =C-c a t= summons your *Agenda View*\u2014a list of all quests.  \r\n\r\n  ---\r\n\r\n  *** *3.2 Time and the Eternal Clock*\r\n\r\n  > *\"Time bends to the Codex.\"*  \r\n\r\n  #+begin_src org\r\n  ,* TODO Meditate on Org  \r\n    SCHEDULED: <2024-06-15 Sat 10:00>  \r\n  #+end_src  \r\n\r\n  =C-c C-s= schedules, =C-c C-d= sets deadlines.  \r\n\r\n  The *Agenda* (=C-c a a=) now shows your fate unfolding.  \r\n\r\n  ---\r\n\r\n  ** *Chapter 4: The Path of Mastery*\r\n\r\n  *** *4.1 Choose Your Destiny*\r\n\r\n  The screen splits\u2014three glowing paths appear:  \r\n\r\n  1. *The Scholar\u2019s Path* (Documentation, Notes)  \r\n  2. *The Warrior\u2019s Path* (Task Management, GTD)  \r\n  3. *The Mage\u2019s Path* (Literate Programming, Exporting)  \r\n\r\n  You must decide.  \r\n\r\n  ---\r\n\r\n  **** *Path 1: The Scholar\u2019s Path*\r\n\r\n  #+begin_src org\r\n  ,* TODO Master org-roam  \r\n  ,* TODO Learn org-noter  \r\n  #+end_src  \r\n\r\n  > *\"Knowledge is power. Build your *second brain*.\"*  \r\n\r\n  ---\r\n\r\n  **** *Path 2: The Warrior\u2019s Path*\r\n\r\n  #+begin_src org\r\n  ,* TODO Implement GTD workflow  \r\n  ,* NEXT Set up org-capture templates  \r\n  #+end_src  \r\n\r\n  > *\"Efficiency is victory. Conquer your tasks.\"*  \r\n\r\n  ---\r\n\r\n  **** *Path 3: The Mage\u2019s Path*\r\n\r\n  #+begin_src org\r\n  ,* TODO Write a program in org-babel  \r\n  ,* NEXT Export to LaTeX and HTML  \r\n  #+end_src  \r\n\r\n  > *\"Code and prose as one. Bend reality.\"*  \r\n\r\n  ---\r\n\r\n  ** *Epilogue: The Codex Endures*\r\n\r\n  The voice fades, but the Codex remains\u2014alive, evolving.  \r\n\r\n  > *\"Return anytime. The Agenda knows your progress.\"*  \r\n\r\n  You press =C-c a a=\u2014your journey displayed before you.  \r\n\r\n  The adventure continues.  \r\n\r\n  ---\r\n\r\n  *** *Final Challenge: The Grand Synthesis*\r\n\r\n  #+begin_src org\r\n  ,* FINAL BOSS: Automate your life with Org Mode  \r\n  :PROPERTIES:\r\n  :ID:       39e76e97-3eae-461d-afc1-e85700e1a34d\r\n  :END:\r\n    - [ ] Combine all paths  \r\n    - [ ] Teach another traveler  \r\n  #+end_src  \r\n\r\n  Will you prevail?  \r\n\r\n  ---\r\n\r\n  *To be continued\u2026*  \r\n\r\n  *(Save this file as =org-codex.org= and begin your journey!)*  \r\n\r\n  ---\r\n\r\n  *** *Game Mechanics (Cheat Sheet)*\r\n\r\n  | RPG Concept       | Org\r\n   Mode Equivalent        |  \r\n  |-------------------|---------------------------|  \r\n  | Quest Log         | Agenda View (=C-c a a=)   |  \r\n  | Inventory         | Checklists (=- [ ]=)      |  \r\n  | Fast Travel       | Links (=[[file:...]]=)    |  \r\n  | Leveling Up       | Mastering new commands    |  \r\n  | Boss Fight        | Complex project setup     |  \r\n\r\n  ---\r\n\r\n  Now, Traveler\u2014your destiny awaits.  \r\n\r\n  =M-x org-agenda=  \r\n\r\n  *Begin.*\r\n\r\n\r\n--------------------------\r\n\r\n:chat:\r\n[17:48] yantar92 is now the presenter\r\n[17:51] [yantar92 : MODERATOR]: The meetup will start properly in 10 minutes, as per schedule.\r\n[17:52] [yantar92 : MODERATOR]: The most recent Emacs news: https:\/\/sachachua.com\/blog\/2025\/05\/2025-05-12-emacs-news\/\r\n[18:02] Pedro A. Aranda is now the presenter, set by yantar92\r\n[18:03] [Alex : VIEWER]: Looks good on this side of the screen \ud83d\ude01\r\n[18:09] [yantar92 : MODERATOR]: Mailing list discussion on the new latex font system: https:\/\/list.orgmode.org\/orgmode\/87semr869p.fsf@localhost\/ and https:\/\/list.orgmode.org\/orgmode\/df48f6d0-6240-4545-aa19-5c95fd0f6230@gmail.com\/\r\n[18:24] [Alex : VIEWER]: @yantar92 the sound from your side is not coming through\r\n[18:25] [Sacha Chua : VIEWER]: CPU and mem on the BigBlueButton server still look fine, so it might be on yantar92's side, sorry\r\n[18:30] [William Denton : VIEWER]: This is impressive work!\r\n[18:37] yantar92 is now the presenter, set by yantar92\r\n[18:38] [Alex : VIEWER]: I am playing with Journelly. It's an iOS app that uses as a backend org mode\r\n[18:39] [Alex : VIEWER]: Very cute\r\n[18:39] [Alex : VIEWER]: and unexpected usage of orgmode for me\r\n[18:39] [Alex : VIEWER]: Yes this one\r\n[18:39] [Alex : VIEWER]: it's a paid app so don't take it as a promotion\r\n[18:39] [Alex : VIEWER]: \ud83d\ude01\r\n[18:40] [Alex : VIEWER]: The smart idea is the app uses a drawer\r\n[18:40] [Matthew Page-Lieberman : VIEWER]: Oh, Journelly. Yes, I have a few articles to read about that and am thinking trying it out, as people keep talking about it.\r\n[18:40] [Alex : VIEWER]: to automatically store location, weather, etc\r\n[18:40] [Alex : VIEWER]: I liked that idea\r\n[18:41] [Alex : VIEWER]: right\r\n[18:41] [Alex : VIEWER]: Example from my file\r\n[18:41] [Alex : VIEWER]: * [2025-05-14 Wed 16:45] @ WorldClass MegaMall\r\n,:PROPERTIES:\r\n,:LATITUDE: 44.XXXX\r\n,:LONGITUDE: 36.XXX\r\n,:WEATHER_TEMPERATURE: 62.4\u00b0F\r\n,:WEATHER_CONDITION: Mostly Clear\r\n,:WEATHER_SYMBOL: sun.max\r\n,:END:\r\n\r\n[18:41] [Alex : VIEWER]: please don't use the above to locate me though\r\n[18:41] [Alex : VIEWER]: \ud83d\ude01\r\n[18:41] [Matthew Page-Lieberman : VIEWER]: Has anyone used Plain Org? It's made by the same author.\r\n[18:42] [Alex : VIEWER]: I tried it \r\n[18:42] [Alex : VIEWER]: but I went back to Beorg\r\n[18:42] [Alex : VIEWER]: for OrgMode on the iPhone\r\n[18:42] [Alex : VIEWER]: I also have Orgro\r\n[18:43] [niklauz : VIEWER]: +1 to Orgzly\r\n[18:43] [Alex : VIEWER]: OrgMobile was very difficult to use\r\n[18:43] [Pedro A. Aranda : VIEWER]: That may be nice for really big screens. I tried on mine and the feeling was my screen is too small or that\r\n[18:43] [Matthew Page-Lieberman : VIEWER]: I was using beorg for a while, but I disliked that I would have to write in its version of Scheme in order to have the same behavior as what I have in Emacs Lisp on my computer.\r\n[18:43] [Matthew Page-Lieberman : VIEWER]: Yes, he maintains it.\r\n[18:44] [Alex : VIEWER]: ahh, I do not try to reproduce all the features\/behavior I have on my main machine\r\n[18:44] [Alex : VIEWER]: so for me Beorg works ok\r\n[18:44] [Alex : VIEWER]: a few predefined searches and capture templates and that's all I need\r\n[18:44] [Matthew Page-Lieberman : VIEWER]: Yes, I know, but I mean just things like adding a new todo and updating todo states.\r\n[18:45] [Alex : VIEWER]: I did not have to do that Matthew\r\n[18:45] [Alex : VIEWER]: hmmm, nothing like that\r\n[18:45] [niklauz : VIEWER]: I wonder if something like transient-ng will bring an easy touchscreen interface to Emacs to make it more comfortable to use on the phone \ud83d\ude0a \r\n[18:45] [Matthew Page-Lieberman : VIEWER]: That display of Org-agenda is very nice. Can you share how it was constructed?\r\n[18:46] [niklauz : VIEWER]: (transient-ng is an imaginary project I just made up to plant the wish)\r\n[18:46] [Pedro A. Aranda : VIEWER]: \ud83d\ude04 \ud83d\ude04\r\n[18:46] [Alex : VIEWER]: @yantar92 the question from Matthew's about Org Agenda is for you \ud83d\ude09\r\n[18:46] [niklauz : VIEWER]: Ah good to know!\r\n[18:47] [karthink : VIEWER]: Those were just widgets\r\n[18:47] [karthink : VIEWER]: Yeah, it would be pretty basic but it would work\r\n[18:48] [Matthew Page-Lieberman : VIEWER]: yes!\r\n[18:48] [Christian : VIEWER]: Can we allow ourselves more flexibility to mention closed-source projects (e.g. Journelly) on Worg than on the official Org-mode pages? I probably ought to know what the policy is, but I don't\r\n[18:48] [Pedro A. Aranda : VIEWER]: I need to leave right now. Remember to send me any MWE you wouls like to see working. Especially for pdflatex \ud83d\ude09\r\n[18:48] [Pedro A. Aranda : VIEWER]: Bye\r\n[18:48] [Matthew Page-Lieberman : VIEWER]: Well, you have the columns coming up automatically.\r\n[18:51] [Matthew Page-Lieberman : VIEWER]: Thank you.\r\n[18:51] [yantar92 : MODERATOR]: https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#agenda\r\n[18:51] [Alex : VIEWER]: What is simple for some can still be great or new for others \r\n[18:52] [Alex : VIEWER]: And vice versa\r\n[18:52] [kickingvegas : VIEWER]: hi folks\r\n[18:52] [niklauz : VIEWER]: true, and elisp snippets can be very easy to share and integrate\r\n[18:54] [niklauz : VIEWER]: Is there a signup for future presenters? My emacs config is literate and optionally uses nix ... not sure that meets the threshold of interesting \ud83d\ude01 \r\n[18:55] [niklauz : VIEWER]: OK, I'm having audio issues today but would be happy to share for a few minutes in a future meeting\r\n[18:55] [kickingvegas : VIEWER]: on my back burner is updating worg wrt org-protocol and macOS integration\r\n[18:55] [karthink : VIEWER]: Ihor have you had any time to work on your refactoring of Org (in the last two months or so)\r\n[18:56] [kickingvegas : VIEWER]: also need to report an org-protocol bug too\r\n[18:56] [yantar92 : MODERATOR]: https:\/\/list.orgmode.org\/878qn3h98b.fsf@christianmoe.com\/T\/#me3cbb275768b8c871f47c63906aea95b5531b9cc\r\n[18:56] [yantar92 : MODERATOR]: new WORG maintainer\r\n[18:56] [Christian : VIEWER]: That would be me. Hi, folks!\r\n[18:56] [niklauz : VIEWER]: thanks @Christian \r\n[18:57] [Christian : VIEWER]: Just listening in today\r\n[18:57] [Christian : VIEWER]: I'll have more to share soon\r\n[18:57] [Matthew Page-Lieberman : VIEWER]: Is this you, Christian?\r\nhttps:\/\/toot.si\/@noctuaminervae\r\n[18:57] [Christian : VIEWER]: It is\r\n[18:57] [Matthew Page-Lieberman : VIEWER]: Good. We are mutual follows.\r\n[18:58] [Matthew Page-Lieberman : VIEWER]: I am https:\/\/social.coop\/@jotaemei\r\n[18:59] [NP : VIEWER]: Hello\r\nI would like to know if some of you have seen this post:\r\n https:\/\/lists.gnu.org\/archive\/html\/emacs-orgmode\/2025-04\/msg00350.html\r\nAnd if you would like to discuss it ?\r\n[18:59] [niklauz : VIEWER]: On second though - if we have a few moments I'd like to try to present briefly\r\n[19:00] [Alex : VIEWER]: I have to join a work meeting. Thanks for hosting this.\r\n[19:00] [niklauz : VIEWER]: I'm connected via two devices, so one may work for audio\r\n[19:00] [NP : VIEWER]: I did not had time to prepare a presentation\r\n[19:01] [NP : VIEWER]: I can explain\r\n[19:01] [NP : VIEWER]: what do you need to know  ?\r\n[19:01] [NP : VIEWER]: it is just instead od use-package\r\n[19:02] [NP : VIEWER]: we put each option separatly \r\n[19:02] [NP : VIEWER]: in it is own src-block\r\n[19:02] [NP : VIEWER]: so user can pick each choice separatly\r\n[19:02] [niklauz : VIEWER]: if I'm understanding, I'm doing something similar too\r\n[19:02] [NP : VIEWER]: instead of copying all use-package block\r\n[19:03] [niklauz : VIEWER]: though I get the feeling you're taking it further than me\r\n[19:03] [NP : VIEWER]: in fact the above list\r\n[19:04] [NP : VIEWER]: are org-links\r\n[19:04] [NP : VIEWER]: when you click on a link\r\n[19:04] [NP : VIEWER]: the link will call sparse-tree to filter the headings\r\n[19:05] [NP : VIEWER]: [[myfilter:ta][]tag]\r\n[19:05] [NP : VIEWER]: the problem is I dont understand what you dont understand :0\r\n[19:05] [NP : VIEWER]: \ud83d\ude0a\r\n[19:06] [NP : VIEWER]: ok\r\n[19:06] [NP : VIEWER]: how to use it\r\n[19:06] [NP : VIEWER]: you know sparse tree on tags  right ?\r\n[19:06] [niklauz : VIEWER]: @NP is it selecting blocks to tangle based on tag-groups?\r\n[19:07] [NP : VIEWER]: in fact this is an old org file that I propose some time ago\r\n[19:07] [NP : VIEWER]: the new idea I am proposing inhttps:\/\/lists.gnu.org\/archive\/html\/emacs-orgmode\/2025-04\/msg00350.html is different, though it share similarities\r\n[19:07] [NP : VIEWER]: can we swith to https:\/\/lists.gnu.org\/archive\/html\/emacs-orgmode\/2025-04\/msg00350.html ?\r\n[19:08] [NP : VIEWER]: yep the new idea...\r\n[19:08] [NP : VIEWER]: ok I will explain it\r\n[19:09] [NP : VIEWER]: the idea is that for every package\r\n[19:10] [NP : VIEWER]: instead of putting its config in a use-package block\r\n[19:10] [NP : VIEWER]: we instead put each user option in an org src-block\r\n[19:10] [NP : VIEWER]: so the end user can select each org src-block to tangle it separatly\r\n[19:10] [NP : VIEWER]: wait\r\n[19:11] [NP : VIEWER]: look at the example below\r\n[19:11] [NP : VIEWER]: :\r\n[19:11] [NP : VIEWER]: **** auto-save-interval\r\nNumber of input events (keystrokes\/characters typed) between auto-saves.\r\n,***** [  ] after 300 events (default)\r\n,***** [X] after 1000 events\r\n#+begin_src emacs-lisp\r\n  (setq auto-save-interval 1000)\r\n#+end_src\r\n,***** [  ] disable auto-saving due to number of characters typed\r\n#+begin_src emacs-lisp\r\n  (setq auto-save-interval 0)\r\n#+end_src\r\n[19:12] [NP : VIEWER]: copy it to your emacs session\r\n[19:12] [NP : VIEWER]: lets make them list for the monent instead of heading\r\n[19:13] [NP : VIEWER]: users will check one choice for every option\r\n[19:13] [NP : VIEWER]: and can see the elisp code and edit it for every choice\r\n[19:14] [NP : VIEWER]: you forget the 3rd choice to make it a list\r\n[19:14] [Sacha Chua : VIEWER]: You can probably write an org babel block at the end that uses org-map-entries and org-get-heading to evaluate or tangle all the blocks in the checked headings.\r\n[19:14] [NP : VIEWER]: if we mek all the org file like this\r\n[19:14] [NP : VIEWER]: @Sacha exactly\r\n[19:15] [NP : VIEWER]: that is one idea\r\n[19:16] [NP : VIEWER]: ** which-key\r\n,*** which-key-mode                                                   :mode:\r\n,**** [  ] disable (default)\r\n,**** [  ] enable immediatly\r\n#+begin_src emacs-lisp\r\n  (which-key-mode)\r\n#+end_src\r\n,**** [X] enabled after 2 seconds of emacs idle delay\r\n#+begin_src emacs-lisp\r\n  (run-with-idle-timer 2 nil #'which-key-mode t)\r\n#+end_src\r\n,**** [  ] enabled immediately after feature1 is loaded\r\n#+begin_src emacs-lisp\r\n  (eval-after-load 'feature1\r\n     '(which-key-mode))\r\n#+end_src\r\n,**** [  ] enable manually (autoload when which-key-mode is called)\r\n[ This is just an example. which-key-mode is already autoloaded ]\r\n#+begin_src emacs-lisp\r\n  (unless\r\n      (fboundp 'which-key-mode)\r\n    (autoload #'which-key-mode \"which-key\" nil t))\r\n#+end_src\r\n,**** [  ] etc\r\n[19:16] [Jake : VIEWER]: I think the goal here isn't completely clear, which might make it harder to understand. Is the goal here to make things easier for elisp-illiterate users by making it possible to hand them some source code they can then switch on and off?\r\n[19:16] [NP : VIEWER]: @Ihor yes\r\n[19:17] [Sacha Chua : VIEWER]: also you may want to always add the disabling code, like (which-key-mode -1) so that people can undo their choices\r\n[19:17] [NP : VIEWER]: @Ihor can you copy the new snippet into the emacs session ?\r\n[19:17] [Sacha Chua : VIEWER]: I think the prototype can be done without needing new features in Org, so you can go ahead and try it out.\r\n[19:18] [NP : VIEWER]: @Jake the user does not need to know elisp\r\n[19:18] [NP : VIEWER]: he can just check the choices and tangle the code to the init file\r\n[19:18] [NP : VIEWER]: but if he wants he can edit elisp code \r\n[19:18] [NP : VIEWER]: and learn elisp too\r\n[19:19] [NP : VIEWER]: each user option has :\r\n-choice 1\r\n-choice2\r\n-etc\r\n[19:19] [NP : VIEWER]: what exactly ?\r\n[19:19] [NP : VIEWER]: redundent ?\r\n[19:20] [niklauz : VIEWER]: @NP what stage of development is this, is it in the \"concept development\" stage or is there working code that makes it usable at this point?\r\n[19:20] [Sacha Chua : VIEWER]: Do you already have the code for a function that evaluates or tangles the selected portions?\r\n[19:20] [NP : VIEWER]: no you should keep them\r\n[19:20] [NP : VIEWER]: to change your mind later\r\n[19:20] [Jake : VIEWER]: Is this a substantive improvement over commenting things out?\r\n[19:20] [NP : VIEWER]: you need to change your mind later and select another choice\r\n[19:21] [Sacha Chua : VIEWER]: What I'm hearing is maybe this is more of a guided configuration tutorial for a new user\r\n[19:21] [NP : VIEWER]: if you are advanced user you can delete what you want\r\n[19:21] [NP : VIEWER]: and keep what you want\r\n[19:22] [NP : VIEWER]: it is up to you\r\n[19:22] [Jake : VIEWER]: Seems like you can already easily get this with COMMENT like Ihor showed\r\n[19:22] [NP : VIEWER]: but new users need to see all choices to pick them\r\n[19:22] [NP : VIEWER]: try them\r\n[19:22] [NP : VIEWER]: change them\r\n[19:22] [NP : VIEWER]: test them\r\n[19:22] [NP : VIEWER]: etc...\r\n[19:22] [NP : VIEWER]: @Shacha not only new users\r\n[19:22] [Sacha Chua : VIEWER]: I'm interested in the answer to niklauz's question too. Do you already have a working prototype, or do you know how to make a prototype, or are you hoping someone will make one?\r\n[19:22] [NP : VIEWER]: it is even important for advanced users\r\n[19:23] [NP : VIEWER]: because there are advanced choices also\r\n[19:23] [NP : VIEWER]: like advanced regexp, or complicated functions, etc..\r\n[19:24] [NP : VIEWER]: it is not difficult to do a prototype\r\n[19:24] [NP : VIEWER]: we already have done 25% of it just now\r\n[19:25] [NP : VIEWER]: **** make-backup-files\r\n,***** [X] backup files (default)\r\n,***** [  ] do no backup files\r\n#+begin_src emacs-lisp\r\n  (setq make-backup-files nil)\r\n#+end_src\r\n,***** [X] do not backup files for rmail major mode             :@rmail:\r\n#+begin_src emacs-lisp\r\n  (add-hook 'rmail-mode-hook\r\n            (lambda () (setq-local make-backup-files nil)))\r\n#+end_src\r\n[19:25] [NP : VIEWER]: add this too\r\n[19:26] [NP : VIEWER]: we can put each package in it own org file\r\n[19:26] [Jake : VIEWER]: When I was a new user, I got value out of Spacemacs' layers for trying things out without getting overwhelmed\r\n[19:26] [Jake : VIEWER]: Something like that seems more appropriate\r\n[19:26] [NP : VIEWER]: @Jake exactly\r\n[19:26] [NP : VIEWER]: no of course\r\n[19:26] [Sacha Chua : VIEWER]: Slightly unrelated, I'm not sure there's a way to treat heading checkboxes as radios, \u2018C-c C-x C-r\u2019 (\u2018org-toggle-radio-button\u2019) doesn't seem to work with them\r\n[19:26] [NP : VIEWER]: each package in its own org file\r\n[19:27] [NP : VIEWER]: we can do lists\r\n[19:27] [NP : VIEWER]: no problem\r\n[19:27] [NP : VIEWER]: I will explain headings later\r\n[19:27] [NP : VIEWER]: exactly\r\n[19:27] [NP : VIEWER]: exactly\r\n[19:28] [Sacha Chua : VIEWER]: Hah, yeah, that makes sense =)\r\n[19:28] [NP : VIEWER]: or we can add :ROPERTIES:\r\n:SELECTED:yes:\r\n[19:28] [NP : VIEWER]: :END:\r\n[19:28] [NP : VIEWER]: and add ison at the start of a heading\r\n[19:29] [NP : VIEWER]: exaclty\r\n[19:29] [NP : VIEWER]: will discuus later\r\n[19:29] [NP : VIEWER]: no need\r\n[19:29] [NP : VIEWER]: we take each option\r\n[19:30] [NP : VIEWER]: and add the corresponding choices separatly\r\n[19:30] [NP : VIEWER]: in separate org src-block\r\n[19:30] [NP : VIEWER]: and user choose a choice\r\n[19:30] [NP : VIEWER]: and tangle the results\r\n[19:30] [NP : VIEWER]: we already do the same in our org files\r\n[19:30] [NP : VIEWER]: but inside use-package\r\n[19:30] [NP : VIEWER]: and with use-package\r\n[19:31] [NP : VIEWER]: you cant really select or change or share anything easily\r\n[19:31] [NP : VIEWER]: I would like to know if the idea is clear at this stage ?\r\n[19:32] [NP : VIEWER]: anyone got the idea ?\r\n[19:32] [oylenshpeegul : VIEWER]: I heard you fine, @niklauz, but perhaps yantar92 did not.\r\n[19:32] [niklauz : VIEWER]: Thanks oylenshppeegul \r\n[19:32] [NP : VIEWER]: anyone did not undestaood the idea ?\r\n[19:32] [NP : VIEWER]: \ud83d\ude0a\r\n[19:32] [NP : VIEWER]: raise their hands :0\r\n[19:33] [NP : VIEWER]: \ud83d\ude0a\r\n[19:33] [karthink : VIEWER]: Ihor, I think niklauz is speaking\r\n[19:33] [niklauz : VIEWER]: If it's okay w\/ the group I could share my config - it takes a different approach but may be motivated by similar things\r\n[19:33] [Sacha Chua : VIEWER]: I think it's one of those things where you might want to go ahead and make a prototype yourself to flesh out the idea, and then see if anyone wants to use it as a user (that's a challenging step), and then see if you can grow from there...\r\n[19:33] [Sacha Chua : VIEWER]: I can hear you\r\n[19:34] [niklauz : VIEWER]: It seems like some folks can hear me\r\n[19:34] yantar92 is now the presenter\r\n[19:34] [NP : VIEWER]: I will wait @niklauz to see \r\n[19:34] [Sacha Chua : VIEWER]: Hahaha\r\n[19:35] [karthink : VIEWER]: Maybe it's your system volume Ihor\r\n[19:35] [Sacha Chua : VIEWER]: I can hear niklauz, not sure what's going on with yantar92's end... =|\r\n[19:35] [NP : VIEWER]: I can hear too clearly\r\n[19:35] [niklauz : VIEWER]: heheh\r\n[19:35] [Christian : VIEWER]: Looks like the rest of us can hear him\r\n[19:35] [Sacha Chua : VIEWER]: (yantar92: what browser are you using? sometimes Firefox inside a snap can weird out)\r\n[19:36] [Sacha Chua : VIEWER]: yantar92, niklauz would like presenter permission\r\n[19:36] [Christian : VIEWER]: Ihor, can you allow him to share screen?\r\n[19:36] [Sacha Chua : VIEWER]: this is making me want to learn stenography again =)\r\n[19:37] [Sacha Chua : VIEWER]: niklauz says (paraphrased): While we're waiting, I think the conversation with NP is interesting. A lot of the ground is covered by the customization system, but there's definitely an area of ... discoverability and play that the customization interface doesn't quite reach... I wonder if some of that could be covered by transient.\r\n[19:37] yantar92 is now the presenter\r\n[19:38] niklauz is now the presenter, set by yantar92\r\n[19:38] [Sacha Chua : VIEWER]: Yay!\r\n[19:38] [NP : VIEWER]: same pleasure here\r\n[19:38] [Sacha Chua : VIEWER]: What was it?\r\n[19:38] [Sacha Chua : VIEWER]: niklauz was saying nice things about being part of the community. =)\r\n[19:39] yantar92 is now the presenter, set by yantar92\r\n[19:39] [Sacha Chua : VIEWER]: The icon might look like a monitor or something like that\r\n[19:39] niklauz is now the presenter, set by yantar92\r\n[19:39] [Sacha Chua : VIEWER]: Doesn't work from mobile\r\n[19:40] [Sacha Chua : VIEWER]: https:\/\/support.bigbluebutton.org\/hc\/en-us\/articles\/1500005316582-Share-my-screen\r\n[19:40] niklauz is now the presenter, set by yantar92\r\n[19:40] [Sacha Chua : VIEWER]: yay, I can see your screen\r\n[19:41] [Matthew Page-Lieberman : VIEWER]: Yes\r\n[19:41] [NP : VIEWER]: yes\r\n[19:41] [yantar92 : MODERATOR]: @Sacha Yes, Firefox\r\n[19:41] [Sacha Chua : VIEWER]: my Firefox sometimes gets weird about websocket connections, so that's why I tend to use Chromium to connect to web conferences (BBB, Google Meet, etc.) =|\r\n[19:41] [karthink : VIEWER]: niklauz, could you use a larger font size?\r\n[19:41] [karthink : VIEWER]: On a small screen here\r\n[19:42] [Sacha Chua : VIEWER]: Alternatively, if you're sharing a window, you can make the window smaller and it looks bigger for us\r\n[19:42] [NP : VIEWER]: @Sacha maybe you change some settings\r\n[19:44] [Matthew Page-Lieberman : VIEWER]: What about Guix? \ud83d\ude09\r\n[19:55] [Christian : VIEWER]: Fascinating, but I need to go. Bye!\r\n[19:57] [Sacha Chua : VIEWER]: Since I'm here anyway, NP (and anyone else): prototype for evaluating source blocks only in checked items in the buffer or subtree: https:\/\/gist.githubusercontent.com\/sachac\/5eeac2c5b58802b1b4de7ed2bf567681\/raw\/bcf8cd76aa7aea92f5eb13fc24a9d8e20bb59744\/test.org\r\n[19:59] [Jake : VIEWER]: My initial reaction is that it's overwhelmingly big and it's not obvious why I would want that over a smaller config I made that I can maintain and understand.\r\n[19:59] [Sacha Chua : VIEWER]: oh, it doesn't handle nested items nicely yet, I think\r\n[19:59] [NP : VIEWER]: @Sacha WOW\r\n[19:59] [NP : VIEWER]: thanks\r\n[20:00] [NP : VIEWER]: I will look at that in details later\r\n[20:00] [NP : VIEWER]: but no need to go in too much details for now, because there are many many \ud83d\ude0a\r\n[20:01] [NP : VIEWER]: let see if we understood the idea at higher level first\r\n[20:05] [kickingvegas : VIEWER]: gotta run - take care folks! \r\n[20:11] [niklauz : VIEWER]: https:\/\/rapport-org.gitlab.io\/emacs\/\r\n[20:11] [NP : VIEWER]: Thanks for the presentation\r\n[20:13] [Jake : VIEWER]: It does.\r\n[20:14] [karthink : VIEWER]: That sounds like a lot of language-dependent work\r\n[20:15] [karthink : VIEWER]: (Declaring packages required by code blocks)\r\n[20:15] [Sacha Chua : VIEWER]: NP: Updated so that it handles sub-items. It'll run things if the checkboxes above it are [-] or [X].\r\n[20:15] [Sacha Chua : VIEWER]: NP: But I am not the target market for this, so you may want to tinker around with it some more and try to make it interesting\/attractive enough for someone to try\r\n[20:16] [NP : VIEWER]: @niklauz How much time do you estimate for seomeone to learn this ? and what are the exact prerequisites ?\r\n[20:17] [NP : VIEWER]: @Sacha Thanks a lot , I think you get the idea I am trying to vehicule\r\n[20:19] [Jake : VIEWER]: IMO if someone is afraid of Emacs Lisp, Emacs might not be the editor they want.\r\n[20:19] [Jake : VIEWER]: The lisp is kind of the point.\r\n[20:19] [NP : VIEWER]: @niklauz How much time do you estimate for seomeone to learn this ? and what are the exact prerequisites ?\r\n[20:20] [NP : VIEWER]: \ud83d\ude01\r\n[20:21] [NP : VIEWER]: what are the technical prerequisites ? and user background prerequisites ?\r\n[20:23] [Matthew Page-Lieberman : VIEWER]: Have to go. Peace.\r\n[20:24] [Sacha Chua : VIEWER]: Gotta go, nice chat, thanks all for sharing!\r\n[20:25] [NP : VIEWER]: @Sacha Thanks for you inputs !!!\r\n[20:26] [Jake : VIEWER]: Guix is pretty cool for the kind of thing you're trying to do.\r\n[20:26] [Jake : VIEWER]: Not familiar with Nix, so I can't compare it much\r\n[20:26] [NP : VIEWER]: Thanks\r\n[20:26] [niklauz : VIEWER]: My pleasure!\r\n[20:26] [NP : VIEWER]: yep\r\n[20:26] [karthink : VIEWER]: Ihor, quick question: Have you had the time to work on your refactoring of Org in the last two months?\r\n[20:27] [NP : VIEWER]: in one file\r\n[20:27] [NP : VIEWER]: yep\r\n[20:27] [karthink : VIEWER]: Haha\r\n[20:27] [karthink : VIEWER]: Okay, good to know\r\n[20:27] [NP : VIEWER]: \ud83d\ude01\r\n[20:27] [niklauz : VIEWER]: Oh Ihor whats the status of TZ-aware org-timestamps?\r\n[20:28] [niklauz : VIEWER]: Very cool \ud83d\ude0a \r\n[20:28] [yantar92 : MODERATOR]: https:\/\/list.orgmode.org\/orgmode\/m2zffjwlyy.fsf@cao.sh\/\r\n[20:28] yantar92 is now the presenter, set by yantar92\r\n[20:36] [NP : VIEWER]: IMHO opinion\r\n[20:36] [NP : VIEWER]: my idea is way easier than DOOM and spacemacs too\r\n[20:37] [NP : VIEWER]: what do you think ?\r\n[20:38] [NP : VIEWER]: @niklauz what do you think ?\r\n[20:38] [NP : VIEWER]: whay ?\r\n[20:38] [NP : VIEWER]: whay ?\r\n[20:38] [NP : VIEWER]: why ?\r\n[20:39] [NP : VIEWER]: exactly \r\n[20:39] [NP : VIEWER]: \ud83d\ude09\r\n[20:39] [NP : VIEWER]: \ud83d\ude01\r\n[20:39] [NP : VIEWER]: so did you get the whole idea ?\r\n[20:40] [NP : VIEWER]: @Ihor ?\r\n[20:40] [NP : VIEWER]: user only have to check checkboxes\r\n[20:40] [NP : VIEWER]: and if he eants he can read elisp to learn\r\n[20:40] [NP : VIEWER]: and modify\r\n[20:40] [NP : VIEWER]: Sacha just wrote this https:\/\/gist.githubusercontent.com\/sachac\/5eeac2c5b58802b1b4de7ed2bf567681\/raw\/bcf8cd76aa7aea92f5eb13fc24a9d8e20bb59744\/test.org\r\n[20:42] [niklauz : VIEWER]: \"the Warrior's Path\" \ud83d\ude01 \r\n[20:44] [NP : VIEWER]: my idea is just to spread (use-package) blocks into smallest src-blocks  (choices) for user to select individually and tangle them\r\n[20:44] [niklauz : VIEWER]: You may be interested in this, https:\/\/blog.tendollaradventure.com\/automating-story-logic-with-llms\/\r\n[20:45] [niklauz : VIEWER]: Have you looked at this, https:\/\/melpa.org\/#\/org-if ?\r\n[20:45] [niklauz : VIEWER]: (It's on my queue of things to learn aboutt)\r\n[20:46] [niklauz : VIEWER]: yup definitely pre-LLM \ud83d\ude01 \r\n[20:46] [niklauz : VIEWER]: I'm not sure it's usable, but caught my eye\r\n[20:49] [karthink : VIEWER]: Ah, okay\r\n[20:49] [karthink : VIEWER]: Thanks, I'll make a note\r\n[20:50] [niklauz : VIEWER]: thats a really good idea\r\n[20:50] [niklauz : VIEWER]: the capture might represent a research \/ dialog session?\r\n[20:51] [karthink : VIEWER]: That's nice\r\n[20:51] [karthink : VIEWER]: Is that with gptel?\r\n[20:52] [niklauz : VIEWER]: that helps address the gap between the ephemeral-ness of llm chats with the desire to integrate them (with context) into a knowledge management system.\r\n[20:52] [karthink : VIEWER]: Haha the pros and cons are all wrong\r\n[20:52] [niklauz : VIEWER]: the correct answer is \" ... there is none\" \ud83d\ude01 \r\n[20:53] [karthink : VIEWER]: And I think one of the packages was hallucinated\r\n[20:53] [karthink : VIEWER]: Yeah that's one of the synergies with Org mode\r\n[20:53] [niklauz : VIEWER]: very nice indeed\r\n[20:54] [niklauz : VIEWER]: (I was only joking)\r\n[20:55] [karthink : VIEWER]: gptel-org-branching-context\r\n[20:55] [niklauz : VIEWER]: oh wow\r\n[20:55] [karthink : VIEWER]: (Sorry, I'm in a room with another person who's in a separate meeting)\r\n[20:55] [niklauz : VIEWER]: that looks very useful\r\n[20:56] [karthink : VIEWER]: gptel-prompt-prefix-alist\r\n[20:56] [karthink : VIEWER]: gptel-response-prefix-alist\r\n[20:56] [karthink : VIEWER]: Ahh, yes.  Gemini loves to do that\r\n[20:57] [karthink : VIEWER]: I usually change it to bullet points in gptel-post-response-functions\r\n[20:57] [niklauz : VIEWER]: Gotta go - thanks Ihor, thanks all! Looking forward to next time \ud83d\ude0a \r\n[20:58] [karthink : VIEWER]: Ah, you can set it to be truncated from gptel-menu\r\n[20:58] [karthink : VIEWER]: (auto-truncated)\r\n[20:58] [NP : VIEWER]: @niklauz thanks for the presentation\r\n[20:58] [karthink : VIEWER]: I think it's behind (setq gptel-expert-options t)\r\n[20:59] [karthink : VIEWER]: It's the -n all previous responses option\r\n[20:59] [karthink : VIEWER]: But that's difficult because of token counting\r\n[20:59] [karthink : VIEWER]: To find the number of tokens is another API call\r\n[21:00] [karthink : VIEWER]: Number of past messages is a heuristic\r\n[21:00] [karthink : VIEWER]: The error is reported differently by each API\r\n[21:00] [karthink : VIEWER]: and there are 13+ APIs\r\n[21:00] [karthink : VIEWER]: But yeah, it can be handled for the major 2-3 APIs\r\n[21:01] [karthink : VIEWER]: And unhandled for the rest\r\n[21:01] [karthink : VIEWER]: Okay, I'll try to submit org-latex-preview in 2 weeks\r\n@Ihor I wish if you can re-read  my initial message now that the idea is clearer for you, I think that you will have a fresh new look at it.\r\nIf any ambiguity remains, please let me know, so I can clarify them.\r\n\r\nThank you for this meetup, and for the persons who presented their ideas.\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n\r\n","subject":"[BLOG] #18 [[bbb:OrgMeetup]] on Wed, May 14, 19:00 UTC+3"},{"date":"2025-05-22T15:39:06.449Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87y0uomzf5.fsf@hiecaq.org","message-id":"87y0uomzf5.fsf@hiecaq.org","config":false,"refs-count":2,"username":"hiecaq","related-refs":["87y0uomzf5.fsf@hiecaq.org"],"from":"this@hiecaq.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-edit-src-code with code argument is broken"},{"date":"2025-05-17T17:15:34.555Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87tt5jkvpj.fsf@localhost","message-id":"87tt5jkvpj.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["cc5fe2d4-0297-44f0-a326-4a3df452ad43@gmail.com"],"related-refs":["87tt5jkvpj.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] Should we allow search options for all links types? (was: [PATCH] lisp\/ox.el: Fix export of id links with search string)"},{"date":"2025-05-14T22:11:30.433Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/5C903F16-A491-41B4-84CB-12ACFE86B43E@gmail.com","message-id":"5C903F16-A491-41B4-84CB-12ACFE86B43E@gmail.com","config":false,"refs-count":9,"username":"Charles Choi","related-refs":["5C903F16-A491-41B4-84CB-12ACFE86B43E@gmail.com"],"from":"kickingvegas@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Double slash in body text not captured in Org Protocol [9.7.30 (9.7.30-84f18c @ \/Users\/cchoi\/.config\/emacs\/elpa\/org-9.7.30\/)]"},{"date":"2025-05-11T23:28:15.044Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87tt5qviej.fsf@k-7.ch","message-id":"87tt5qviej.fsf@k-7.ch","config":false,"refs-count":1,"username":"S\u00e9bastien Gendre","related-refs":["87tt5qviej.fsf@k-7.ch"],"from":"seb@k-7.ch","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] When call org-html-export-to-html from org-export-dispatch, ext-plist is empty with #+OPTIONS: set [9.7.11 (release_9.7.11 @ \/usr\/share\/emacs\/30.1\/lisp\/org\/)]"},{"date":"2025-05-11T14:58:35.334Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87o6vzfbby.fsf@","message-id":"87o6vzfbby.fsf@","config":false,"refs-count":1,"username":"prad","related-refs":["87o6vzfbby.fsf@"],"from":"prad@towardsfreedom.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] gc-lock.eld [9.7.26 (9.7.26-07e380 @ \/home\/pradmin\/.emacs.d\/elpa\/org-9.7.26\/)]"},{"date":"2025-05-07T18:24:33.993Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871pt0e0yz.fsf@localhost","message-id":"871pt0e0yz.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87h626dgop.fsf@localhost","874izugt2f.fsf@localhost","549697e6-b209-4e90-b0b6-5b5189d55b18@protonmail.com","m2tt5w3ev2.fsf@adamkovic.org"],"related-refs":["871pt0e0yz.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Adding custom indices for Texinfo export (and maybe unaffiliated dual-value keywords?)"},{"date":"2025-05-05T05:36:40.700Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CANVbq5mAU9fK-43smS4X5kvz-JTsSzfmrGzRH7eusPtNRZHWCQ@mail.gmail.com","message-id":"CANVbq5mAU9fK-43smS4X5kvz-JTsSzfmrGzRH7eusPtNRZHWCQ@mail.gmail.com","config":false,"refs-count":21,"username":"Kristoffer Balintona","related-refs":["CANVbq5=fb3z9tTRTk68P3daUaoCgiRhzhGd6N=DW98SUV1AGpw@mail.gmail.com","CANVbq5mAU9fK-43smS4X5kvz-JTsSzfmrGzRH7eusPtNRZHWCQ@mail.gmail.com"],"from":"krisbalintona@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Accept nil outline path for file+olp+datetree org-capture-templates target"},{"date":"2025-05-02T23:49:22.290Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CANVbq5=3nkTM1v=hJur1V+epg6zmZaCxi=Yai1F4Df4QmoCHTQ@mail.gmail.com","message-id":"CANVbq5=3nkTM1v=hJur1V+epg6zmZaCxi=Yai1F4Df4QmoCHTQ@mail.gmail.com","config":false,"refs-count":4,"username":"Kristoffer Balintona","related-refs":["CANVbq5=3nkTM1v=hJur1V+epg6zmZaCxi=Yai1F4Df4QmoCHTQ@mail.gmail.com"],"from":"krisbalintona@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] file+olp+datetree accepting function to select target file"},{"date":"2025-05-02T21:09:23.303Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/D9LZCDGXLR8W.32EJMLVWIJ938@critbase.net","message-id":"D9LZCDGXLR8W.32EJMLVWIJ938@critbase.net","config":false,"refs-count":5,"username":"critbase","related-refs":["D9LZCDGXLR8W.32EJMLVWIJ938@critbase.net"],"from":"critbase@critbase.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-capture-templates datetree does not respect org-blank-before-new-entry [9.8-pre (release_9.7.29-321-g277344 @ \/Users\/izanami\/.config\/emacs\/straight\/build\/org\/)]"},{"date":"2025-04-27T13:14:07.376Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87o6whpx52.fsf@localhost","message-id":"87o6whpx52.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87wmbcd3yv.fsf@christianmoe.com"],"related-refs":["87o6whpx52.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] ox-odt cannot be used with org-export-to-file (was: An error with org-export-to-file 'odt)"},{"date":"2025-04-27T12:53:45.762Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87tt69py3t.fsf@localhost","message-id":"87tt69py3t.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["UucNGZNz5mUe0_mo3kemzgKfrn_fpxtVMPyjNtOJAXhNJbFEcoPMu2QNhiEAjo09fmUW2nKwFSCJliq2JUQ5Yj6mLHApPgQ6hOEQF-qAPVk=@michaelgame.dev"],"related-refs":["87tt69py3t.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow entering time\/date range for :time-prompt capture template property (was: org-capture-fill-template %T drops end time)"},{"date":"2025-04-27T06:53:54.926Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8734duf6an.fsf@bzg.fr","message-id":"8734duf6an.fsf@bzg.fr","config":false,"refs-count":2,"username":"Bastien Guerry","references":["87o6wirw8t.fsf@gnu.org"],"related-refs":["8734duf6an.fsf@bzg.fr"],"from":"bzg@gnu.org","source-id":"emacs-orgmode@gnu.org","body":"Adding the [ANN] subject prefix to let the whole world know \\o\/\r\n\r\n> Worg is the community-driven documentation for Org. It complements the\r\n> Org reference manual as a resource that many users consult, with about\r\n> ~1K views per day.\r\n>\r\n> Worg is a Git repository consisting of .org files:\r\n> https:\/\/git.sr.ht\/~bzg\/worg.\r\n>\r\n> Worg files are exported as HTML and published to orgmode.org:\r\n> https:\/\/orgmode.org\/worg\r\n>\r\n> Taking care of Worg would help the Org community tremendously!\r\n>\r\n> Here is what the Worg maintainer should focus on:\r\n>\r\n> - The Worg website should be *well designed and accessible*.\r\n> - Worg content should be *well structured and easy to navigate*.\r\n> - Worg page should be *up to date* with the latest stable version of Org.\r\n> - Worg should be *a community project*, with active contributors and shared responsabilities.\r\n> - Worg is intended to be *an entry point to the larger Org ecosystem* by listing useful org add-ons and org contributors.\r\n>\r\n> Of course, the Worg maintainer doesn't have to do all this, he\/she can\r\n> rely on the Org community. But he\/she will be responsible for the Worg\r\n> as its maintainer, with the final say on critical decisions regarding\r\n> all these aspects.\r\n>\r\n> A minimum commitment of one hour per week is expected, but it is open\r\n> to more :)\r\n>\r\n> If you think you might be the right person for the job, please write\r\n> to Ihor (yantar92@posteo.net) and Bastien (bzg@gnu.org) explaining why\r\n> and we'll get in touch.\r\n>\r\n> Thanks!\r\n\r\n-- \r\n Bastien\r\n\r\n","subject":"[ANN] Re: Join the Org Mode project as the Worg maintainer"},{"date":"2025-04-27T06:42:34.396Z","vote":false,"archived-at":"","message-id":"878qnmgl9z.fsf@gnu.org","config":false,"refs-count":1,"username":"Bastien Guerry","references":["87o6wirw8t.fsf@gnu.org"],"related-refs":["878qnmgl9z.fsf@gnu.org"],"from":"bzg@gnu.org","source-id":"","body":"Bastien Guerry <bzg@gnu.org> writes:\r\n\r\n> Worg is the community-driven documentation for Org. It complements the\r\n> Org reference manual as a resource that many users consult, with about\r\n> ~1K views per day.\r\n>\r\n> Worg is a Git repository consisting of .org files:\r\n> https:\/\/git.sr.ht\/~bzg\/worg.\r\n>\r\n> Worg files are exported as HTML and published to orgmode.org:\r\n> https:\/\/orgmode.org\/worg\r\n>\r\n> Taking care of Worg would help the Org community tremendously!\r\n>\r\n> Here is what the Worg maintainer should focus on:\r\n>\r\n> - The Worg website should be *well designed and accessible*.\r\n> - Worg content should be *well structured and easy to navigate*.\r\n> - Worg page should be *up to date* with the latest stable version of Org.\r\n> - Worg should be *a community project*, with active contributors and shared responsabilities.\r\n> - Worg is intended to be *an entry point to the larger Org ecosystem* by listing useful org add-ons and org contributors.\r\n>\r\n> Of course, the Worg maintainer doesn't have to do all this, he\/she can\r\n> rely on the Org community. But he\/she will be responsible for the Worg\r\n> as its maintainer, with the final say on critical decisions regarding\r\n> all these aspects.\r\n>\r\n> A minimum commitment of one hour per week is expected, but it is open\r\n> to more :)\r\n>\r\n> If you think you might be the right person for the job, please write\r\n> to Ihor (yantar92@posteo.net) and Bastien (bzg@gnu.org) explaining why\r\n> and we'll get in touch.\r\n>\r\n> Thanks!\r\n\r\n-- \r\n Bastien\r\n","subject":"[ANN] Join the Org Mode project as the Worg maintainer"},{"date":"2025-04-24T08:58:41.400Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m234dy2b18.fsf@wz.ht","message-id":"m234dy2b18.fsf@wz.ht","config":false,"refs-count":4,"username":"Jordan Ellis Coppard","related-refs":["m234dy2b18.fsf@wz.ht"],"from":"jc+o.orgmode@wz.ht","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org fontification error [9.7.11 (release_9.7.11 @ \/Applications\/MacPorts\/Emacs.app\/Contents\/Resources\/lisp\/org\/)]"},{"date":"2025-04-22T16:31:10.452Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ecxkb1pv.fsf@localhost","message-id":"87ecxkb1pv.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87bjt6tx3a.fsf@localhost"],"related-refs":["87ecxkb1pv.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nHere are the meeting notes.\r\n\r\nTL;DR: timezone support; search support in HTML export; proposal\r\nto switch to lualatex as default pdf export engine; exporting\r\nnon-latin documents to pdf without config headache; nested special blocks;\r\nparser-based fontification; elisp inspector; inline special blocks;\r\norg-special-block-extras; noweb reference as macro equivalent inside\r\nsrc blocks; Captee - native macOS support for org-protocol and org-capture;\r\nbreadcrumb-mode\r\n\r\n- As usual, we started from the latest Emacs News\r\n  https:\/\/sachachua.com\/blog\/2025\/04\/2025-04-07-emacs-news\/\r\n\r\n- davemq asked about timezone support in Org mode\r\n  - We have discussed timezone support in the past and decided that\r\n    Org should eventually support timezones\r\n  - I even consolidated the discussion, proposing detailed timestamp\r\n    syntax with timezone support back in 2023\r\n    https:\/\/list.orgmode.org\/orgmode\/87tu063ox2.fsf@localhost\/\r\n    - The syntax was inspired by various ISO standards (including\r\n      https:\/\/www.rfc-editor.org\/rfc\/rfc3339.html), together with\r\n      Org-specific considerations. Feel free to dive into the long\r\n      discussion preceding my proposal (in the above link). The link\r\n      summarizes the most important points though; it is not necessary\r\n      to read all those 300+ emails in the thread.\r\n  - However, I simply do not have enough time to do everything I want\r\n    and have to prioritize (especially now, when I can only allocate\r\n    weekends for Org development)\r\n  - My main priority in terms of new major features is large Org\r\n    codebase refactor; timezone support comes later\r\n  - So, *if one wants to get timezone support, please go ahead and*\r\n    *work on the patch*. The first step will be adding the discussed\r\n    syntax into org-element.el. Please write to Org mailing list if\r\n    you are interested. See https:\/\/orgmode.org\/worg\/org-contribute.html\r\n\r\n- we then went through some recently proposed new Org features\r\n  - In https:\/\/list.orgmode.org\/orgmode\/87a5ev31ul.fsf@k-7.ch\/, S\u00e9bastien Gendre\r\n    expressed interest in adding search engine support to Org HTML export\r\n    - In particular, he proposed using https:\/\/pagefind.app\/ to generate\r\n      static search index, thus keeping exported HTML static\r\n    - Although we discussed generalization: if we are to add such a\r\n      feature we should ideally allow arbitrary search engines; not just\r\n      pagefind\r\n  - In https:\/\/list.orgmode.org\/CAO48Bk__cbR-acgyyeS6Buo3od8+wAFEHsT9yUY84RhGv0NT9A@mail.gmail.com\/T\/#m132726826a7348203288342c7cdf7bef82b9cbe9\r\n    Pedro Andres Aranda Gutierrez opened a discussion about changing the default latex\r\n    engine from pdflatex to lualatex\r\n    - This discussion originated from long-standing issue with pdflatex\r\n      when exporting non-latin characters\r\n      - pdflatex cannot easily export arbitrary languages; once it\r\n        encounters Chinese, Japanese, Cyrillic, Farci, etc, default settings\r\n\tcannot produce correct pdf\r\n      - same for emoji and generally UTF8 symbols\r\n      - There are various workarounds for pdflatex for specific languages, but\r\n\t1. These workarounds require knowing language in advance\r\n\t2. Workarounds work poorly or require explicitly marking specific language\r\n\t   in the Org source when several languages are used in the same document\r\n\t3. From Org perspective, it is a disaster, because it is\r\n           basically impossible to export arbitrary non-English org\r\n           files to pdf with pdflatex. We have to tell users figure\r\n           out things themselves for the most part\r\n      - Moreover, pdflatex is officially superseded by lualatex and\r\n        will be slowly deprecated in future (no feature parity with\r\n        lualatex in future releases)\r\n\thttps:\/\/www.texdev.net\/2024\/11\/05\/engine-news-from-the-latex-project\r\n      - xelatex is also officially the dead end and lualatex should be preferred\r\n      - However, lualatex is much slower compared to pdflatex\r\n\t- Karthink (the author of the new latex preview system) commented that\r\n\t  lualatex is so prohibitedly slow that we cannot practical\r\n          do live previews of latex formulas (mostly because preamble\r\n          pre-compilation is technically not possible with lualatex)\r\n\t  https:\/\/list.orgmode.org\/CAO48Bk__cbR-acgyyeS6Buo3od8+wAFEHsT9yUY84RhGv0NT9A@mail.gmail.com\/T\/#m379a3c41134c82a6b33da5474930b2fc7ef30898\r\n\t  - Although, with some Lua surgery, we may theoretically\r\n            implement preview server making lualatex spit preview pages on demand\r\n\t    (but who is going to write the patch?)\r\n\t    https:\/\/list.orgmode.org\/CAO48Bk__cbR-acgyyeS6Buo3od8+wAFEHsT9yUY84RhGv0NT9A@mail.gmail.com\/T\/#ma96cfcc80710fbbf3f169e2fe396d03dd0aa3b7a\r\n    - Still, Pedro suggested that we can improve things at least when\r\n      lualatex is explicitly selected and latex compiler\r\n      - In lualatex, we are not limited by the font choice and can use\r\n        full UTF8 support, reducing complexity of non-English document export\r\n\t- Still, some configuration is necessary on the user side\r\n\t  Emoji + Chinese (also, https:\/\/tex.stackexchange.com\/questions\/395941\/insert-an-emoticon-using-xelatex\/395943#395943):\r\n\t  https:\/\/tex.stackexchange.com\/questions\/304156\/how-would-i-go-about-adding-unicode-emoji-into-latex\/728116#728116\r\n\t  #+begin_src org\r\n\t    ,#+latex_compiler: lualatex\r\n\t    ,#+latex_header: \\usepackage[AUTO]{polyglossia}\r\n\t    ,#+latex_header: \\setmainfont{Sarasa Mono HC} % Replace with your desired UTF-8 font\r\n\t    ,#+latex_header_extra: \\newfontfamily\\emojifont{Noto Color Emoji} % Emoji support\r\n\t    ,* \u4f60\u53f7. \ud83d\ude3c\r\n\t    And mix with english.\r\n\t  #+end_src\r\n\t  Russian config from artsi0m (https:\/\/github.com\/artsi0m\/emacs-organizer\/blob\/bb6626c6346881c0ec260a12859701f0c5961c36\/ru-xelatex-template.org):\r\n          #+begin_src org\r\n\t    # -*- mode: org; -*-\r\n\t    ,#+latex_compiler: xelatex\r\n\t    ,#+latex_header: \\usepackage[AUTO]{polyglossia}\r\n\t    ,#+latex_header: \\setmainfont{Noto Sans}\r\n\t    ,#+latex_header: \\setmonofont{Iosevka}\r\n\t    ,#+latex_header: \\setdefaultlanguage{russian}\r\n\t    ,#+latex_header: \\usepackage{geometry}\r\n\t    ,#+latex_header: \\geometry{left=15mm, top=15mm, right=20mm, bottom=20mm}\r\n\t  #+end_src\r\n\t- We are currently discussing whether we can somehow configure\r\n          things automatically for lualatex (even if it is not the\r\n          default, such automatic configuration will be useful)\r\n\t  https:\/\/list.orgmode.org\/CAO48Bk_m9WV9vAG5He8N_FpQGxsZx3eTE259N7hQe_AjfVHkjg@mail.gmail.com\/T\/#t\r\n\t  - Steve Downey pointed that pandoc does something similar with fallback fonts\r\n\t    https:\/\/pandoc.org\/MANUAL.html#fonts:~:text=mainfontfallback%2C%20sansfontfallback,with%20lualatex\r\n    - During the meetup, I demoed exporting multi-language document, but using xelatex\r\n      - for some reason, lualatex took very long time and never finished compiling\r\n\t- (after the fact, I figured that lualatex was updating font\r\n          cache, which is why it took so long during the meetup)\r\n    - Zororg also suggested =\\usepackage{emoji}=\r\n      - this is slightly different story though\r\n      - This package is working around UTF8 problem by adding special commands\r\n\tto introduce emoji into pdf output: each emoji must be written\r\n        as =\\emoji{emoji_name}= command rather than actual emoji symbol\r\n\r\n- (I may not recall this correctly) Someone pointed that nested special blocks\r\n  do not get highlighted in Org\r\n  - This is a known problem of Org fontification\r\n    - I hope that it will be eventually addressed when we switch to\r\n      parser-based fontification\r\n      See https:\/\/git.sr.ht\/~yantar92\/org-mode\/log\/feature\/org-font-lock-element\/item\/lisp\r\n  - The parser recognized nested special blocks just fine\r\n  - I demoed this by calling M-: (org-element-parse-buffer)\r\n    and examining results with https:\/\/elpa.gnu.org\/packages\/inspector.html\r\n    - I have a custom command bound to M-: to inspect the return value\r\n      with inspector when called with prefix argument\r\n      https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#inspecting-objects-inside-profiler-or-evaluation-results\r\n\r\n- Steve Downey asked about customizing special block export\r\n  for different export backends\r\n  - There is https:\/\/github.com\/alhassy\/org-special-block-extras\r\n    package that does exactly this\r\n  - I also hope to provide custom export mechanism akin what we have for links\r\n    but for special blocks in future\r\n  - Also, there is a proposal (and initial patch) to implement a new\r\n    markup to Org - inline special blocks\r\n    https:\/\/list.orgmode.org\/orgmode\/875xwqj4tl.fsf@localhost\/\r\n    - This markup will, among other things allow custom export\r\n      (see my linked message with all the details)\r\n\r\n- Zororg asked whether there is a plan to allow\r\n  Org macros inside src blocks\r\n  - There is no such plan because we already have\r\n    noweb references serving similar purpose\r\n  - noweb references are somewhat more powerful, but not the same with macros\r\n  - One can use the following noweb reference block that directly uses macro definition\r\n    #+begin_src org\r\n      ,#+options: d:nil\r\n      ,#+macro: foo test test 2\r\n\r\n      {{{foo}}}\r\n\r\n      :noexport:\r\n      ,#+name: fooname\r\n      {{{foo}}}\r\n      :end:\r\n\r\n      ,#+name: noweb-foo\r\n      ,#+begin_src emacs-lisp :var x=fooname[] :eval export :exports results\r\n        (message x)\r\n      ,#+end_src\r\n\r\n      ,#+RESULTS:\r\n      : {{{foo}}}\r\n\r\n      ,#+begin_src emacs-lisp :noweb yes :exports code\r\n        <<noweb-foo()>>\r\n      ,#+end_src\r\n\r\n    #+end_src\r\n\r\n- kickingvegas showcased his new app he is developing\r\n  to support Org capture and Org protocol on macOS\r\n  - https:\/\/fosstodon.org\/@kickingvegas@sfba.social\/114314588128977624\r\n    https:\/\/github.com\/kickingvegas\/Captee\r\n  - There is a need in special app because macOS now forbids arbitrary\r\n    apps from using URL protocols and a code signed app must be used\r\n    instead of emacsclient (which is not code signed and will likely\r\n    never be)\r\n    - That's annoying, but Apple does not care\r\n  - The app also integrates with browser and can be used in place of\r\n    Org capture extensions (AFAIU)\r\n  - The app basically re-implements emacsclient (which is a tiny\r\n    wrapper around socket communication protocol)\r\n    - We discussed the protocol. It is really simple and can be examined\r\n      in Emacs source code\r\n    - The protocol did not change since forever, so the app should\r\n      work in all reasonable Emacs versions\r\n\r\n- Zororg asked about outline path displayed in my Emacs header line\r\n  inside Org files\r\n  - I am using https:\/\/github.com\/joaotavora\/breadcrumb\r\n\r\n:chat:\r\nThe latest Emacs News: \r\nhttps:\/\/sachachua.com\/blog\/2025\/04\/2025-04-07-emacs-news\/\r\n \r\n\r\n18:06\r\n\r\nme says:If you have any questions about Org mode, or a topic you want to discuss, feel free \r\n\r\n18:09\r\ndavemq\r\n\r\ndavemq says:The question of timezones in timestamps comes up again and again. I suspect it would be major surgery to support timezones. Any thoughts? \r\n\r\n18:12\r\n\r\ndavemq says:(Of course, I haven't read the code to try to figure it out) \r\n\r\n18:13\r\n\r\nme says:\r\nhttps:\/\/list.orgmode.org\/orgmode\/87tu063ox2.fsf@localhost\/\r\n \r\n\r\n18:16\r\n\r\nme says:This this timezone feature discussion \r\n\r\n18:16\r\ndavemq\r\n\r\ndavemq says:At least some of the syntax is in line with ISO-8601, looks like \r\n\r\n18:18\r\n\r\ndavemq says:A small matter of programming \r\n\r\n18:18\r\n\r\ndavemq says:Thanks! \r\n\r\n18:18\r\n\r\nme says:\r\nhttps:\/\/list.orgmode.org\/orgmode\/87a5ev31ul.fsf@k-7.ch\/\r\n \r\n\r\n18:25\r\nSD\r\nSteve Downey\r\n\r\nSteve Downey says:\r\nhttps:\/\/www.rfc-editor.org\/rfc\/rfc3339.html\r\n is a profile of ISO-8601 that you don't have to pay for to look at. \r\n\r\n18:25\r\n\r\nme says:\r\nhttps:\/\/pagefind.app\/\r\n \r\n\r\n18:25\r\n\r\nme says:static search engine for Org HTML export \r\n\r\n18:25\r\n\r\nme says:\r\nhttps:\/\/list.orgmode.org\/CAO48Bk__cbR-acgyyeS6Buo3od8+wAFEHsT9yUY84RhGv0NT9A@mail.gmail.com\/T\/#m132726826a7348203288342c7cdf7bef82b9cbe9\r\n \r\n\r\n18:27\r\n\r\nme says:on changing default latex export engine \r\n\r\n18:27\r\nSD\r\nSteve Downey\r\n\r\nSteve Downey says:Not having good support for emoji in pdflatex turns out to be a problem surprisingly often. \r\n\r\n18:31\r\nA\r\nartsi0m\r\n\r\nartsi0m says:I have my own template for writing org with xelatex\r\nhttps:\/\/github.com\/artsi0m\/emacs-organizer\/blob\/master\/ru-xelatex-template.org\r\n \r\n\r\n18:36\r\n\r\nartsi0m says:\\usepackage[AUTO]{polyglossia} \r\n\r\n18:38\r\n\r\nartsi0m says:\r\nhttps:\/\/tex.stackexchange.com\/a\/395943\r\n \r\n\r\n18:40\r\nZororg\r\n\r\nZororg says:I got emoji working with \\usepackage{emoji}\r\n\r\nthen \\emoji{ANY_NAME} \r\n\r\n18:45\r\nA\r\nartsi0m\r\n\r\nartsi0m says:Nice \r\n\r\n18:45\r\nbraam76 (Ilgar Gamidov)\r\n\r\nbraam76 (Ilgar Gamidov) says:I'm sorry. Do anyone talks right now? \r\n\r\n18:46\r\n\r\nbraam76 (Ilgar Gamidov) says:like at all \r\n\r\n18:46\r\nA\r\nartsi0m\r\n\r\nartsi0m says:I found another answer, that sujject using separate font for emojis, declaring it with fontspec\r\nhttps:\/\/tex.stackexchange.com\/a\/728116\r\n\r\n\\newfontface\\emojifont{Segoe UI Emoji}[Renderer=Harfbuzz]\r\nThe quick brown fox {\\emojifont \ud83d\ude3a\ud83d\udc45\ud83d\udc69\ud83c\udffd\u200d\ud83c\udf93\ud83d\udc69\ud83c\udffc\u200d\ud83c\udf93} jumps over the lazy dog \r\n\r\n18:47\r\nK\r\nkickingvegas\r\n\r\nkickingvegas says:ngl, seems like every emoji solution for *TeX is unnatural \r\n\r\n18:47\r\nZororg\r\n\r\nZororg says:ok i got emoji with normal way. \r\n\r\n18:48\r\n\r\nZororg says:use this both lines somewhere\r\n\r\n,#+latex_header: \\newfontface\\emojifont{Noto Color Emoji}[Renderer=Harfbuzz]\r\n\r\n\\emojifont{} \r\n\r\n18:49\r\n\r\nZororg says:for me it showed emoji in pdf \r\n\r\n18:49\r\nA\r\nartsi0m\r\n\r\nartsi0m says:Idk. It seems pretty normal to just set separate font in XeLaTeX. Although it would be much handy set it like main font with \\setemojifont. XeLaTeX is good with Unicode. It was developed specifically to support it \r\n\r\n18:50\r\nSD\r\nSteve Downey\r\n\r\nSteve Downey says:The downside is getting locked in to both a particular export format (latex) and the special markup for some characters. Pandoc does some extra work to support fallback fonts, but I don't know the code they are emitting. \r\nhttps:\/\/pandoc.org\/MANUAL.html#fonts:~:text=mainfontfallback%2C%20sansfontfallback,with%20lualatex\r\n. \r\n\r\n18:50\r\nZororg\r\n\r\nZororg says:no, just insert empty\r\n\r\n\\emojifont{}\r\n\r\nand you can have emoji anywhere \r\n\r\n18:51\r\navatar\r\nchaw\r\n\r\nchaw says:That is good to know, in general; thanks! \r\n\r\n18:53\r\n\r\nme says:\r\nhttps:\/\/www.texdev.net\/2024\/11\/05\/engine-news-from-the-latex-project\r\n \r\n\r\n18:53\r\n\r\nme says:LuaLaTex is the official future of tex \r\n\r\n18:53\r\n\r\nme says:xelatex is going to be obsoleted \r\n\r\n18:53\r\n\r\nme says:pdflatex is legacy (and all UTF problems) \r\n\r\n18:53\r\nbraam76 (Ilgar Gamidov)\r\n\r\nbraam76 (Ilgar Gamidov) says:i dont think jeff is talking to us \r\n\r\n\ud83d\ude2e\r\n\r\n18:55\r\nSD\r\nSteve Downey\r\n\r\nSteve Downey says:\r\nhttps:\/\/isocpp.org\/files\/papers\/P3514R0.html#org1792942\r\n \r\n\r\n18:57\r\nZ\r\nZororg\r\n\r\nZororg says:May i know what was that inspector? \r\n\r\n18:59\r\n\r\nme says:\r\nhttps:\/\/git.sr.ht\/~yantar92\/org-mode\/log\/feature\/org-font-lock-element\/item\/lisp\r\n \r\n\r\n19:01\r\nV\r\nvisuwesh\r\n\r\nvisuwesh says:zororg: \r\nhttps:\/\/elpa.gnu.org\/packages\/inspector.html\r\n ?  I wasn't in the meeting when you asked the qn \r\n\r\n19:02\r\nZ\r\nZororg\r\n\r\nZororg says:it supports org as well? \r\n\r\n19:03\r\n\r\nme says:\r\nhttps:\/\/github.com\/mmontone\/emacs-inspector\r\n \r\n\r\n19:03\r\n\r\nme says:\r\nhttps:\/\/github.com\/alhassy\/org-special-block-extras\r\n \r\n\r\n19:06\r\n\r\nme says:on exporting custom markup \r\n\r\n19:06\r\nZ\r\nZororg\r\n\r\nZororg says:Is there any thoughts\/plan on using org macro inside src blocks?\r\n\r\nLast time I wanted to use them for my site exporting \r\n\r\n19:06\r\n\r\nme says:\r\nhttps:\/\/list.orgmode.org\/orgmode\/875xwqj4tl.fsf@localhost\/\r\n \r\n\r\n19:10\r\n\r\nme says:on custom markup for Org with custom export, fontification, etc \r\n\r\n19:11\r\n\r\nme says:#+options: d:nil\r\n#+macro: foo test test 2\r\n\r\n{{{foo}}}\r\n\r\n:noexport:\r\n#+name: fooname\r\n{{{foo}}}\r\n\ud83d\udd1a\r\n\r\n#+name: noweb-foo\r\n#+begin_src emacs-lisp :var x=fooname[] :eval export :exports results\r\n(message x)\r\n#+end_src\r\n\r\n#+RESULTS:\r\n: {{{foo}}}\r\n\r\n#+begin_src emacs-lisp :noweb yes :exports code\r\n  <<noweb-foo()>>\r\n#+end_src \r\n\r\n19:15\r\nZ\r\nZororg\r\n\r\nZororg says:Ok got it. Thank you for showcasing similar workflow \r\n\r\n19:15\r\nK\r\nkickingvegas\r\n\r\nkickingvegas says:can give a demo of some pre-release work I've been doing to support org-protocol on macOS \r\n\r\n19:17\r\nZ\r\nZororg\r\n\r\nZororg says:yantar, why is your \r\nnotes.org\r\n having less lines? I'm sure it must be narrowed. Last time it was about 18K lines\r\n\r\nAnd whats with breadcrumb showing \"Topics > Software\" ?\r\nIs it any custom package\/code you wrote? \r\n\r\n19:18\r\nJT\r\nJeff Trull\r\n\r\nJeff Trull says:\u2764\ufe0f \r\n\r\n19:19\r\nZ\r\nZororg\r\n\r\nZororg says:whoa, the sound! Funny \ud83d\ude03 \r\n\r\n19:18\r\nJT\r\nJeff Trull\r\n\r\nJeff Trull says:I didn't expect that sorry \r\n\r\n19:19\r\n\r\nJeff Trull says:So much for the discreet emoji on my icon \r\n\r\n19:19\r\n\r\nJeff Trull says:Anyway derived exporters FTW \r\n\r\n\ud83d\udc4d\r\n\r\n19:20\r\n\r\nme says:\r\nhttps:\/\/github.com\/joaotavora\/breadcrumb\r\n \r\n\r\n19:20\r\nV\r\nvisuwesh\r\n\r\nvisuwesh says:yes \r\n\r\n19:21\r\nCarlo Tambuatco\r\n\r\nCarlo Tambuatco says:clear as mud \r\n\r\n19:25\r\nchaw\r\n\r\nchaw says:There is no way to add exceptions to the security policy? \r\n\r\n19:25\r\nCT\r\nCarlo Tambuatco\r\n\r\nCarlo Tambuatco says:This Scrim is a code signed app? \r\n\r\n19:28\r\nartsi0m\r\n\r\nartsi0m says:I am sorry, I have to leave. Thanks for the meetup \r\n\r\n19:29\r\nCT\r\nCarlo Tambuatco\r\n\r\nCarlo Tambuatco says:Cool \r\n\r\n19:33\r\nV\r\nvisuwesh\r\n\r\nvisuwesh says:there are some ugly details wrt finding the socket filename in linux \r\n\r\n19:34\r\n\r\nvisuwesh says:that sounds awfully restrictive \r\n\r\n19:37\r\n\r\nvisuwesh says:disallowing unix sockets that is \r\n\r\n19:37\r\nCT\r\nCarlo Tambuatco\r\n\r\nCarlo Tambuatco says:restrictive is the whole point \r\n\r\n19:37\r\nV\r\nvisuwesh\r\n\r\nvisuwesh says:yea, i dont get this whole security theatre in the end; maybe someday \r\n\r\n19:38\r\n\r\nvisuwesh says:oh yea, do you support multiple servers\/non-default server name \r\n\r\n19:39\r\n\r\nvisuwesh says:makes sense to me \r\n\r\n19:41\r\n\r\nvisuwesh says:for some reason i decided to use a non-defaulat server name c: \r\n\r\n19:41\r\nCT\r\nCarlo Tambuatco\r\n\r\nCarlo Tambuatco says:Is there a minimum version of emacs necessary? \r\n\r\n19:41\r\n\r\nCarlo Tambuatco says:You're using emacs 30.1 is that the minimum version? \r\n\r\n19:42\r\n\r\nCarlo Tambuatco says:Cool. I'm using 29.3 \r\n\r\n19:43\r\nV\r\nvisuwesh\r\n\r\nvisuwesh says:i don't think it has been touched recently (except the whole \"where do we keep the socket file in linux\" fiasco) \r\n\r\n19:45\r\nCT\r\nCarlo Tambuatco\r\n\r\nCarlo Tambuatco says:Could you demo markdown? \r\n\r\n19:49\r\n\r\nCarlo Tambuatco says:Okay nevermind \r\n\r\n19:49\r\nJT\r\nJeff Trull\r\n\r\nJeff Trull says:Thanks @kickingvegas I will refrain from emoji use but great presentation \r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[BLOG] #17 [[bbb:OrgMeetup]] on Wed, Apr 9, 19:00 UTC+3"},{"date":"2025-04-18T15:38:50.732Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/80ddecfd-315e-4fc2-a7ed-561e6b774cc2@mailbox.org","message-id":"80ddecfd-315e-4fc2-a7ed-561e6b774cc2@mailbox.org","config":false,"refs-count":1,"username":"Timo E.","related-refs":["80ddecfd-315e-4fc2-a7ed-561e6b774cc2@mailbox.org"],"from":"tengel@mailbox.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] wrong iCalendar export with diary-float [9.7.11 (release_9.7.11 @ \/usr\/share\/emacs\/30.1\/lisp\/org\/)]"},{"date":"2025-04-08T16:39:05.312Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87friitxvw.fsf@localhost","message-id":"87friitxvw.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87r04g1id3.fsf@localhost"],"related-refs":["87friitxvw.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nKinda late, but I gotta post the meetup notes anyway :)\r\nNot everything survived the memories, but I managed to write most parts\r\nshortly after the meetup, before I got busy with work.\r\n\r\nTL;DR: latex fontification slowness, org-font-lock-element branch,\r\nfast searching of Org buffer AST, evolving Org notes over years, org-merge-tool,\r\norg-crypt, org-crypt-refactor branch, GPG on Android, note-taking\r\npackages for Emacs, speed of opening many Org buffers, highlight-parentheses\r\n\r\n\r\nWe moved back to using BigBlueButton, kindly provided by Sasha Chua.\r\n\r\n- As usual, we started from the latest Emacs news\r\n  https:\/\/sachachua.com\/blog\/2025\/02\/2025-02-10-emacs-news\/\r\n\r\n- karthink complained about Org mode sometimes being slow when\r\n  ~org-highlight-latex-and-related~ is set to highlight latex fragments\r\n  - This is a known problem related to way too complex regexp used\r\n    to search for fragments (see ~org-latex-regexps~)\r\n  - The proper way to solve it is implementing fontificating via\r\n    parser (with object cache!)\r\n    [[https:\/\/orgmode.org\/list\/87ee7c9quk.fsf@localhost]]\r\n  - However, even adding object cache to the parser is not\r\n    trivial. The new =org-element-ast.el= library is one of the steps\r\n    in this direction. It will need to be followed by improving\r\n    =org-element= itself and then completely rewriting Org's\r\n    fontification as in\r\n    https:\/\/git.sr.ht\/~yantar92\/org-mode\/tree\/feature\/org-font-lock-element\/item\/lisp\/org-font-lock-core.el\r\n  - TL;DR: Not soon\r\n  - Another option could be using Org parser on the current\r\n    fontification code specifically for latex fragments\r\n    - The problem here is that ~org-element-context~ can have\r\n      quadratic complexity with number of markup objects in paragraph\r\n      (which is why having parser cache for objects is important)\r\n    - On the other side, the current approximate regexp-based approach\r\n      is proven to be slow. So, one may try using\r\n      ~org-element-context~ + simplified regexp and see how it\r\n      compares with the current gigantic regexp. If the performance is\r\n      improved, maybe we can go for it even without changes in the parser\r\n      - Example how to search for something and query the parser\r\n        #+begin_src emacs-lisp\r\n\t  (while (re-search-forward \"\\\\$\\\\|\\\\\\\\\\\\(?:[a-zA-Z[(]\\\\|\\\\\\\\[ \\t]*$\\\\|_ +\\\\)\" nil t)\r\n\t    (let ((object (org-element-context)))\r\n\t      (when (org-element-type-p object 'latex-fragment)\r\n\t        (message (buffer-substring-no-properties\r\n\t  \t\t(org-element-begin object)\r\n\t                  (org-element-end object)))\r\n\t        ;; do the fontification\r\n\t        )))\r\n        #+end_src\r\n      - The function doing fontification that needs to be changed is ~org-do-latex-and-related~\r\n\r\n- Jake asked about testing and changing note organization in Org mode\r\n  - He had a very specific idea about somehow maintaining multiple\r\n    outline\/file taxonomies in different git branches and\r\n    synchronizing them automatically\r\n  - He looked into our old GSoC project\r\n    https:\/\/orgmode.org\/worg\/org-contrib\/gsoc2012\/student-projects\/git-merge-tool\/manual.html\r\n    - org-merge-tool is Org syntax-aware implementation of git merge\r\n    - It is not meant to maintain multiple taxonomies but rather aims\r\n      at merging diverged versions of the same Org file\r\n  - In general, I doubt that there is a universal automatic solution to\r\n    transition between multiple Org file structures. One would need to\r\n    write a custom code depending on the specific personal structures\r\n  - That said, it is often the case that Org file structure changes\r\n    over time - types of information may change; common tasks may\r\n    change; experience with Org mode growth; etc etc\r\n  - I personally went through multiple refactors of my personal\r\n    knowledge bases over the 10+ years I am using Org mode\r\n  - I tend to approach such refactors slowly\r\n    + I do not try converting everything at once\r\n    + Instead, I add _new_ information into the new taxonomy while\r\n      keeping the old information as is\r\n    + After some time (when I make sure that the new taxonomy really\r\n      works), I slowly move pieces and bits of information from the\r\n      old taxonomy\r\n    + Such move may take anywhere between weeks and years. I usually\r\n      just create a repeating task to move a few bits from old to new\r\n      structure. Manually, spending ~5min per day (or more, if I have\r\n      mood\/time).\r\n  - The slow, manual approach works for arbitrary taxonomies\r\n\r\n- Zororg asked about using org-crypt\r\n  - org-crypt encrypts portions of Org files, keeping encrypted\r\n    version on disk while temporarily decrypting it via M-x\r\n    org-decrypt-entries (or just M-x org-reveal)\r\n  - the encrypted text is still plain text, so it can be synced as usual\r\n  - currently, org-crypt works best with gpg keys\r\n  - symmetric encryption also works, but Org will ask for a password\r\n    for each individual subtree that is going to be encrypted, which\r\n    is not always convenient\r\n    - there is a WIP branch on\r\n      https:\/\/git.sr.ht\/~yantar92\/org-mode\/tree\/feature\/org-crypt-refactor\r\n      that tries to improve symmetric encryption support among other things\r\n  - we went on discussing decrypting the org files on android\r\n  - I personally used\r\n    https:\/\/f-droid.org\/packages\/org.sufficientlysecure.keychain\/\r\n    for similar purposes. Openkeychain allows importing gpg keys on\r\n    Android securely or even reading gpg keys from a device via NFC\r\n    - but I never checked with actual .org files. Some Org viewers on\r\n      android might support encryption\/decryption\r\n\r\n- Zororg raised a topic about the abundance of note-taking packages\r\n  for Emacs over the last years\r\n  - We have org-gnosis, org-supertag, org-node, org-roam (of course),\r\n    denote, zetteldeft, orgr, RCD Notes, ekg, howm, hyperbole, etc\r\n    - https:\/\/github.com\/rtrppl\/orgrr\r\n    - https:\/\/github.com\/yibie\/org-supertag\r\n    - https:\/\/github.com\/org-roam\/org-roam\/\r\n    - https:\/\/github.com\/meedstrom\/org-node\r\n    - https:\/\/thanosapollo.org\/projects\/org-gnosis\/\r\n    - https:\/\/github.com\/EFLS\/zetteldeft\r\n    - https:\/\/github.com\/protesilaos\/denote\r\n    - https:\/\/kaorahi.github.io\/howm\/\r\n    - https:\/\/hyperscope.link\/3\/7\/1\/5\/5\/RCD-Notes-for-Emacs-37155.html\r\n      https:\/\/hyperscope.link\/\r\n    - https:\/\/github.com\/ahyatt\/ekg\r\n    - https:\/\/www.gnu.org\/software\/hyperbole\/\r\n  - Many of these packages are inspired by Zettelkasten ideas and linking\r\n  - Many are based on Org mode (or org-roam) and store data in plain org files\r\n  - Some use databases (ekg, hyperscope)\r\n  - denote, zetteldeft, hyperbole, and howm are using arbitrary plain\r\n    text (not just Org markup)\r\n  - I personally use a combination of plain Org mode and org-ql (for searching)\r\n    to manage my notes, todos, and bookmarks\r\n    - plain Org + id: links provide a way to link to arbitrary notes\r\n      from anywhere to anywhere in Org files\r\n    - org-ql should eventually be merged to Org mode upstream\r\n      https:\/\/github.com\/alphapapa\/org-ql\/issues\/409\r\n    - hopefully, inclusion of org-ql can pave the way to implement\r\n      other popular features like full search from in-buffer\r\n      completion, backlinks, etc\r\n      - maybe not the node graph; its usefulness is rather\r\n        questionable in practice (not when merely showing off)\r\n\t- I myself do have little success using similar graph\r\n          representations when exploring research literature\r\n          (https:\/\/www.connectedpapers.com\/). There is some value in\r\n          semantic similarity between nodes\r\n\t  - but similarity is different from direct citations and is\r\n            mostly useful when exploring new topics I do not yet know\r\n\t  - for notes, I can only imagine node graph to be useful on\r\n            really large note numbers + when I completely forget the\r\n            topic I am exploring\r\n  - https:\/\/github.com\/egh\/org-mode-zettelkasten\r\n\r\n- note: the part below is being written almost 2 month after the\r\n  meetup, so details might go missing or be distorted too much by\r\n  human memory. I've been warned\r\n\r\n- kathink (or visuweh, I no longer recall), raised a recurring topic\r\n  or somehow reducing initial startup time for agenda and org-ql.\r\n  In fresh Emacs with no Org buffers open, searching all the agenda\r\n  files may take fairly long time because all the Org buffers needs to\r\n  be opened, all the various hooks (org-mode-hook, and many other\r\n  hooks arranged by various packages) need to be evaluated\r\n  - Not only opening the buffers takes time, but some people (hello,\r\n    org-roam users) get annoyed by _all_ the agenda files being in the\r\n    buffer list\r\n    - although we may theoretically name buffers as \" invisible\"\r\n      (first space makes Emacs hide buffer)\r\n    - but then it is not clear what to do when user actually wants to\r\n      open such hidden Org buffer\r\n  - There is no easy universal cure for initial slowness, especially\r\n    when the slowdown happens in the hooks: some people modify Org\r\n    parser (todo keywords, tags, etc) in the hooks and bypassing them\r\n    will yield erroneous results\r\n  - some optimizations are still possible, but they usually revolve\r\n    around disabling some features (like in\r\n    ~org-agenda-inhibit-startup~). Avoiding this would require solving\r\n    a similar problem to the idea with hidden buffers\r\n\r\n- Zororg asked about how parenthesis are highlighted in my Elisp setup\r\n  - highlight-parentheses package\r\n\r\n:chat:\r\nsystem: Welcome to OrgMeetup! \r\n\r\n\r\n For help on using BigBlueButton see these (short) tutorial videos. \r\n\r\n\r\n To join the audio bridge click the speaker button. Use a headset to avoid causing background noise for others. \r\n\r\n\r\n This server is running BigBlueButton.\r\n \r\n  system: To invite someone to the meeting, send them this link: \r\n\r\n https:\/\/bbb.emacsverse.org\/rooms\/orgmeetup\/join\r\n[16:55] This message was deleted by \r\n[17:02] [yantar92 : MODERATOR]: The latest Emacs news: [https:\/\/sachachua.com\/blog\/2025\/02\/2025-02-10-emacs-news\/](https:\/\/sachachua.com\/blog\/2025\/02\/2025-02-10-emacs-news\/)\r\n[17:05] [William Denton : VIEWER]: Hello!\r\n[17:06] [William Denton : VIEWER]: I don't have any questions or problems, I just dropped in to see what happens.\r\n[17:06] [punchagan : VIEWER]: Same here. I'm here to say Hello!\r\n[17:09] [William Denton : VIEWER]: I'm laughing at \"This doesn't look so bad, actually.\"\r\n[17:10] [punchagan : VIEWER]: Haha!\r\n[17:20] [yantar92 : MODERATOR]: org-do-latex-and-related\r\n[17:27] [Jake : VIEWER]: I'm currently most interested in using git with my org-mode files so I can use topic branches to experiment with the structure of my org-mode data.  \r\n  \r\nBut I found the git driver for org-mode, so there may not actually be much to talk about!\r\n[17:29] [Jake : VIEWER]: I might have to demo something at some point to make it clear what I'm trying to do.\r\n[17:29] This message was deleted by \r\n[17:30] [Jake : VIEWER]: I'll have to prepare ahead of time so I don't waste everyone's time with setup.\r\n[17:30] This message was deleted by \r\n[17:30] [punchagan : VIEWER]: [https:\/\/orgmode.org\/worg\/org-contrib\/gsoc2012\/student-projects\/git-merge-tool\/manual.html](https:\/\/orgmode.org\/worg\/org-contrib\/gsoc2012\/student-projects\/git-merge-tool\/manual.html)  \r\n  \r\nI guess is the git driver for org-mode?\r\n[17:32] [punchagan : VIEWER]: I wanted to confirm with Jake if he was referring to that project, or something else. Thanks!\r\n[17:32] [Zororg : VIEWER]: Is org-crypt safe to use?  \r\n  \r\nAs in without any gpg key, I just want to sync org notes with android emacs and pc.  \r\n  \r\nAlso, anyway way to make it back crypted after decrypting it to just to read?\r\n[17:34] [Zororg : VIEWER]: I mean, after decrypting the entry I'd like to encrypt it back when i exit or close.\r\n[17:34] [Zororg : VIEWER]: Yes...\r\n[17:35] [Zororg : VIEWER]: But without gpg, it asks for password again..\r\n[17:35] [Zororg : VIEWER]: So, in other way, we can sync gpg key\/config with android termux?\r\n[17:36] [Zororg : VIEWER]: i think when i tried with gui android app, I was not able to access same gpg key\r\n[17:37] [yantar92 : MODERATOR]: [https:\/\/f-droid.org\/packages\/org.sufficientlysecure.keychain\/](https:\/\/f-droid.org\/packages\/org.sufficientlysecure.keychain\/)\r\n[17:37] [Zororg : VIEWER]: ig only termux way would work for emacs android app?\r\n[17:38] [Zororg : VIEWER]: other fdroid apps would work fine?\r\n[17:38] [Zororg : VIEWER]: Time to test then..  \r\nI will figure it out!  \r\n  \r\nThanks for taking the time!  \r\n  \r\nOthers can continue...\r\n[17:39] [William Denton : VIEWER]: Nothing from me ...\r\n[17:40] [Zororg : VIEWER]: What take you guys have on many org notes packages popping up in reddit or emacs community?\r\n[17:40] [Zororg : VIEWER]: org-gnosis, org-supertag, org-node.... many similar names\r\n[17:40] [Zororg : VIEWER]: I tried most of them, and came back to vanilla org  \r\n  \r\nhowm was good\r\n[17:41] [William Denton : VIEWER]: I just heard about this, but it turns out to be a couple of years old.   \r\n[https:\/\/github.com\/rtrppl\/orgrr](https:\/\/github.com\/rtrppl\/orgrr)\r\n[17:44] [oylenshpeegul : VIEWER]: org-node seems way to easy to confuse with org-mode\r\n[17:44] [oylenshpeegul : VIEWER]: (naming things is hard)\r\n[17:44] [William Denton : VIEWER]: I've never tried any of these note-taking systems, but I take a lot of notes in Org. Does anyone here use them?\r\n[17:44] [artsi0m : VIEWER]: I wrote an article about my system that integrates howm with org-drill, but it is already mentioned on the emacs news.\r\n[17:45] [Zororg : VIEWER]: All other packages embrace many small files. So they help in linking, finding mostly\r\n[17:45] [William Denton : VIEWER]: What's the URL?\r\n[17:46] [artsi0m : VIEWER]: [https:\/\/github.com\/artsi0m\/posts\/blob\/master\/2025-01-22-195006.org](https:\/\/github.com\/artsi0m\/posts\/blob\/master\/2025-01-22-195006.org)\r\n[17:46] [karthink : VIEWER]: There's also ekg, which has a different approach\r\n[17:46] [William Denton : VIEWER]: Thanks, I'll read that.\r\n[17:49] [yantar92 : MODERATOR]: RCD Notes\r\n[17:50] [yantar92 : MODERATOR]: Jean Louis  is the author\r\n[17:50] [yantar92 : MODERATOR]: similar to ekg\r\n[17:54] [karthink : VIEWER]: Ihor how many ids do you have in org-id-locations? (length (map-keys org-id-locations))\r\n[17:54] [William Denton : VIEWER]: I need to leave. Thanks for the session!\r\n[17:54] [Zororg : VIEWER]: I have 231\r\n[17:55] [Jake : VIEWER]: Here's a link that talks about how to get some \"zettelkasten\" features (like backlinks) with just org. Might be relevant: [https:\/\/github.com\/egh\/org-mode-zettelkasten](https:\/\/github.com\/egh\/org-mode-zettelkasten)\r\n[18:00] [punchagan : VIEWER]: I need to leave too! Thanks!\r\n[18:09] [Zororg : VIEWER]: org-super-links helps with that.\r\n[18:09] [Zororg : VIEWER]: or org-ql + embark store link?\r\n[18:15] [Zororg : VIEWER]: Nobody uses those graph.\r\n[18:15] [Zororg : VIEWER]: Maybe trees help as in sibling and childs.  \r\n  \r\nI do narrow by tags, so thats good there\r\n[18:15] [visuwesh : VIEWER]: Nic asks what's it useful for every time it comes up on r\/emacs and there's never a convincing answer\r\n[18:16] [visuwesh : VIEWER]: same here, I can't hear Ihor\r\n[18:17] [oylenshpeegul : VIEWER]: ditto...i could hear karthink\r\n[18:17] [oylenshpeegul : VIEWER]: yes\r\n[18:21] [Zororg : VIEWER]: pause...?\r\n[18:22] [Jake : VIEWER]: I think I could present if there ends up being enough time. I have an example of the problem I'm trying to solve.\r\n[18:22] This message was deleted by \r\n[18:24] [visuwesh : VIEWER]: I remember seeing an mastodon post about adding a capf for exactly linking to headings.  You just had to type @ and an org-id link would be inserted... I tried searching for it but it is essentially impossible to search for anything in mastodon \ud83d\ude10\r\n[18:25] [Zororg : VIEWER]: org-ql-find + embark (embark-org-insert-link bound to j\r\n[18:25] [visuwesh : VIEWER]: Yea, I think it was powered by org-ql\r\n[18:25] [visuwesh : VIEWER]: The capf looked more ergonomic than a command\r\n[18:25] [visuwesh : VIEWER]: Is that bug fixed where it would err if [[* was on the beginning of line? or some such?\r\n[18:26] [visuwesh : VIEWER]: ah it was something else\r\n[18:28] [Zororg : VIEWER]: there is org-ql-find-in-org-directory\r\n[18:28] [Jake : VIEWER]: This is the solution I use for link completion [https:\/\/github.com\/egh\/org-mode-zettelkasten\/blob\/master\/Link%20concepts.org](https:\/\/github.com\/egh\/org-mode-zettelkasten\/blob\/master\/Link%20concepts.org)\r\n[18:28] [visuwesh : VIEWER]: (org-ql-find (let (ret)  \r\n               (maphash (lambda (_ file)  \r\n                          (unless (member file ret)  \r\n                            (push file ret)))  \r\n                org-id-locations)  \r\n               ret))\r\n[18:28] [visuwesh : VIEWER]: I don't remmeber if there exists such a command already\r\n[18:35] [yantar92 : MODERATOR]: org-agenda-prepare-buffers\r\n[18:37] [yantar92 : MODERATOR]: org-id-get-with-outline-path-completion\r\n[18:37] [yantar92 : MODERATOR]: for id completion (built-in)\r\n[18:37] [Zororg : VIEWER]: what was your paren highlight method?  \r\n  \r\nit highlighted multiple pair parens\r\n[18:37] [yantar92 : MODERATOR]: highlight-parentheses\r\n[18:38] [yantar92 : MODERATOR]: package\r\n[18:38] [Zororg : VIEWER]: okay\r\n[18:38] This message was deleted by \r\n[18:38] [Zororg : VIEWER]: xdg-desktop-portal-gnome gives screen sharing\r\n[18:38] [Zororg : VIEWER]: Which wm?\r\n[18:41] This message was deleted by \r\n[18:44] [Zororg : VIEWER]: gtg. Thanks for the meet and discussions! Cheers \ud83d\ude09\r\n[18:49] [Jake : VIEWER]: River. I've probably goofed up configuring the portals somehow.\r\n[18:58] [yantar92 : MODERATOR]: (while (re-search-forward org-property-drawer-re)  \r\n    (let ((drawer (org-element-at-point)))  \r\n      (when (org-element-type-p drawer 'property-drawer)  \r\n        (delete-region (org-element-begin drawer) (org-element-end drawer)))))\r\n[19:02] [Jake : VIEWER]: gtg! bye everybody\r\n[19:02] [oylenshpeegul : VIEWER]: Me too. Thanks all!\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode maintainer,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[BLOG] #16 [[bbb:OrgMeetup]] on Wed, Feb 12, 19:00 UTC+3"},{"date":"2025-03-25T19:10:06.689Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2zfh9nd10.fsf@adamkovic.org","message-id":"m2zfh9nd10.fsf@adamkovic.org","config":false,"refs-count":4,"username":"Rudolf Adamkovi\u010d","references":["877c4egtw1.fsf@localhost","20250321135524.26681-1-rudolf@adamkovic.org"],"related-refs":["m2zfh9nd10.fsf@adamkovic.org","m2ecyjnpsa.fsf@adamkovic.org"],"from":"rudolf@adamkovic.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/m2zfh9nd10.fsf@adamkovic.org","source-id":"emacs-orgmode@gnu.org","patch-body":"From b1cc7d9085ab4fc47a7b8196a873d1e5a755d567 Mon Sep 17 00:00:00 2001\r\nFrom: =?UTF-8?q?Rudolf=20Adamkovi=C4=8D?= <rudolf@adamkovic.org>\r\nDate: Fri, 21 Mar 2025 14:25:05 +0100\r\nSubject: [PATCH] Capitalize JavaScript correctly\r\n\r\n* doc\/org-manual.org (Exporting to minimal HTML):\r\n* etc\/ORG-NEWS (Add ~:session~ support of ob-js for js-comint):\r\n* lisp\/ob-js.el (org-babel-js-function-wrapper):\r\n(org-babel-execute:js):\r\n(org-babel-variable-assignments:js):\r\n(org-babel-js-initiate-session):\r\n* lisp\/ox-html.el (org-html-style-default):\r\n(org-html-klipse-selection-script):\r\nRe-capitalize \"Javascript\" to JavaScript.\r\n---\r\n doc\/org-manual.org | 2 +-\r\n etc\/ORG-NEWS       | 2 +-\r\n lisp\/ob-js.el      | 9 +++++----\r\n lisp\/ox-html.el    | 4 ++--\r\n 4 files changed, 9 insertions(+), 8 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 1f4fe5a6f..7561c0d62 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -13554,7 +13554,7 @@ name, and date.\r\n \r\n *** Exporting to minimal HTML\r\n :PROPERTIES:\r\n-:DESCRIPTION: Exporting HTML without CSS, Javascript, etc.\r\n+:DESCRIPTION: Exporting HTML without CSS, JavaScript, etc.\r\n :ALT_TITLE: Bare HTML\r\n :END:\r\n \r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 332586f4f..46a67eaab 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -4763,7 +4763,7 @@ wget -c \"https:\/\/ben.akrin.com\/crackzor\/crackzor_1.0.c.gz\"\r\n #+end_example\r\n \r\n *** Add ~:session~ support of ob-js for js-comint\r\n-#+begin_src js :session \"*Javascript REPL*\"\r\n+#+begin_src js :session \"*JavaScript REPL*\"\r\n console.log(\"stardiviner\")\r\n #+end_src\r\n \r\ndiff --git a\/lisp\/ob-js.el b\/lisp\/ob-js.el\r\nindex 309f04929..816aa972e 100644\r\n--- a\/lisp\/ob-js.el\r\n+++ b\/lisp\/ob-js.el\r\n@@ -1,4 +1,4 @@\r\n-;;; ob-js.el --- Babel Functions for Javascript      -*- lexical-binding: t; -*-\r\n+;;; ob-js.el --- Babel Functions for JavaScript      -*- lexical-binding: t; -*-\r\n \r\n ;; Copyright (C) 2010-2025 Free Software Foundation, Inc.\r\n \r\n@@ -73,10 +73,10 @@\r\n   ;; parenthesis are not shadowed if the last line of the body is a\r\n   ;; line comment.\r\n   \"require('process').stdout.write(require('util').inspect(function(){%s\\n}()));\"\r\n-  \"Javascript code to print value of body.\")\r\n+  \"JavaScript code to print value of body.\")\r\n \r\n (defun org-babel-execute:js (body params)\r\n-  \"Execute Javascript BODY according to PARAMS.\r\n+  \"Execute JavaScript BODY according to PARAMS.\r\n This function is called by `org-babel-execute-src-block'.\"\r\n   (let* ((org-babel-js-cmd (or (cdr (assq :cmd params)) org-babel-js-cmd))\r\n \t (session (cdr (assq :session params)))\r\n@@ -158,7 +158,7 @@ specifying a variable of the same value.\"\r\n     session))\r\n \r\n (defun org-babel-variable-assignments:js (params)\r\n-  \"Return list of Javascript statements assigning the block's variables.\r\n+  \"Return list of JavaScript statements assigning the block's variables.\r\n The variables are defined in PARAMS.\"\r\n   (mapcar\r\n    (lambda (pair) (format \"var %s=%s;\"\r\n@@ -183,6 +183,7 @@ Return the initialized session.\"\r\n \t(run-skewer)\r\n \t(skewer-repl)\r\n \tsession-buffer)))\r\n+   ;; SIC, JavaScript miscapitalized in `js-comint.el'.\r\n    ((string= \"*Javascript REPL*\" session)\r\n     (org-require-package 'js-comint)\r\n     (let ((session-buffer \"*Javascript REPL*\"))\r\ndiff --git a\/lisp\/ox-html.el b\/lisp\/ox-html.el\r\nindex 321f263cd..2f4ec12e2 100644\r\n--- a\/lisp\/ox-html.el\r\n+++ b\/lisp\/ox-html.el\r\n@@ -332,7 +332,7 @@ This affects IDs that are determined from the ID property.\")\r\n   pre.src-haskell:before { content: 'Haskell'; }\r\n   pre.src-hledger:before { content: 'hledger'; }\r\n   pre.src-java:before { content: 'Java'; }\r\n-  pre.src-js:before { content: 'Javascript'; }\r\n+  pre.src-js:before { content: 'JavaScript'; }\r\n   pre.src-latex:before { content: 'LaTeX'; }\r\n   pre.src-ledger:before { content: 'Ledger'; }\r\n   pre.src-lisp:before { content: 'Lisp'; }\r\n@@ -1651,7 +1651,7 @@ https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Mobile\/Viewport_meta_tag\"\r\n                              selector_eval_scheme: '.src-scheme',\r\n                              selector: '.src-clojure',\r\n                              selector_eval_ruby: '.src-ruby'};\"\r\n-  \"Javascript snippet to activate klipse.\"\r\n+  \"JavaScript snippet to activate klipse.\"\r\n   :group 'org-export-html\r\n   :package-version '(Org . \"9.1\")\r\n   :type 'string)\r\n-- \r\n2.39.5 (Apple Git-154)\r\n\r\n","subject":"Re: [PATCH] Capitalize JavaScript correctly"},{"date":"2025-03-25T05:23:43.907Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CAHBEFFCt+1YL6N5sjss_vtjnR6oz30FVOWhZjj_WDYBUXJjJvA@mail.gmail.com","message-id":"CAHBEFFCt+1YL6N5sjss_vtjnR6oz30FVOWhZjj_WDYBUXJjJvA@mail.gmail.com","config":false,"refs-count":3,"username":"Elle Najt","related-refs":["CAHBEFFCt+1YL6N5sjss_vtjnR6oz30FVOWhZjj_WDYBUXJjJvA@mail.gmail.com"],"from":"lnajt4@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org babel overwriting source block outputs when using async + session"},{"date":"2025-03-18T17:37:00.550Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87wmcm9rc6.fsf@localhost","message-id":"87wmcm9rc6.fsf@localhost","config":false,"refs-count":5,"username":"Ihor Radchenko","references":["87iko93wkj.fsf@localhost","87iko733eg.fsf@gmail.com","87a59l3q65.fsf@gmail.com","874izvnxcz.fsf@gmail.com","877c4o4sx0.fsf@gmail.com","87wmco3noa.fsf@localhost","87ldt37dub.fsf@localhost","87zfhk3opb.fsf@localhost"],"related-refs":["87v7rshw9o.fsf@localhost","87wmcm9rc6.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87wmcm9rc6.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/lisp\/org-persist.el b\/lisp\/org-persist.el\r\nindex a639699d93..ab290bbc26 100644\r\n--- a\/lisp\/org-persist.el\r\n+++ b\/lisp\/org-persist.el\r\n@@ -492,7 +492,8 @@ (defun org-persist--write-elisp-file\r\n     ;; date. This prevents situation when two Emacs sessions are writing\r\n     ;; different data under the same cache key, but do not update the\r\n     ;; index metadata about the cache data written (e.g. hash).\r\n-    (when (or inhibit-writing-index (org-persist--save-index))\r\n+    (when t\r\n+      ;; (or inhibit-writing-index (org-persist--save-index))\r\n       (unless (file-exists-p (file-name-directory file))\r\n         (make-directory (file-name-directory file) t))\r\n       ;; Do not write to FILE directly.  Another Emacs instance may be\r\n@@ -1007,6 +1008,7 @@ (cl-defun org-persist-register (container &optional associated &rest misc\r\n When WRITE-IMMEDIATELY is non-nil, the return value will be the same\r\n with `org-persist-write'.\"\r\n   (unless org-persist--index (org-persist--load-index))\r\n+  (org-persist--merge-index-with-disk)\r\n   (setq container (org-persist--normalize-container container))\r\n   (when inherit\r\n     (setq inherit (org-persist--normalize-container inherit))\r\n@@ -1034,6 +1036,7 @@ (cl-defun org-persist-unregister (container &optional associated &key remove-rel\r\n When REMOVE-RELATED is non-nil, remove all the containers stored with\r\n the CONTAINER as well.\"\r\n   (unless org-persist--index (org-persist--load-index))\r\n+  (org-persist--merge-index-with-disk)\r\n   (setq container (org-persist--normalize-container container))\r\n   (if (eq associated 'all)\r\n       (mapc (lambda (collection)\r\n@@ -1071,6 +1074,7 @@ (cl-defun org-persist-read (container &optional associated hash-must-match load\r\n     (org-persist-read \\\"My data\\\" nil nil nil\r\n                       :read-related t) ; => (\\\"My data\\\" \\\"test\\\")\"\r\n   (unless org-persist--index (org-persist--load-index))\r\n+  (org-persist--merge-index-with-disk)\r\n   (setq associated (org-persist--normalize-associated associated))\r\n   (setq container (org-persist--normalize-container container))\r\n   (let* ((collection (org-persist--find-index `(:container ,container :associated ,associated)))\r\n@@ -1119,6 +1123,7 @@ (cl-defun org-persist-load (container &optional associated hash-must-match &key\r\n (defun org-persist-load-all (&optional associated)\r\n   \"Restore all the persistent data associated with ASSOCIATED.\"\r\n   (unless org-persist--index (org-persist--load-index))\r\n+  (org-persist--merge-index-with-disk)\r\n   (setq associated (org-persist--normalize-associated associated))\r\n   (let (all-containers)\r\n     (dolist (collection org-persist--index)\r\n@@ -1164,16 +1169,18 @@ (defun org-persist-write (container &optional associated ignore-return)\r\n              (seq-find (lambda (v)\r\n                          (run-hook-with-args-until-success 'org-persist-before-write-hook v associated))\r\n                        (plist-get collection :container)))\r\n-      (let ((file (org-file-name-concat org-persist-directory (plist-get collection :persist-file)))\r\n-            (data (mapcar (lambda (c) (cons c (org-persist-write:generic c collection)))\r\n-                          (plist-get collection :container))))\r\n-        (org-persist--write-elisp-file file data)\r\n-        (or ignore-return (org-persist-read container associated))))))\r\n+      (when (or (file-exists-p org-persist-directory) (org-persist--save-index))\r\n+        (let ((file (org-file-name-concat org-persist-directory (plist-get collection :persist-file)))\r\n+              (data (mapcar (lambda (c) (cons c (org-persist-write:generic c collection)))\r\n+                            (plist-get collection :container))))\r\n+          (org-persist--write-elisp-file file data)\r\n+          (or ignore-return (org-persist-read container associated)))))))\r\n \r\n (defun org-persist-write-all (&optional associated)\r\n   \"Save all the persistent data.\r\n When ASSOCIATED is non-nil, only save the matching data.\"\r\n   (unless org-persist--index (org-persist--load-index))\r\n+  (org-persist--merge-index-with-disk)\r\n   (setq associated (org-persist--normalize-associated associated))\r\n   (if\r\n       (and (equal 1 (length org-persist--index))\r\n","subject":"Re: org-persist-write:index takes minutes to run"},{"date":"2025-03-16T07:38:48.365Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87o6y1e8bh.fsf@localhost","message-id":"87o6y1e8bh.fsf@localhost","config":false,"refs-count":6,"username":"Ihor Radchenko","references":["878qp6f26y.fsf@dod.no","877c4rmsph.fsf@dod.no","8734ffmdhp.fsf@dod.no","87tt7vzdfq.fsf@localhost","87wmd9by6u.fsf@dod.no","87o6y2ivt4.fsf@localhost","87msdrw5qt.fsf@dod.no","87cyem2lb4.fsf@localhost","87bju78lkm.fsf@localhost"],"related-refs":["87o6y1e8bh.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87o6y1e8bh.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 4d27f5ca930e38a72e44e15368c84db985adbcd4 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <4d27f5ca930e38a72e44e15368c84db985adbcd4.1742110532.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Wed, 12 Mar 2025 18:45:11 +0100\r\nSubject: [PATCH v3] org-mode: Be more aggressive setting tab-width to 8\r\n\r\n* lisp\/org.el (org--set-tab-width): New helper to set `tab-width'.\r\n(org-mode): Override file-local and directory-local settings for\r\n`tab-width', if any.  With non-standard `tab-width', parser cannot\r\nwork properly.\r\n\r\nReported-by: Steinar Bang <sb@dod.no>\r\nLink: https:\/\/orgmode.org\/list\/87msdrw5qt.fsf@dod.no\r\n---\r\n lisp\/org.el | 15 ++++++++++++++-\r\n 1 file changed, 14 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex bc61a7c462..24c33d9cc0 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -4970,6 +4970,10 @@ (defvar org-mode-tags-syntax-table\r\n     st)\r\n   \"Syntax table including \\\"@\\\" and \\\"_\\\" as word constituents.\")\r\n \r\n+(defun org--set-tab-width (&rest _)\r\n+  \"Set `tab-width' to be 8.\"\r\n+  (setq-local tab-width 8))\r\n+\r\n ;;;###autoload\r\n (define-derived-mode org-mode outline-mode \"Org\"\r\n   \"Outline-based notes management and organizer, alias\r\n@@ -4992,7 +4996,16 @@ (define-derived-mode org-mode outline-mode \"Org\"\r\n   (setq-local org-mode-loading t)\r\n   ;; Force tab width - indentation is significant in lists, so we need\r\n   ;; to make sure that it is consistent across configurations.\r\n-  (setq-local tab-width 8)\r\n+  (org--set-tab-width)\r\n+  ;; Really force it, even if dir-locals or file-locals set it - we\r\n+  ;; need tab-width = 8 as a part of Org syntax.\r\n+  (add-hook 'hack-local-variables-hook\r\n+            #'org--set-tab-width 90 'local)\r\n+  ;; In Emacs <30, editorconfig-mode uses advices, so we cannot rely\r\n+  ;; upon `hack-local-variables-hook' to run after editorconfig\r\n+  ;; tab-width settings are applied.\r\n+  (add-hook 'editorconfig-after-apply-functions\r\n+            #'org--set-tab-width 90 'local)\r\n   (org-load-modules-maybe)\r\n   (when org-agenda-file-menu-enabled\r\n     (org-install-agenda-files-menu))\r\n-- \r\n2.47.1\r\n\r\n","subject":"Re: [BUG] Got error opening existing org file in emacs 30.1 [9.7.11 (release_9.7.11 @ \/usr\/share\/emacs\/30.1\/lisp\/org\/)]"},{"date":"2025-03-04T22:23:10.114Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/94EE11C5-91CB-47F1-B753-53CE0D0F4CD5@gmail.com","message-id":"94EE11C5-91CB-47F1-B753-53CE0D0F4CD5@gmail.com","config":false,"refs-count":3,"username":"Charles Choi","related-refs":["94EE11C5-91CB-47F1-B753-53CE0D0F4CD5@gmail.com"],"from":"kickingvegas@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-persist--refresh-gc-lock now showing up after update to 30.1 [9.7.24 (9.7.24-7fa7a5 @ \/Users\/cchoi\/.config\/emacs\/elpa\/org-9.7.24\/)]"},{"date":"2025-02-25T05:53:43.906Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87frk2tvvm.fsf@gmail.com","message-id":"87frk2tvvm.fsf@gmail.com","config":false,"refs-count":5,"username":"Visuwesh","references":["87eczp6lnf.fsf@localhost","87r09betap.fsf@gmail.com","87ikunrk8e.fsf@localhost","87msk7wmlj.fsf@gmail.com","a7d4e731-1af6-4ce9-9f4d-d49ddcf5750d@cas.cat","877c5i81mr.fsf@localhost","87o6ytth4y.fsf@gmail.com"],"related-refs":["87frk2tvvm.fsf@gmail.com","a7d4e731-1af6-4ce9-9f4d-d49ddcf5750d@cas.cat"],"from":"visuweshm@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87frk2tvvm.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 448387e7645623f29446986d529ce0b388477f77 Mon Sep 17 00:00:00 2001\r\nFrom: Visuwesh <visuweshm@gmail.com>\r\nDate: Tue, 25 Feb 2025 11:17:34 +0530\r\nSubject: [PATCH] Respect `org-file-link-type' in `yank-media' and DND handlers\r\n\r\n* lisp\/ol.el (org-link--normalise-filename): New function...\r\n(org-insert-link): extracted from here.  Use it\r\n* lisp\/org.el (org--image-yank-media-handler)\r\n(org--dnd-local-file-handler, org--dnd-attach-file)\r\n(org--dnd-xds-function): Respect the value of `org-file-link-type'\r\nwhen inserting file: links.\r\n* etc\/ORG-NEWS (Miscellaneous): Announce the change.\r\n\r\nReported-by: pinmacs <pinmacs@cas.cat>\r\nLink: https:\/\/list.orgmode.org\/orgmode\/a7d4e731-1af6-4ce9-9f4d-d49ddcf5750d@cas.cat\r\n---\r\n etc\/ORG-NEWS |  5 +++++\r\n lisp\/ol.el   | 49 ++++++++++++++++++++++++++++---------------------\r\n lisp\/org.el  | 23 ++++++++++++++---------\r\n 3 files changed, 47 insertions(+), 30 deletions(-)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 9eb4f711c..e39e06b9e 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -416,6 +416,11 @@ capture ~:tree-type~ options]], the internal variable\r\n undocumented helper function ~org-datetree-insert-line~.\r\n \r\n ** Miscellaneous\r\n+*** ~yank-media~ and DND handlers now honor the user option ~org-file-link-type~\r\n+\r\n+When inserting file: links, ~yank-media~ and DND handlers now respect\r\n+the user option ~org-file-link-type~.\r\n+\r\n *** ox-man: Support specifying =#+DATE:= and ~org-export-with-date~\r\n \r\n Previously, ox-man ignored =#+DATE:= keyword even when\r\ndiff --git a\/lisp\/ol.el b\/lisp\/ol.el\r\nindex b456f79e6..e6acf5ad6 100644\r\n--- a\/lisp\/ol.el\r\n+++ b\/lisp\/ol.el\r\n@@ -2565,6 +2565,31 @@ (defun org-store-link (arg &optional interactive?)\r\n             (org-link--add-to-stored-links link desc)))\r\n         (car org-stored-links)))))\r\n \r\n+(defun org-link--normalise-filename (filename &optional method)\r\n+  \"Return FILENAME as required by METHOD.\r\n+METHOD defaults to the value of `org-link-file-path-type'.\"\r\n+  (setq method (or method org-link-file-path-type))\r\n+  (cond\r\n+   ((eq method 'absolute)\r\n+    (abbreviate-file-name (expand-file-name filename)))\r\n+   ((eq method 'noabbrev)\r\n+    (expand-file-name filename))\r\n+   ((eq method 'relative)\r\n+    (file-relative-name filename))\r\n+   ((functionp method)\r\n+    (funcall method filename))\r\n+   (t\r\n+    (save-match-data\r\n+      (if (string-match (concat \"^\" (regexp-quote\r\n+\t\t\t\t     (expand-file-name\r\n+\t\t\t\t      (file-name-as-directory\r\n+\t\t\t\t       default-directory))))\r\n+\t\t\t(expand-file-name filename))\r\n+\t  ;; We are linking a file with relative path name.\r\n+\t  (substring (expand-file-name filename)\r\n+\t\t     (match-end 0))\r\n+\t(abbreviate-file-name (expand-file-name filename)))))))\r\n+\r\n ;;;###autoload\r\n (defun org-insert-link (&optional complete-file link-location description)\r\n   \"Insert a link.  At the prompt, enter the link.\r\n@@ -2752,27 +2777,9 @@ (defun org-insert-link (&optional complete-file link-location description)\r\n \t\t     link path-start (match-beginning 0))\r\n \t\t  (substring-no-properties link (match-end 0))))\r\n \t       (origpath path))\r\n-\t  (cond\r\n-\t   ((or (eq org-link-file-path-type 'absolute)\r\n-\t\t(equal complete-file '(16)))\r\n-\t    (setq path (abbreviate-file-name (expand-file-name path))))\r\n-\t   ((eq org-link-file-path-type 'noabbrev)\r\n-\t    (setq path (expand-file-name path)))\r\n-\t   ((eq org-link-file-path-type 'relative)\r\n-\t    (setq path (file-relative-name path)))\r\n-\t   ((functionp org-link-file-path-type)\r\n-\t    (setq path (funcall org-link-file-path-type path)))\r\n-\t   (t\r\n-\t    (save-match-data\r\n-\t      (if (string-match (concat \"^\" (regexp-quote\r\n-\t\t\t\t\t     (expand-file-name\r\n-\t\t\t\t\t      (file-name-as-directory\r\n-\t\t\t\t\t       default-directory))))\r\n-\t\t\t\t(expand-file-name path))\r\n-\t\t  ;; We are linking a file with relative path name.\r\n-\t\t  (setq path (substring (expand-file-name path)\r\n-\t\t\t\t\t(match-end 0)))\r\n-\t\t(setq path (abbreviate-file-name (expand-file-name path)))))))\r\n+\t  (setq path (org-link--normalise-filename path (if (equal complete '(16))\r\n+                                                            'absolute\r\n+                                                          org-link-file-path-type)))\r\n \t  (setq link (concat type path (and search (concat \"::\" search))))\r\n \t  (when (equal desc origpath)\r\n \t    (setq desc path)))))\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex d012819a9..6e56f7a00 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -20450,8 +20450,7 @@ (defun org--image-yank-media-handler (mimetype data)\r\n                    filename\r\n                    (if (eq org-yank-image-save-method 'attach)\r\n                        temporary-file-directory\r\n-                     org-yank-image-save-method)))\r\n-         link)\r\n+                     org-yank-image-save-method))))\r\n     (when (and (not (eq org-yank-image-save-method 'attach))\r\n                (not (file-directory-p org-yank-image-save-method)))\r\n       (make-directory org-yank-image-save-method t))\r\n@@ -20461,11 +20460,12 @@ (defun org--image-yank-media-handler (mimetype data)\r\n       (with-temp-file absname\r\n         (insert data)))\r\n     (if (null (eq org-yank-image-save-method 'attach))\r\n-        (setq link (org-link-make-string (concat \"file:\" (file-relative-name absname))))\r\n+        (insert (org-link-make-string\r\n+                 (concat \"file:\"\r\n+                         (org-link--normalise-filename absname))))\r\n       (require 'org-attach)\r\n       (org-attach-attach absname nil 'mv)\r\n-      (setq link (org-link-make-string (concat \"attachment:\" filename))))\r\n-    (insert link)))\r\n+      (insert (org-link-make-string (concat \"attachment:\" filename))))))\r\n \r\n ;; I cannot find a spec for this but\r\n ;; https:\/\/indigo.re\/posts\/2021-12-21-clipboard-data.html and pcmanfm\r\n@@ -20595,7 +20595,9 @@ (defun org--dnd-local-file-handler (url action &optional separator)\r\n       (`open (dnd-open-local-file url action))\r\n       (`file-link\r\n        (let ((filename (dnd-get-local-file-name url)))\r\n-         (insert (org-link-make-string (concat \"file:\" filename)) separator))))))\r\n+         (insert (org-link-make-string\r\n+                  (concat \"file:\" (org-link--normalise-filename filename)))\r\n+                 separator))))))\r\n \r\n (defun org--dnd-attach-file (url action separator)\r\n   \"Attach filename given by URL using method pertaining to ACTION.\r\n@@ -20643,8 +20645,9 @@ (defun org--dnd-attach-file (url action separator)\r\n                   \"file:\"\r\n                 \"attachment:\")\r\n               (if separatep\r\n-                  (expand-file-name (file-name-nondirectory filename)\r\n-                                    org-yank-image-save-method)\r\n+                  (org-link--normalise-filename\r\n+                   (expand-file-name (file-name-nondirectory filename)\r\n+                                     org-yank-image-save-method))\r\n                 (file-name-nondirectory filename))))\r\n      separator)\r\n     'private))\r\n@@ -20672,7 +20675,9 @@ (defun org--dnd-xds-function (need-name filename)\r\n     (pcase org--dnd-xds-method\r\n       (`attach (insert (org-link-make-string\r\n                         (concat \"attachment:\" (file-name-nondirectory filename)))))\r\n-      (`file-link (insert (org-link-make-string (concat \"file:\" filename))))\r\n+      (`file-link (insert (org-link-make-string\r\n+                           (concat \"file:\"\r\n+                                   (org-link--normalise-filename filename)))))\r\n       (`open (find-file filename)))\r\n     (setq-local org--dnd-xds-method nil)))\r\n \r\n-- \r\n2.47.2\r\n\r\n","subject":"Re: [FR] yank media: allow customization of absolute path a filter for type candidates"},{"date":"2025-02-22T20:23:56.116Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87msed22nz@posteo.net","message-id":"87msed22nz@posteo.net","config":false,"refs-count":3,"username":"Vins Xiro","related-refs":["87msed22nz@posteo.net"],"from":"v88m@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] The org-indent-drawer function does not work for drawers in plain lists since commit af300bd5b"},{"date":"2025-02-22T11:00:20.771Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/874j0mb603.fsf@gmail.com","message-id":"874j0mb603.fsf@gmail.com","config":false,"refs-count":14,"username":"Slava Barinov","references":["87v7t38qil.fsf@gmail.com","20241207035621.147856-1-rayslava@gmail.com","871pvqjsdn.fsf@localhost","87bjuw4grm.fsf@localhost","87plksx97w.fsf@localhost"],"related-refs":["874j0mb603.fsf@gmail.com","87y0xs6gdz.fsf@gmail.com","878qpumasw.fsf@gmail.com","87tt8k3oy6.fsf@gmail.com","87zfie9d08.fsf@gmail.com"],"from":"rayslava@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/874j0mb603.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From f7ce82e02a1d7619186c9451be22fc6fef27eba2 Mon Sep 17 00:00:00 2001\r\nFrom: Slava Barinov <rayslava@gmail.com>\r\nDate: Fri, 21 Feb 2025 20:45:41 +0900\r\nSubject: [PATCH] lisp\/org-collector.el (org-dblock-write:propview): Add\r\n support for the :tblfm keyword.\r\n\r\n---\r\n lisp\/org-collector.el | 9 ++++++++-\r\n 1 file changed, 8 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/lisp\/org-collector.el b\/lisp\/org-collector.el\r\nindex b645d3a..b6f9532 100644\r\n--- a\/lisp\/org-collector.el\r\n+++ b\/lisp\/org-collector.el\r\n@@ -122,6 +122,7 @@ preceding the dblock, then update the contents of the dblock.\"\r\n \t    (noquote (plist-get params :noquote))\r\n \t    (colnames (plist-get params :colnames))\r\n \t    (defaultval (plist-get params :defaultval))\r\n+\t    (tblfm (plist-get params :tblfm))\r\n \t    (content-lines (org-split-string (plist-get params :content) \"\\n\"))\r\n \t    id table line pos idpos stringformat)\r\n \t(save-excursion\r\n@@ -148,7 +149,13 @@ preceding the dblock, then update the contents of the dblock.\"\r\n \t(while (setq line (pop content-lines))\r\n \t  (when (string-match \"^#\" line)\r\n \t    (insert \"\\n\" line)))\r\n-\t(goto-char pos)\r\n+\t(when tblfm\r\n+\t  (if (looking-back \"^#\\\\+TBLFM:.*$\" (line-beginning-position))\r\n+\t      (delete-region (match-beginning 0) (line-end-position))\r\n+\t    (unless (looking-back \"\\n\" 1)\r\n+\t      (insert \"\\n\")))\r\n+\t  (insert (concat \"#+TBLFM:\" tblfm)))\r\n+        (goto-char pos)\r\n \t(org-table-recalculate 'all))\r\n     (org-collector-error (widen) (error \"%s\" er))\r\n     (error (widen) (error \"%s\" er))))\r\n-- \r\n2.48.1\r\n\r\n","subject":"Re: [PATCH] lisp\/org-collector.el: Add support for TBLFM"},{"date":"2025-02-21T07:38:51.869Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/Z7eVtz2DEY-vzF4K@15inch.localdomain","message-id":"Z7eVtz2DEY-vzF4K@15inch.localdomain","config":false,"refs-count":3,"username":"Evgeniy Dushistov via General discussions about Org-mode.","related-refs":["Z7eVtz2DEY-vzF4K@15inch.localdomain"],"from":"emacs-orgmode@gnu.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] 30.1; regression to 29.4 org-mode wrong-type-argument number-or-marker-p nil [9.7.11 (release_9.7.11 @ \/usr\/share\/emacs\/30.1\/lisp\/org\/)]"},{"date":"2025-02-17T11:10:21.305Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/5e55afa5-d714-409e-867e-cae8f27b7d9a@gmail.com","message-id":"5e55afa5-d714-409e-867e-cae8f27b7d9a@gmail.com","config":false,"refs-count":5,"username":"Zoey Hewll","related-refs":["5e55afa5-d714-409e-867e-cae8f27b7d9a@gmail.com"],"from":"zoeyhewll@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] org-read-date-style"},{"date":"2024-12-27T23:44:23.735Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2wmfk1ynb.fsf@purvis.id.au","message-id":"m2wmfk1ynb.fsf@purvis.id.au","config":false,"refs-count":6,"username":"Malcolm Purvis","references":["m2msgyu3or.fsf@purvis.id.au","874j2tibsn.fsf@localhost"],"related-refs":["m2jzbd1nr5.fsf@purvis.id.au","m2wmfk1ynb.fsf@purvis.id.au"],"from":"malcolm@purvis.id.au","patch-url":"https:\/\/tracker.orgmode.org\/patch\/m2wmfk1ynb.fsf@purvis.id.au","source-id":"emacs-orgmode@gnu.org","patch-body":"From 72a4e81238a78af1a58c49c1418cffb4032f3bfd Mon Sep 17 00:00:00 2001\r\nFrom: Malcolm Purvis <malcolm@purvis.id.au>\r\nDate: Sat, 14 Dec 2024 17:18:09 +1100\r\nSubject: [PATCH] Add next-error support to org-lint report buffer\r\n\r\n* doc\/org-manual.org (Org Syntax): Add next-error keybinding\r\n\r\n* etc\/ORG-NEWS:\r\n\r\n* lisp\/org-lint.el: Register org-lint report buffer with next-error\r\ninfra.  Add callback function to display error.\r\n---\r\n doc\/org-manual.org | 12 ++++++------\r\n etc\/ORG-NEWS       |  5 +++++\r\n lisp\/org-lint.el   | 35 +++++++++++++++++++++++++++++++++++\r\n 3 files changed, 46 insertions(+), 6 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex d95a9350e..7f6683428 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -20874,12 +20874,12 @@ a \"trust level\", since false-positive are possible.  From there, you\r\n can operate on the reports with the following keys:\r\n \r\n #+attr_texinfo: :columns 0.22 0.78\r\n-| {{{kbd(C-j)}}}, {{{kbd(TAB)}}} | Display the offending line                  |\r\n-| {{{kbd(RET)}}}                 | Move point to the offending line            |\r\n-| {{{kbd(g)}}}                   | Check the document again                    |\r\n-| {{{kbd(h)}}}                   | Hide all reports from the same checker      |\r\n-| {{{kbd(i)}}}                   | Also remove them from all subsequent checks |\r\n-| {{{kbd(S)}}}                   | Sort reports by the column at point         |\r\n+| {{{kbd(C-j)}}}, {{{kbd(TAB)}}} | Display the offending line                             |\r\n+| {{{kbd(RET)}}}                 | Move point to the offending line                       |\r\n+| {{{kbd(C-x `)}}}               | Move to the next report and display the offending line |\r\n+| {{{kbd(g)}}}                   | Check the document again                               |\r\n+| {{{kbd(h)}}}                   | Hide all reports from the same checker                 |\r\n+| {{{kbd(i)}}}                   | Also remove them from all subsequent checks            |\r\n \r\n ** Context Dependent Documentation\r\n :PROPERTIES:\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 08857962b..a38b761ad 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -355,6 +355,11 @@ The Texinfo exporter no longer removes links from headings.  This\r\n applies to all headings, below and above the =H= and =toc= export\r\n =#+OPTIONS:=.\r\n \r\n+*** next-error supports =org-lint= reports\r\n+\r\n+The command =next-error= can now be used to jump to the next\r\n+=org-lint= error.\r\n+\r\n * Version 9.7\r\n \r\n ** Important announcements and breaking changes\r\ndiff --git a\/lisp\/org-lint.el b\/lisp\/org-lint.el\r\nindex c85d839bc..040934235 100644\r\n--- a\/lisp\/org-lint.el\r\n+++ b\/lisp\/org-lint.el\r\n@@ -172,6 +172,35 @@ are additional check identifiers to be removed.\"\r\n \f\r\n ;;; Reports UI\r\n \r\n+;; next-error support\r\n+(defvar org-lint--next-error-top-of-buffer t\r\n+  \"Is the next error the one at the first line of the buffer?\r\n+\r\n+Unlike compilation and grep buffers the first line of the org lint\r\n+report refers to an error.  This needs special handling.\")\r\n+\r\n+(defun org-lint--next-error-function (n &optional reset)\r\n+  \"Find and display the next line error in the report.\r\n+N is an integer specifying by how many errors to move.\r\n+RESET is a boolean which, if non-nil, says to go back to the beginning\r\n+of the errors before moving.\r\n+\r\n+This function is the local support for the next-error machinery.\"\r\n+  (when reset\r\n+    (setq org-lint--next-error-top-of-buffer t)\r\n+    (goto-char (point-min)))\r\n+  (when org-lint--next-error-top-of-buffer\r\n+    (setq\r\n+     org-lint--next-error-top-of-buffer nil\r\n+     n (1- n))) ; In compilation buffers, point starts before the\r\n+                ; first error, so stepping forward one brings you to\r\n+                ; the first error.  Here the first error is on the\r\n+                ; first line so adjust the count accordingly.\r\n+  (forward-line n)\r\n+  (org-lint--show-source))\r\n+\r\n+;; Report mode\r\n+\r\n (defvar org-lint--report-mode-map\r\n   (let ((map (make-sparse-keymap)))\r\n     (set-keymap-parent map tabulated-list-mode-map)\r\n@@ -186,6 +215,12 @@ are additional check identifiers to be removed.\"\r\n (define-derived-mode org-lint--report-mode tabulated-list-mode \"OrgLint\"\r\n   \"Major mode used to display reports emitted during linting.\r\n \\\\{org-lint--report-mode-map}\"\r\n+  ;; next-error support.\r\n+  (make-local-variable 'org-lint--next-error-top-of-buffer)\r\n+  (setq\r\n+   next-error-function 'org-lint--next-error-function\r\n+   next-error-last-buffer (current-buffer))\r\n+\r\n   (setf tabulated-list-format\r\n \t`[(\"Line\" 6\r\n \t   (lambda (a b)\r\n-- \r\n2.47.1\r\n\r\n","subject":"Re: [PATCH] Add next-error support to org-lint report buffer"},{"date":"2024-12-27T17:16:16.051Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87bjwx59m6.fsf@localhost","message-id":"87bjwx59m6.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["CADQMGAQkAh0ApLW39VwOys-NdtcmvikbZX-T3+ozY53g5FG=1A@mail.gmail.com","8734ianvxo.fsf@gmail.com","87v7v7zyn7.fsf@localhost"],"related-refs":["87bjwx59m6.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[TASK] Rewriting org-pcomplete into capf backend (was: Completions Registry)"},{"date":"2024-12-19T18:04:52.227Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87a5cr7dn9.fsf@localhost","message-id":"87a5cr7dn9.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["87r0647tyc.fsf@localhost","87msgzh1dh.fsf@localhost","871py689uh.fsf@localhost","87v7wd9a2h.fsf@localhost","87v7vn12tp.fsf@ASCALON.mail-host-address-is-not-set","CAO0k703a5SCv4Eaogjs-14zgmTi-pK5qqG=8VzB8+7h-kcC8yg@mail.gmail.com","87y11nwp9z.fsf@gmail.com","87zfm4s50x.fsf@localhost","87y10fcy4e.fsf@localhost","8734m28l9a.fsf@gmail.com","CAJcAo8uxEYMCKh4aUWmv=z3BdA4jB6cQ+x=oa7Jyo7cLpX3Hgw@mail.gmail.com","87o71jwdxz.fsf@localhost","87cyj0ajm9.fsf@gmail.com","87wmh8s358.fsf@localhost","CAJcAo8sy5i+-wTEwb2XLksSKdLDQH1-7byj8dM8CAztu2LQ1pg@mail.gmail.com","87wmg6edr0.fsf@gmail.com","CAO0k702GsRi-h8BEY08kpf5FzMxi_MvRygNXJCyFnbtaC-a59w@mail.gmail.com","878qt7fbki.fsf@gmail.com","CAJcAo8sQCeedPL_AchNMBXd-dfY+xdcVorFk9=BSY-EyA_TFzQ@mail.gmail.com","878qsifufe.fsf@localhost","CAJcAo8t19iqs5H4-jw2BrEtyaM5etUGxdo3aohroPQ5BoatCNQ@mail.gmail.com"],"related-refs":["87msgzh1dh.fsf@localhost","87a5cr7dn9.fsf@localhost","87cyj0ajm9.fsf@gmail.com"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow SPC to scroll todo\/tag selection menu - for users with huge accessible fonts (was: Transient: accessibility problems for users who need to use large fonts (was: [RFC] The best way to choose an \"action\" at point: context-menu-mode, transient, which-key or embark? (was: Fwd: Org-cite: Replace basic follow-processor with transient menu?)))"},{"date":"2024-12-18T09:11:15.304Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/9d81cb95-8d46-4c51-8daa-d7c8fb44413a@gmx.at","message-id":"9d81cb95-8d46-4c51-8daa-d7c8fb44413a@gmx.at","config":false,"refs-count":16,"username":"martin rudalics","references":["87msgx7yo5.fsf@localhost","87ttb42i1b.fsf@mail.linkov.net","878qtycdmi.fsf@k-7.ch","a1fc2ed5-7e1a-4aaa-8f81-e6bf73bd48d4@gmx.at","87y10e6uyf.fsf@localhost","87r067cxi6.fsf@localhost"],"related-refs":["eb7f9c58-583c-41aa-9940-4d3d7ed67ad0@gmx.at","87h64vfg5j.fsf@localhost","87eczvt89y.fsf@localhost","9d81cb95-8d46-4c51-8daa-d7c8fb44413a@gmx.at"],"from":"rudalics@gmx.at","patch-url":"https:\/\/tracker.orgmode.org\/patch\/9d81cb95-8d46-4c51-8daa-d7c8fb44413a@gmx.at","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/lisp\/window.el b\/lisp\/window.el\nindex e9d57652ec6..31c2ae50792 100644\n--- a\/lisp\/window.el\n+++ b\/lisp\/window.el\n@@ -2615,7 +2615,36 @@ get-largest-window\n \t  (setq best-window window))))\n     best-window))\n \n-(defun get-buffer-window-list (&optional buffer-or-name minibuf all-frames)\n+(defun window-indirect-buffer-p (&optional window buffer-or-name)\n+  \"Return non-nil if specified WINDOW is indirectly related to BUFFER-OR-NAME.\n+WINDOW must be a live window and defaults to the selected window.\n+BUFFER-OR-NAME may be a buffer or the name of an existing buffer and\n+defaults to the current buffer.\n+\n+WINODW is indirectly related to BUFFER-OR-NAME if one of the following\n+conditions hold:\n+\n+- BUFFER-OR-NAME specifies an indirect buffer and WINDOW's buffer is its\n+  base buffer.\n+\n+- WINDOW's buffer is an indirect buffer whose base buffer is the buffer\n+  specified by BUFFER-OR-NAME.\n+\n+- Both, WINDOW's buffer and the buffer specified by BUFFER-OR-NAME, are\n+  indirect buffer's sharing the same base buffer.\n+\n+Return nil if none of the above holds.\"\n+  (let* ((window (window-normalize-window window t))\n+\t (window-buffer (window-buffer window))\n+\t (window-base-buffer (buffer-base-buffer window-buffer))\n+\t (buffer (window-normalize-buffer buffer-or-name))\n+\t (buffer-base-buffer (buffer-base-buffer buffer)))\n+    (or (eq buffer-base-buffer window-buffer)\n+\t(eq window-base-buffer buffer)\n+\t(and buffer-base-buffer\n+\t     (eq buffer-base-buffer window-base-buffer)))))\n+\n+(defun get-buffer-window-list (&optional buffer-or-name minibuf all-frames indirect)\n   \"Return list of all windows displaying BUFFER-OR-NAME, or nil if none.\n BUFFER-OR-NAME may be a buffer or the name of an existing buffer\n and defaults to the current buffer.  If the selected window displays\n@@ -2644,11 +2673,17 @@ get-buffer-window-list\n - A frame means consider all windows on that frame only.\n \n Anything else means consider all windows on the selected frame\n-and no others.\"\n+and no others.\n+\n+INDIRECT non-nil means to include in the list returned all windows that\n+are indirectly related to BUFFER-OR-NAME, that is, all windows for which\n+`window-indirect-buffer-p' with the window and the buffer specified by\n+BUFFER-OR-NAME as arguments returns non-nil.\"\n   (let ((buffer (window-normalize-buffer buffer-or-name))\n \twindows)\n     (dolist (window (window-list-1 (selected-window) minibuf all-frames))\n-      (when (eq (window-buffer window) buffer)\n+      (when (or (eq (window-buffer window) buffer)\n+\t\t(and indirect (window-indirect-buffer-p window buffer)))\n \t(setq windows (cons window windows))))\n     (nreverse windows)))\n \n@@ -8239,20 +8274,24 @@ display-buffer-reuse-window\n node `(elisp) Buffer Display Action Functions'.  It should be\n called only by `display-buffer' or a function directly or\n indirectly called by the latter.\"\n-  (let* ((alist-entry (assq 'reusable-frames alist))\n-\t (frames (cond (alist-entry (cdr alist-entry))\n+  (let* ((reusable-frames (assq 'reusable-frames alist))\n+\t (reuse-indirect (assq 'reuse-indirect alist))\n+\t (frames (cond (reusable-frames (cdr reusable-frames))\n \t\t       ((window--pop-up-frames alist)\n \t\t\t0)\n \t\t       (display-buffer-reuse-frames 0)\n \t\t       (t (last-nonminibuffer-frame))))\n-\t (window (if (and (eq buffer (window-buffer))\n+\t (window (if (and (or (eq buffer (window-buffer))\n+\t\t\t      (and reuse-indirect\n+\t\t\t\t   (window-indirect-buffer-p nil buffer)))\n \t\t\t  (not (cdr (assq 'inhibit-same-window alist))))\n \t\t     (selected-window)\n                    ;; Preferably use a window on the selected frame,\n                    ;; if such a window exists (Bug#36680).\n-                   (let* ((windows (delq (selected-window)\n-                                         (get-buffer-window-list\n-                                          buffer 'nomini frames)))\n+                   (let* ((windows\n+\t\t\t   (delq (selected-window)\n+                                 (get-buffer-window-list\n+                                  buffer 'nomini frames reuse-indirect)))\n                           (first (car windows))\n                           (this-frame (selected-frame)))\n                      (cond\n","subject":"Re: May we have a variant of display-buffer-reuse-window that considers indirect buffers?"},{"date":"2024-12-14T06:59:19.054Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87seqqg38b.fsf@localhost","message-id":"87seqqg38b.fsf@localhost","config":false,"refs-count":5,"username":"Ihor Radchenko","references":["87ikrnuust.fsf@tsdye.online","87zfl3uxhb.fsf@localhost","87pllzuv0o.fsf@tsdye.online","87cyhvh0s0.fsf@localhost"],"related-refs":["87seqqg38b.fsf@localhost","87zfl3uxhb.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[TASK] Documenting ob-fortran, ob-forth, ob-sed, ob-ocaml, ob-ruby, and ob-sass (was: [TASK] Move babel backend docs from WORG to Org manual)"},{"date":"2024-12-13T18:43:13.928Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87msgzh1dh.fsf@localhost","message-id":"87msgzh1dh.fsf@localhost","config":false,"refs-count":46,"username":"Ihor Radchenko","references":["87h68gfqj1.fsf@localhost","87jzd9ojj0.fsf@localhost","874j4m9ep6.fsf@gmail.com","87y120daue.fsf@localhost","87v7wd9a2h.fsf@localhost","CAO0k703a5SCv4Eaogjs-14zgmTi-pK5qqG=8VzB8+7h-kcC8yg@mail.gmail.com","87y11nwp9z.fsf@gmail.com","87zfm4s50x.fsf@localhost","87wmhlmp83.fsf@gmail.com","8734m28l9a.fsf@gmail.com","87o71jwdxz.fsf@localhost","87cyj0ajm9.fsf@gmail.com","87wmh8s358.fsf@localhost","871pzte929.fsf@localhost","87wmg6edr0.fsf@gmail.com","CAO0k701CGFnQwCCuODjTFuf=OTsj9Vdqg+COP8nkpJg0wL_hQg@mail.gmail.com","CAO0k7006goK-AfhG+3PVwhz=4QU_DMm+5edmATZpjdRHkj61Bg@mail.gmail.com","CAO0k702GsRi-h8BEY08kpf5FzMxi_MvRygNXJCyFnbtaC-a59w@mail.gmail.com","878qt7fbki.fsf@gmail.com","87v7x548ri.fsf@gmail.com","87pln3f3cc.fsf@localhost"],"related-refs":["87msgzh1dh.fsf@localhost","87a5cr7dn9.fsf@localhost","87cyj0ajm9.fsf@gmail.com"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] The best way to choose an \"action\" at point: context-menu-mode, transient, which-key or embark? (was: Fwd: Org-cite: Replace basic follow-processor with transient menu?)"},{"date":"2024-12-12T07:47:06.607Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87v7vpgxaa.fsf@thibaut.dev","message-id":"87v7vpgxaa.fsf@thibaut.dev","config":false,"refs-count":4,"username":"Thibaut Meyer via General discussions about Org-mode.","related-refs":["87v7vpgxaa.fsf@thibaut.dev"],"from":"emacs-orgmode@gnu.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Inconsistent org-babel tangle behaviour"},{"date":"2024-12-10T19:52:16.931Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87zfl3uxhb.fsf@localhost","message-id":"87zfl3uxhb.fsf@localhost","config":false,"refs-count":12,"username":"Ihor Radchenko","related-refs":["87seqqg38b.fsf@localhost","87zfl3uxhb.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[TASK] Move babel backend docs from WORG to Org manual"},{"date":"2024-12-08T12:25:11.497Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87plm2e50v.fsf@localhost","message-id":"87plm2e50v.fsf@localhost","config":false,"refs-count":15,"username":"Ihor Radchenko","references":["87ikv3o33d.fsf@localhost","87ldxysqoo.fsf@localhost","87h6aejf17.fsf@localhost","CALo8A5Vi=jgztdU8WuvZXL2xqgFQZN+=u6NuBZEG6S+7_QhtfQ@mail.gmail.com","87ttccs1vc.fsf@localhost","87tte8qakc.fsf@localhost","87ed3sgptk.fsf@localhost","CALo8A5ULVNQLhP=yReO-V9Uni=caqkjiQtcWUOrtr1XOXakjYA@mail.gmail.com","CALo8A5Vm-gik0qQC7KacNg7kN2VzL0Y1e8_LXxV8S7-we9CYSw@mail.gmail.com","CALo8A5XfjiJdFb382J+kACuGw2QPGpqYdE7JUS+h7035MKyO+w@mail.gmail.com","CALo8A5Xio+ETbgYUUzpQ5C7CDebdwXvPh6dxAk_5Fpg_ispV1A@mail.gmail.com","CALo8A5Vm0U=4WZG+eTUp0yv2zCoYR9JYZdvY-2P1XF7MPxWoPg@mail.gmail.com","CALo8A5VGSk-gnnm2Ug-zc02wNkZgs1PH2uwfAM368nzf0+kvEA@mail.gmail.com","CALo8A5VBTRcd3R64RyLfH+VpLwXa=+W=f2=ySsDxO4rdQxEi-w@mail.gmail.com","CALo8A5WV5b6ybs3t9f92bpuBdBXaC_6X1rR9mDxATHgn5qNwYg@mail.gmail.com","CALo8A5WFU2htoHQvzOej7Qip3+7Jor4GpA4p-=G1EfeeOB+yYw@mail.gmail.com","874j4gfocp.fsf@localhost","878qt9yd69.fsf@localhost"],"related-refs":["87plm2e50v.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] ob-maxima outputs linenum:0 in results on MacOS (was: [BUG] export blocks no longer fontifying [9.7.10 (release_9.7.10 @ \/Users\/ben\/Scripts\/emacs\/lisp\/org\/)])"},{"date":"2024-12-07T08:23:33.490Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87plm3x5ve.fsf@bzg.fr","message-id":"87plm3x5ve.fsf@bzg.fr","config":false,"refs-count":9,"username":"Bastien","related-refs":["87plm3x5ve.fsf@bzg.fr"],"from":"bzg@gnu.org","source-id":"emacs-orgmode@gnu.org","body":"Dear all,\r\n\r\nnot much of a surprise, but very good news nonetheless: Ihor is now\r\nofficially in charge of maintaining Org Mode. He will need every Org\r\nuser to continue the great work he has done so far.\r\n\r\nIf you can, please attend to his talk today:\r\n\r\n  https:\/\/emacsconf.org\/2024\/talks\/org-update\/\r\n  Saturday, Dec 7, 2024; 10:20 US\/Eastern (16:20 Europe\/Paris)\r\n\r\nIf you can, please make a donation to Org and\/or Ihor:\r\n\r\n  https:\/\/liberapay.com\/org-mode\r\n  https:\/\/liberapay.com\/yantar92\r\n\r\nI'll continue to read the list and contribute when I can. I'll focus\r\non improving Woof to make it useful to the Org community.\r\n\r\nI have had a truly wonderful time as a maintainer and I'd like to\r\nthank Carsten again for shaping and sharing Org in the first place.\r\n\r\nHappy hacking!\r\n\r\n-- \r\n Bastien\r\n\r\n","subject":"[ANN] Ihor is now officially the new Org maintainer"},{"date":"2024-12-02T09:04:18.906Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87frn6ihk5.fsf@thaodan.de","message-id":"87frn6ihk5.fsf@thaodan.de","config":false,"refs-count":13,"username":"Bj\u00f6rn Bidar","related-refs":["87frn6ihk5.fsf@thaodan.de","87jzbkmpno.fsf@gmail.com"],"from":"bjorn.bidar@thaodan.de","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-link-preview-file emits image not supported in daemon [9.8-pre (release_9.7.10-127-g07dd3b @ \/home\/bidar\/.local\/etc\/emacs\/lib\/org\/lisp\/)]"},{"date":"2024-11-29T16:41:13.301Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87jzcmq9h7.fsf@gmail.com","message-id":"87jzcmq9h7.fsf@gmail.com","config":false,"refs-count":9,"username":"Suhail Singh","related-refs":["87jzcmq9h7.fsf@gmail.com"],"from":"suhailsingh247@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[PATCH worg v2] ob-doc-gnuplot.org: Fix broken link to source."},{"date":"2024-11-21T07:11:54.541Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/6056b20a-9753-41fb-9632-88473ecd818a@obco.pro","message-id":"6056b20a-9753-41fb-9632-88473ecd818a@obco.pro","config":false,"refs-count":1,"username":"Yonggan","related-refs":["6056b20a-9753-41fb-9632-88473ecd818a@obco.pro"],"from":"yonggan@obco.pro","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org Roam does not open capture buffer [9.7.11 (9.7.11-??-6a5d0ed34 @ \/home\/yonggan\/.config\/emacs\/.local\/straight\/build-29.4\/org\/)]"},{"date":"2024-11-13T19:12:39.950Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CACb3vdT-i2KdAKCJ8UFGzHLF9VhRGUFsfKL0E--_j8DzK7iCFg@mail.gmail.com","message-id":"CACb3vdT-i2KdAKCJ8UFGzHLF9VhRGUFsfKL0E--_j8DzK7iCFg@mail.gmail.com","config":false,"refs-count":14,"username":"John C","references":["87pln4g3b2.fsf@localhost","CACb3vdQHZ4FQ1DRpW9HH8ev5gStNp5ko4ed8LVqxGRRX8sqKog@mail.gmail.com"],"related-refs":["CACb3vdT-i2KdAKCJ8UFGzHLF9VhRGUFsfKL0E--_j8DzK7iCFg@mail.gmail.com"],"from":"john.ciolfi.32@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/CACb3vdT-i2KdAKCJ8UFGzHLF9VhRGUFsfKL0E--_j8DzK7iCFg@mail.gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\nindex 5d421172f..5513c172d 100644\n--- a\/etc\/ORG-NEWS\n+++ b\/etc\/ORG-NEWS\n@@ -162,6 +162,13 @@ bibliography format requires them to be written in title-case.\n \n # This also includes changes in function behavior from Elisp perspective.\n \n+*** ob-octave: fixed MATLAB support\n+\n+Fixed ob-octave MATLAB (https:\/\/www.mathworks.com) code blocks processing.  The prior version of\n+ob-octave didn't correctly support MATLAB.  To use MATLAB with org, you need\n+https:\/\/github.com\/MathWorks\/Emacs-MATLAB-Mode. Now ~#+begin_src matlab~ code blocks with ~:results\n+verbatim~, ~:results output~, ~:results output latex~, or ~:results file graphics~ are supported.\n+\n *** ob-sqlite: Added ability to open a database in readonly mode\n \n Added option :readonly to ob-sqlite.\ndiff --git a\/lisp\/ob-matlab.el b\/lisp\/ob-matlab.el\nindex de8deadbe..083dcdec3 100644\n--- a\/lisp\/ob-matlab.el\n+++ b\/lisp\/ob-matlab.el\n@@ -28,11 +28,10 @@\n \n ;;; Requirements:\n \n-;; Matlab\n-\n-;; matlab.el required for interactive emacs sessions and matlab-mode\n-;; major mode for source code editing buffer\n-;; https:\/\/matlab-emacs.sourceforge.net\/\n+;; 1) MATLAB\n+;; 2) https:\/\/github.com\/mathworks\/Emacs-MATLAB-Mode\n+;;    For matlab-shell to run MATLAB within Emacs and matlab-mode\n+;;    major mode for source code editing buffer\n \n ;;; Code:\n \ndiff --git a\/lisp\/ob-octave.el b\/lisp\/ob-octave.el\nindex 005990f20..5ac1de1e4 100644\n--- a\/lisp\/ob-octave.el\n+++ b\/lisp\/ob-octave.el\n@@ -1,4 +1,4 @@\n-;;; ob-octave.el --- Babel Functions for Octave and Matlab -*- lexical-binding: t; -*-\n+;;; ob-octave.el --- Babel Functions for Octave and MATLAB -*- lexical-binding: t; -*-\n \n ;; Copyright (C) 2010-2024 Free Software Foundation, Inc.\n \n@@ -30,6 +30,8 @@\n \n ;;; Code:\n \n+(require 'cl-seq)\n+\n (require 'org-macs)\n (org-assert-version)\n \n@@ -39,7 +41,52 @@\n (declare-function matlab-shell \"ext:matlab-mode\")\n (declare-function matlab-shell-run-region \"ext:matlab-mode\")\n \n-(defvar org-babel-default-header-args:matlab '())\n+;; With `org-babel-default-header-args:matlab' set to\n+;;  '((:session . \"*MATLAB*\")))\n+;; each matlab code block evaluation will reuse the \"*MATLAB*\" buffer\n+;; created by `matlab-shell' for code evaluation.  The benefit of this\n+;; is that evaluation is very fast for evaluations after the first\n+;; evaluation. The first evaluation may be slower because it can take\n+;; a long time to start MATLAB.  Reusing the session buffer means\n+;; state is maintained between evaluations.  To avoid reuse of state,\n+;; you can clear the MATLAB workspace.  This setting aligns with\n+;; typical MATLAB use, where MATLAB is started and used for a long\n+;; period of period of time.  Another benefit of this setting is that\n+;; you can see the history of the evaluations in the \"*MATLAB*\"\n+;; command window buffer.  For example:\n+;;\n+;;  #+begin_src matlab :results output\n+;;    a = 123\n+;;  #+end_src\n+;;\n+;;  #+RESULTS:\n+;;  : a =\n+;;  :\n+;;  :    123\n+;;\n+;;  #+begin_src matlab :results output\n+;;    b = a * 2\n+;;  #+end_src\n+;;\n+;;  #+RESULTS:\n+;;  : b =\n+;;  :\n+;;  :    246\n+;;\n+;;  #+begin_src matlab :results output\n+;;    clear\n+;;    c = b * 2\n+;;  #+end_src\n+;;\n+;;  #+RESULTS:\n+;;  : Unrecognized function or variable 'b'.\n+;;\n+;; If you want a new session each time you evaluate a MATLAB code block,\n+;;   (setq 'org-babel-default-header-args:matlab '())\n+;; However, this will make evaluations slower and is not typically how\n+;; people use MATLAB.\n+(defvar org-babel-default-header-args:matlab '((:session . \"*MATLAB*\")))\n+\n (defvar org-babel-default-header-args:octave '())\n \n (defvar org-babel-matlab-shell-command \"matlab -nosplash\"\n@@ -47,18 +94,42 @@\n (defvar org-babel-octave-shell-command \"octave -q\"\n   \"Shell command to run octave as an external process.\")\n \n-(defvar org-babel-matlab-with-emacs-link nil\n-  \"If non-nil use matlab-shell-run-region for session evaluation.\n-This will use EmacsLink if (matlab-with-emacs-link) evaluates\n-to a non-nil value.\")\n-\n-(defvar org-babel-matlab-emacs-link-wrapper-method\n-  \"%s\n-if ischar(ans), fid = fopen('%s', 'w'); fprintf(fid, '%%s\\\\n', ans); fclose(fid);\n-else, save -ascii %s ans\n-end\n-delete('%s')\n+(make-obsolete-variable 'org-babel-matlab-with-emacs-link\n+                        \"MATLAB removed EmacsLink in R2009a.\" \"2009\")\n+\n+(make-obsolete-variable 'org-babel-matlab-emacs-link-wrapper-method\n+                        \"MATLAB removed EmacsLink in R2009a.\" \"2009\")\n+\n+(defvar org-babel-matlab-print \"print(\\\"-dpng\\\", %S);\\nans=%S;\"\n+  ;; MATLAB command-function duality requires that the file name be specified\n+  ;; without quotes. Using: print -dpng \"file.png\", would produce a file with\n+  ;; the quotes in the file name on disk. Therefore, use the functional form\n+  ;; to handle files with spaces, print(\"-dpng\", \"file.png\").\n+  ;; Example:\n+  ;;    #+begin_src matlab :file \"sine wave.png\" :results file graphics\n+  ;;      t = [0 : 0.1 : 2*pi];\n+  ;;      y = sin(t);\n+  ;;      plot(t, y);\n+  ;;      set(gcf, 'PaperUnits', 'inches', 'PaperPosition', [0 0 4 3]) % Set the size to 4\" x 3\"\n+  ;;    #+end_src\n+  ;;\n+  ;;    #+RESULTS:\n+  ;;    [[file:sine wave.png]]\n+  \"MATLAB format specifier to print current figure to a file.\")\n+\n+(defvar org-babel-octave-print \"print -dpng %S\\nans=%S\"\n+  \"Octave format specifier to print current figure to a file.\")\n+\n+(defvar org-babel-matlab-wrapper-method\n+  (concat \"\\\n+cd('%s');\n+%s\n+if ~exist('ans', 'var') ans = ''; end; \\\n+writematrix(ans, '%s', 'Delimiter', 'tab');\n \")\n+  \"Format specifier used when evaluating MATLAB code blocks.\n+Arguments are the `default-directory', the MATLAB code, and a result file.txt.\")\n+\n (defvar org-babel-octave-wrapper-method\n   \"%s\n if ischar(ans), fid = fopen('%s', 'w'); fdisp(fid, ans); fclose(fid);\n@@ -92,7 +163,10 @@ When MATLABP is non-nil, execute Matlab.  Otherwise, execute Octave.\"\n \t\t\t\t (list\n \t\t\t\t  \"set (0, \\\"defaultfigurevisible\\\", \\\"off\\\");\"\n \t\t\t\t  full-body\n-\t\t\t\t  (format \"print -dpng %S\\nans=%S\" gfx-file gfx-file))\n+\t\t\t\t  (format (if matlabp\n+                                              org-babel-matlab-print\n+                                            org-babel-octave-print)\n+                                          gfx-file gfx-file))\n \t\t\t\t \"\\n\")\n \t\t    full-body)\n \t\t  result-type matlabp)))\n@@ -153,6 +227,23 @@ If there is not a current inferior-process-buffer in SESSION then\n create.  Return the initialized session.  PARAMS are src block parameters.\"\n   (org-babel-octave-initiate-session session params 'matlab))\n \n+(defun org-babel-matlab-shell ()\n+  \"Start and\/or wait for MATLAB shell.\"\n+  (require 'matlab-shell) ;; make `matlab-shell-busy-checker' available\n+  (cond\n+   ((fboundp 'matlab-shell-busy-checker)\n+    ;; Start the shell if needed.  `matlab-shell' will reuse existing if already running.\n+    (matlab-shell)\n+    ;; If we just started the matlab-shell, wait for the prompt.  If we do not\n+    ;; wait, then the startup messages will show up in the evaluation results.\n+    (matlab-shell-busy-checker 'wait-for-prompt))\n+   (t\n+    (message (concat \"You version of matlab-mode is old.\\n\"\n+                     \"Please update, see https:\/\/github.com\/mathworks\/Emacs-MATLAB-Mode\\n\"\n+                     \"Updating will eliminate unexpected output in your results\\n\"))\n+    (sit-for 3)\n+    (matlab-shell))))\n+\n (defun org-babel-octave-initiate-session (&optional session _params matlabp)\n   \"Create an octave inferior process buffer.\n If there is not a current inferior-process-buffer in SESSION then\n@@ -165,9 +256,15 @@ Octave session, unless MATLABP is non-nil.\"\n   (unless (string= session \"none\")\n     (let ((session (or session\n \t\t       (if matlabp \"*Inferior Matlab*\" \"*Inferior Octave*\"))))\n-      (if (org-babel-comint-buffer-livep session) session\n+      (if (org-babel-comint-buffer-livep session)\n+          (progn\n+            (when (and matlabp (fboundp 'matlab-shell-busy-checker))\n+              ;; Can't evaluate if the matlab-shell is currently running code\n+              (matlab-shell-busy-checker 'error-if-busy))\n+            session)\n \t(save-window-excursion\n-\t  (if matlabp (unless org-babel-matlab-with-emacs-link (matlab-shell))\n+\t  (if matlabp\n+              (org-babel-matlab-shell)\n \t    (run-octave))\n \t  (rename-buffer (if (bufferp session) (buffer-name session)\n \t\t\t   (if (stringp session) session (buffer-name))))\n@@ -183,66 +280,111 @@ value of the last statement in BODY, as elisp.\"\n       (org-babel-octave-evaluate-session session body result-type matlabp)\n     (org-babel-octave-evaluate-external-process body result-type matlabp)))\n \n+(defun org-babel-octave-wrapper-tmp-file (matlabp)\n+  \"Return a local tmp file with name adjusted for MATLABP.\"\n+  (if matlabp\n+      ;; writematrix requires a file ending with '.txt'\n+      (org-babel-temp-file \"matlab-\" \".txt\")\n+    (org-babel-temp-file \"octave-\")))\n+\n+(defun org-babel-octave-get-code-to-eval (body tmp-file matlabp)\n+  \"Format BODY of the code block for evaluation saving results to TMP-FILE.\n+If MATLABP, format for MATLAB, else format for Octave.\"\n+    (if matlabp\n+        (format org-babel-matlab-wrapper-method default-directory body tmp-file)\n+      (format org-babel-octave-wrapper-method body tmp-file tmp-file)))\n+\n (defun org-babel-octave-evaluate-external-process (body result-type matlabp)\n-  \"Evaluate BODY in an external Octave or Matalab process.\n+  \"Evaluate BODY in an external Octave or MATLAB process.\n Process the result as RESULT-TYPE.  Use Octave, unless MATLABP is non-nil.\"\n   (let ((cmd (if matlabp\n \t\t org-babel-matlab-shell-command\n \t       org-babel-octave-shell-command)))\n     (pcase result-type\n       (`output (org-babel-eval cmd body))\n-      (`value (let ((tmp-file (org-babel-temp-file \"octave-\")))\n+      (`value (let ((tmp-file (org-babel-process-file-name\n+                               (org-babel-octave-wrapper-tmp-file matlabp)\n+                               'noquote)))\n \t        (org-babel-eval\n \t\t cmd\n-\t\t (format org-babel-octave-wrapper-method body\n-\t\t\t (org-babel-process-file-name tmp-file 'noquote)\n-\t\t\t (org-babel-process-file-name tmp-file 'noquote)))\n+                 (org-babel-octave-get-code-to-eval body tmp-file matlabp))\n \t        (org-babel-octave-import-elisp-from-file tmp-file))))))\n \n+(defun org-babel-body-for-output (body matlabp)\n+  \"If MATLABP, fixup BODY for MATLAB output result-type.\"\n+  (when matlabp\n+    ;; When we send multi-line input to `matlab-shell', we'll see the \"body\"\n+    ;; code lines echoed in the output which is not what one would expect.  To\n+    ;; remove these unwanted lines, we append a comment \"%-<org-eval>\" to each\n+    ;; line in the body MATLAB code.  After we collect the results from\n+    ;; evaluation, we leverage the \"%-<org-eval>\" to remove the unwanted lines.\n+    ;; Example of desired behavior:\n+    ;;     #+begin_src matlab :results output\n+    ;;       disp('The results are:')\n+    ;;       a = [1, 2; 3, 4]\n+    ;;       b = a * 2\n+    ;;     #+end_src\n+    ;;\n+    ;;     #+RESULTS:\n+    ;;     #+begin_example\n+    ;;     The results are:\n+    ;;\n+    ;;     a =\n+    ;;\n+    ;;          1     2\n+    ;;          3     4\n+    ;;\n+    ;;     b =\n+    ;;\n+    ;;          2     4\n+    ;;          6     8\n+    ;;     #+end_example\n+\n+    (setq body (replace-regexp-in-string \"\\n\" \" %-<org-eval>-\\n\" body))\n+    (when (not (string-match \"\\n\\\\'\" body))\n+      (setq body (concat body \" %-<org-eval>-\"))))\n+  body)\n+\n+(defun org-babel-fix-up-output (results matlabp)\n+  \"Fix up RESULTS for output result-type when MATLABP.\"\n+  ;; When we send multi-line input to `matlab-shell', we'll see the \"body\" code\n+  ;; lines echoed in the output.  Therefore, leverage the \"%-<org-eval>\" to\n+  ;; remove the unnecessary lines.\n+  (if matlabp\n+      (let ((fixed-results (replace-regexp-in-string \"^[^\\n]*%-<org-eval>-\\n\" \"\"\n+                                                     results)))\n+        ;; Remove unnecessary starting blank line caused by stripping %-<org-eval>\n+        (setq fixed-results (replace-regexp-in-string \"\\\\`[[:space:]\\r\\n]+\" \"\" fixed-results))\n+        ;; matlab-shell wraps errors in <ERRORTXT> and <\/ERRORTXT> so remove those\n+        (replace-regexp-in-string \"<\/?ERRORTXT>[\\r\\n]\" \"\" fixed-results))\n+    results))\n+\n (defun org-babel-octave-evaluate-session\n     (session body result-type &optional matlabp)\n   \"Evaluate BODY in SESSION.\"\n-  (let* ((tmp-file (org-babel-temp-file (if matlabp \"matlab-\" \"octave-\")))\n-\t (wait-file (org-babel-temp-file \"matlab-emacs-link-wait-signal-\"))\n+  (let* ((tmp-file (org-babel-octave-wrapper-tmp-file matlabp))\n \t (full-body\n \t  (pcase result-type\n \t    (`output\n \t     (mapconcat\n \t      #'org-babel-chomp\n-\t      (list body org-babel-octave-eoe-indicator) \"\\n\"))\n+\t      (list (org-babel-body-for-output body matlabp)\n+                    org-babel-octave-eoe-indicator)\n+              \"\\n\"))\n \t    (`value\n-\t     (if (and matlabp org-babel-matlab-with-emacs-link)\n-\t\t (concat\n-\t\t  (format org-babel-matlab-emacs-link-wrapper-method\n-\t\t\t  body\n-\t\t\t  (org-babel-process-file-name tmp-file 'noquote)\n-\t\t\t  (org-babel-process-file-name tmp-file 'noquote) wait-file) \"\\n\")\n-\t       (mapconcat\n-\t\t#'org-babel-chomp\n-\t\t(list (format org-babel-octave-wrapper-method\n-\t\t\t      body\n-\t\t\t      (org-babel-process-file-name tmp-file 'noquote)\n-\t\t\t      (org-babel-process-file-name tmp-file 'noquote))\n-\t\t      org-babel-octave-eoe-indicator) \"\\n\")))))\n-\t (raw (if (and matlabp org-babel-matlab-with-emacs-link)\n-\t\t  (save-window-excursion\n-\t\t    (with-temp-buffer\n-\t\t      (insert full-body)\n-\t\t      (write-region \"\" 'ignored wait-file nil nil nil 'excl)\n-\t\t      (matlab-shell-run-region (point-min) (point-max))\n-\t\t      (message \"Waiting for Matlab Emacs Link\")\n-\t\t      (while (file-exists-p wait-file) (sit-for 0.01))\n-\t\t      \"\")) ;; matlab-shell-run-region doesn't seem to\n-\t\t;; make *matlab* buffer contents easily\n-\t\t;; available, so :results output currently\n-\t\t;; won't work\n-\t\t(org-babel-comint-with-output\n-\t\t    (session\n-\t\t     (if matlabp\n-\t\t\t org-babel-octave-eoe-indicator\n-\t\t       org-babel-octave-eoe-output)\n-\t\t     t full-body)\n-\t\t  (insert full-body) (comint-send-input nil t))))\n+\t     (mapconcat\n+\t      #'org-babel-chomp\n+\t      (list (org-babel-octave-get-code-to-eval body tmp-file matlabp)\n+\t\t    org-babel-octave-eoe-indicator)\n+              \"\\n\"))))\n+\t (raw-results\n+\t  (org-babel-comint-with-output\n+\t      (session\n+\t       (if matlabp\n+\t\t   org-babel-octave-eoe-indicator\n+\t\t org-babel-octave-eoe-output)\n+\t       t full-body)\n+\t    (insert full-body) (comint-send-input nil t)))\n \t results)\n     (pcase result-type\n       (`value\n@@ -250,12 +392,13 @@ Process the result as RESULT-TYPE.  Use Octave, unless MATLABP is non-nil.\"\n       (`output\n        (setq results\n \t     (if matlabp\n-\t\t (cdr (reverse (delete \"\" (mapcar #'org-strip-quotes\n-\t\t\t\t\t          (mapcar #'org-trim raw)))))\n+                 (cdr (reverse (delete \"\" (mapcar #'org-strip-quotes\n+\t\t\t\t\t          (mapcar #'org-trim raw-results)))))\n \t       (cdr (member org-babel-octave-eoe-output\n \t\t\t    (reverse (mapcar #'org-strip-quotes\n-\t\t\t\t\t     (mapcar #'org-trim raw)))))))\n-       (mapconcat #'identity (reverse results) \"\\n\")))))\n+\t\t\t\t\t     (mapcar #'org-trim raw-results)))))))\n+       (org-babel-fix-up-output\n+        (mapconcat #'identity (reverse results) \"\\n\") matlabp)))))\n \n (defun org-babel-octave-import-elisp-from-file (file-name)\n   \"Import data from FILE-NAME.\n","subject":"Re: ob-octave: improve MATLAB support"},{"date":"2024-11-13T18:25:01.912Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/93f4efc1-2ce4-40cd-b433-83da7e624139@wz.ht","message-id":"93f4efc1-2ce4-40cd-b433-83da7e624139@wz.ht","config":false,"refs-count":5,"username":"Jordan Ellis Coppard","related-refs":["93f4efc1-2ce4-40cd-b433-83da7e624139@wz.ht"],"from":"jc+o.orgmode@wz.ht","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org mode freeze in combination with recovery notification [9.7.11 (release_9.7.11 @ \/Applications\/MacPorts\/Emacs.app\/Contents\/Resources\/lisp\/org\/)]"},{"date":"2024-11-12T09:28:04.638Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cyj0ajm9.fsf@gmail.com","message-id":"87cyj0ajm9.fsf@gmail.com","config":false,"refs-count":41,"username":"Tor-bj\u00f6rn Claesson","references":["87jzdo2e4m.fsf@gmail.com","87r0839jfc.fsf@bernoul.li","874j4ueo1x.fsf@localhost","87h68gfqj1.fsf@localhost","87jzd9ojj0.fsf@localhost","874j4m9ep6.fsf@gmail.com","87y120daue.fsf@localhost","87bjz2tam2.fsf@gmail.com","87wmhlmp83.fsf@gmail.com","8734m28l9a.fsf@gmail.com","87msil77oi.fsf@localhost","871pzte929.fsf@localhost","CAO0k701CGFnQwCCuODjTFuf=OTsj9Vdqg+COP8nkpJg0wL_hQg@mail.gmail.com","CAO0k7006goK-AfhG+3PVwhz=4QU_DMm+5edmATZpjdRHkj61Bg@mail.gmail.com","CAO0k702FGLWna5ZYUbJ6nACRnkmAKQOSPO_aWmmh29+pBte4cA@mail.gmail.com","874j4sccuv.fsf@localhost","87ed3wnlv4.fsf@gmail.com","CAO0k702znk9mfvVksRFGWztMxNFjKhz0+aCsSu1Mv+eXnid0Bw@mail.gmail.com","87a5eievav.fsf@localhost","87v7x548ri.fsf@gmail.com","87pln3f3cc.fsf@localhost"],"related-refs":["87msgzh1dh.fsf@localhost","87a5cr7dn9.fsf@localhost","87cyj0ajm9.fsf@gmail.com","87wmg6edr0.fsf@gmail.com","878qt7fbki.fsf@gmail.com"],"from":"tclaesson@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87cyj0ajm9.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From e91fff9f6c03e2c766dee410f46382398f883997 Mon Sep 17 00:00:00 2001\r\nFrom: =?UTF-8?q?Tor-bj=C3=B6rn=20Claesson?= <tclaesson@gmail.com>\r\nDate: Tue, 12 Nov 2024 11:09:16 +0200\r\nSubject: [PATCH] lisp\/oc-basic.el: Transient menu for following citations\r\n\r\n* lisp\/oc-basic.el (require 'transient): Pull in transient.\r\n(org-cite-basic-follow-ask): New customization option. should\r\n`org-cite-basic-follow' prompt the user for an action?\r\n(org-cite-basic-follow-actions): New customization option, that\r\nspecifies the contents of the transient menu.\r\n(org-cite-basic-follow): New function.  Displays a menu asking how to\r\nfollow a citation if `org-cite-basic-follow-ask' is\r\nnon-nil. Otherwise, it retains the default behaviour of opening the\r\nbibliography entry. This can be inversed with a negative prefix argument.\r\n(org-cite-basic-follow--parse-suffix-specification,\r\norg-cite-basic-follow--wrap-function, and\r\norg-cite-basic-follow--setup): Helper functions for\r\n`org-cite-basic-follow'.\r\n(org-cite-register-processor 'basic): Update the basic citation\r\nprocessor to follow citations using `org-cite-basic-follow'.\r\n\r\n* etc\/ORG_NEWS (Menu for choosing how to follow citations): Describe\r\nthe new feature\r\n(New option ~org-cite-basic-follow-ask~): Describe this new\r\ncustomization option.\r\n(New option ~org-cite-basic-follow-actions~): Describe this new\r\ncustomization option, which specifies the layout of the\r\n`org-cite-basic-follow' transient menu.\r\n\r\nThis change was co-authored with much support from Ihor Radchenko and\r\nJonas Bernoulli, thanks!\r\n---\r\n etc\/ORG-NEWS     | 22 +++++++++++\r\n lisp\/oc-basic.el | 95 +++++++++++++++++++++++++++++++++++++++++++++++-\r\n 2 files changed, 116 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex de4f11b25..b859b0ada 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -114,6 +114,15 @@ The keybindings in the repeat-maps can be changed by customizing\r\n \r\n See the new [[info:org#Repeating commands][\"Repeating commands\"]] section in Org mode manual.\r\n \r\n+*** Menu for choosing how to follow citations\r\n+\r\n+Following citations with the org-cite-basic citation backend can now present a\r\n+transient menu. To show this menu, set ~org-cite-basic-follow-ask~ to non-nil. \r\n+This behaviour can be reversed with a negativ prefix.\r\n+\r\n+The contents of this menu can be customized in\r\n+~org-cite-basic-follow-actions~.\r\n+\r\n ** New and changed options\r\n \r\n # Chanes deadling with changing default values of customizations,\r\n@@ -158,6 +167,19 @@ English.  The default value is ~t~ as the CSL standard assumes that\r\n English titles are specified in sentence-case but the bibtex\r\n bibliography format requires them to be written in title-case.\r\n \r\n+*** New option ~org-cite-basic-follow-ask~\r\n+\r\n+When this option is non-nil, following a citation with the basic citation\r\n+backend will present a transient menu with choices for how to follow the\r\n+citation.\r\n+If nil, following a citation will open its bibliography entry.\r\n+\r\n+This behaviour can be reversed with a negative prefix argument.\r\n+\r\n+*** New option ~org-cite-basic-follow-actions~\r\n+\r\n+This option specifies the options presented by ~org-cite-basic-follow~.\r\n+\r\n ** New functions and changes in function arguments\r\n \r\n # This also includes changes in function behavior from Elisp perspective.\r\ndiff --git a\/lisp\/oc-basic.el b\/lisp\/oc-basic.el\r\nindex e207a1997..c3fc3f34d 100644\r\n--- a\/lisp\/oc-basic.el\r\n+++ b\/lisp\/oc-basic.el\r\n@@ -74,6 +74,7 @@\r\n (require 'map)\r\n (require 'oc)\r\n (require 'seq)\r\n+(require 'transient)\r\n \r\n (declare-function org-open-at-point \"org\" (&optional arg))\r\n (declare-function org-open-file \"org\" (path &optional in-emacs line search))\r\n@@ -140,6 +141,30 @@\r\n   :type 'face\r\n   :safe #'facep)\r\n \r\n+(defcustom org-cite-basic-follow-ask nil\r\n+  \"Should `org-cite-basic' ask how to follow citations?\r\n+\r\n+When this option is nil, `org-cite-basic-follow' opens the bibliography entry. \r\n+Otherwise, `org-cite-basic-follow' will display a transient menu prompting the \r\n+user for an action.  The contents of this menu can be customized in \r\n+`org-cite-basic-follow-actions'.\"\r\n+  :group 'org-cite\r\n+  :package-version '(Org . \"9.8\")\r\n+  :type 'boolean)\r\n+\r\n+(defcustom org-cite-basic-follow-actions\r\n+  '[[\"Open\"\r\n+     (\"b\" \"bibliography entry\" (org-cite-basic-goto !citation !prefix))]]\r\n+  \"Actions in the `org-cite-basic-follow' transient menu.\r\n+\r\n+This option uses the same syntax as `transient-define-prefix', see Info node\r\n+`(transient)Binding Suffix and Infix Commands'.  In addition, it is possible \r\n+to specify a function call for the COMMAND part, where !citation, \r\n+!prefix, and !citation-key can be used to access those values.\"\r\n+  :group 'org-cite\r\n+  :package-version '(Org . \"9.8\")\r\n+  :type 'sexp)\r\n+\r\n \f\r\n ;;; Internal variables\r\n (defvar org-cite-basic--bibliography-cache nil\r\n@@ -832,6 +857,74 @@ present in the citation.\"\r\n        (bibtex-set-dialect)\r\n        (bibtex-search-entry key)))))\r\n \r\n+(transient-define-prefix org-cite-basic-follow (citation &optional prefix)\r\n+  \"Follow citation.\r\n+\r\n+If `org-cite-basic-follow-ask' is non-nil, this transient will present\r\n+a menu prompting the user for an action. \r\n+Otherwise, it will open the bibliography entry for the citation at point.  \r\n+This behaviour is inverted when the transient is called with a negative prefix\r\n+argument.\r\n+\r\n+The contents of the menu are defined in the variable\r\n+`org-cite-basic-follow-actions'.\"\r\n+  [:class transient-columns\r\n+          :setup-children org-cite-basic-follow--setup\r\n+          :pad-keys t]\r\n+  (interactive)\r\n+  (if (xor org-cite-basic-follow-ask\r\n+           (equal prefix '(-4)))\r\n+      (transient-setup 'org-cite-basic-follow nil nil\r\n+                       :scope (list citation prefix))\r\n+    (org-cite-basic-goto citation prefix)))\r\n+\r\n+(defun org-cite-basic-follow--wrap-function (fn-args &optional fn)\r\n+  \"Provide !citation, !prefix, and !citation-key symbols.\"\r\n+  (append \r\n+   `(let ((!citation (car (transient-scope)))\r\n+          (!prefix (cadr (transient-scope)))\r\n+          (!citation-key\r\n+           (if (org-element-type-p (car (transient-scope)) 'citation-reference)\r\n+               (org-element-property :key (car (transient-scope)))\r\n+             (pcase (org-cite-get-references (car (transient-scope)) t)\r\n+               (`(,key) key)\r\n+               (keys\r\n+                (or (completing-read \"Select citation key: \" keys nil t)\r\n+                    (user-error \"Aborted\"))))))))\r\n+   (if fn\r\n+       `((,fn ,@fn-args))\r\n+     fn-args)))\r\n+\r\n+(defun org-cite-basic-follow--parse-suffix-specification (specification)\r\n+  \"Handle special syntax for `org-cite-basic-follow-actions'.\"\r\n+  (pcase specification\r\n+    (`(,key ,desc (lambda ,args . ,fn-args) . ,other)\r\n+     `(,key ,desc\r\n+            (lambda ,args\r\n+              ,(unless (and (listp (car fn-args))\r\n+                            (equal (caar fn-args)\r\n+                                   'interactive))\r\n+                 '(interactive))\r\n+              ,(org-cite-basic-follow--wrap-function fn-args))\r\n+            ,@other))\r\n+    (`(,key ,desc (,fn . ,fn-args) . ,other)\r\n+     `(,key ,desc\r\n+            (lambda ()\r\n+\t      (interactive)\r\n+\t      ,(org-cite-basic-follow--wrap-function fn-args fn))\r\n+            ,@other))\r\n+    (other other)))\r\n+\r\n+(defun org-cite-basic-follow--setup (_)\r\n+  \"Update `org-cite-basic-follow' when `org-cite-basic-follow-actions' changes.\"\r\n+  (transient-parse-suffixes\r\n+   'org-cite-basic-follow\r\n+   (cl-map 'vector\r\n+           (lambda (group)\r\n+             (cl-map 'vector #'org-cite-basic-follow--parse-suffix-specification\r\n+                     group))\r\n+           org-cite-basic-follow-actions)))\r\n+\r\n \f\r\n ;;; \"Insert\" capability\r\n (defun org-cite-basic--complete-style (_)\r\n@@ -920,7 +1013,7 @@ Raise an error when no bibliography is set in the buffer.\"\r\n   :activate #'org-cite-basic-activate\r\n   :export-citation #'org-cite-basic-export-citation\r\n   :export-bibliography #'org-cite-basic-export-bibliography\r\n-  :follow #'org-cite-basic-goto\r\n+  :follow #'org-cite-basic-follow\r\n   :insert (org-cite-make-insert-processor #'org-cite-basic--complete-key\r\n                                           #'org-cite-basic--complete-style)\r\n   :cite-styles\r\n-- \r\n2.46.0\r\n\r\n","subject":"Re: Org-cite: Replace basic follow-processor with transient menu?"},{"date":"2024-10-26T09:50:47.579Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/878qubw5uo.fsf@localhost","message-id":"878qubw5uo.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87ed4ttt02.fsf@localhost"],"related-refs":["878qubw5uo.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","body":"\r\n[ This time, I will try to use Org mailing list tracker and its\r\n  functionality for \"blog posts\". Let's see if I can make this post into\r\n  RSS feeds that are automatically posted in #org-mode Matrix room. ]\r\n\r\nBack to the meeting notes.\r\n\r\n- As usual, we started from Sacha's News\r\n  https:\/\/sachachua.com\/blog\/2024\/10\/2024-10-07-emacs-news\/\r\n\r\n- For a bit of a twist, before the official start of the stream, I did\r\n  a bit of a screencast working on an Org mode bug report\r\n  - https:\/\/list.orgmode.org\/orgmode\/878qvbstna.fsf@gmail.com\/\r\n  - The bug is about Texinfo export of variable definition:\r\n    : - Variable: my-name ::\r\n    - When variable \"my-name\" is exactly =nil=, Org mode errs\r\n    - The problem lies in the implementation detail of ox-texinfo and\r\n      in Org handling of attribute values\r\n      - ~org-texinfo--split-definition~ replaces \"variable\"\r\n        description lists with special blocks\r\n        #+begin_src emacs-lisp\r\n\t  (apply #'org-element-create 'special-block\r\n\t         (list :type cmd\r\n\t  \t     :attr_texinfo (list (format \":options %s\" args))\r\n\t  \t     :post-blank (if contents 1 0))\r\n\t         (mapc #'org-element-extract contents))\r\n        #+end_src\r\n      - later, ~org-texinfo-special-block~ uses\r\n        ~org-export-read-attribute~ to parse the =:options variable-name=\r\n      - The problem is that ~org-export-read-attribute~ treats ~nil~\r\n        specially, making =nil= value indistinguishable from the\r\n        absence of attribute\r\n    - It is not fully clear how to address the problem. There are multiple options\r\n      1. ~org-texinfo--split-definition~ to not use ~:attr_texinfo~\r\n         and instead store the value directly + add special handling\r\n         in ~org-texinfo-special-block~.  This will avoid invoking\r\n         ~org-export-read-attribute~ altogether\r\n      2. Or I may try to address the limitation of\r\n         ~org-export-read-attribute~, so that it becomes possible to\r\n         specify =nil= as a value of export attribute.\r\n\t - This seems better overall (in a more global scope outside\r\n           of the bug report), but it is not clear what can be done\r\n           (removing special handling of nil will likely cause\r\n           regression and is thus not an option)\r\n    - [2024-10-26 Sat] I went with option (1)\r\n\r\n- Chinmay saw the 33 stashes lying around in my local Org git repository\r\n  - Those are not all actual work though\r\n  - My workflow often involves jumping between different Org branches\r\n    and carrying over WIP changes. For example, I sometimes start to\r\n    write code on main, but then realize that it is more suitable for\r\n    bugfix (or vice versa)\r\n    - To carry the code around I often just use stashes:\r\n      1. stash current changes\r\n      2. switch branch\r\n      3. unstash\r\n  - I also tend to work on a number of small fixes in parallel,\r\n    sometimes leaving the changes to \"cook\" for a few days to avoid\r\n    overlooking obvious flaws (another day - another fresh look on my code)\r\n    - If I do see a flaw, I do not immediately delete a stash, but may\r\n      start changes afresh, so the stash is kept around in case if I\r\n      change my mind about the approach to handle one or another fix\r\n  - So, many stashes in my git repo are not really meaningful. I clean\r\n    them up from time to time\r\n\r\n- While I was doing the bug fixing screencast, someone asked (by\r\n  voice, so I do not recall who it was) a bit of\r\n  an off-topic question - how I configure parenthesis to be\r\n  highlighted in different colors depending on the relative depth wrt\r\n  point\r\n  - I use =highlight-parentheses= package\r\n  - See https:\/\/github.com\/yantar92\/emacs-config\/blob\/master\/config.org#highlight-parentheses-in-code\r\n\r\n- visuwesh asked karhink (co-author of the new latex preview branch)\r\n  about the new proposal to generalize the previews to work outside\r\n  Org mode - in any arbitrary major mode buffer\r\n  - https:\/\/list.orgmode.org\/87edbhljr7.fsf@hyperspace\r\n  - Recently, Karthik shared a new prototype on the list\r\n    https:\/\/list.orgmode.org\/orgmode\/87a5fffmuc.fsf@gmail.com\/\r\n  - Here is a video demo from the recent email\r\n    https:\/\/www.youtube.com\/watch?v=u44X_th6_oY (watch from 9 minute mark)\r\n  - I did some initial feedback during and after the video and later\r\n    followed up with an actual reply on the list\r\n    https:\/\/list.orgmode.org\/orgmode\/87o73rkgja.fsf@localhost\/\r\n  - Also, maybe it would be a nice talk for EmacsConf :)\r\n\r\n- Chinmay asked about Emacs APAC meetup (suitable for Asia-Pacific\/Europe time zones)\r\n  - It is monthly, every forth Saturday, 1400 IST\r\n  - See https:\/\/emacs-apac.gitlab.io\/\r\n\r\n- karthink asked about the performance of org-persist writing caches\r\n  to disk and how to debug it\r\n  - It can take time when there is a large number of caches\r\n    - For example, with my 20-30+Mbs of Org files loaded into Emacs,\r\n      it does take a few seconds to quit Emacs (not that I frequently\r\n      do it)\r\n  - One can use a profiler to check how long it takes for org-persist\r\n    to write things\r\n    - But you need a trick to prevent Emacs from actually exiting and\r\n      not showing the profiler data: make ~kill-emacs-hook~ throw an\r\n      error at the very end\r\n      : (add-hook 'kill-emacs-hook #'error 100)\r\n    - Then, M-x profiler-report after attempting to quit will work\r\n    - Later, the hook can be removed\r\n      : (remove-hook 'kill-emacs-hook #'error)\r\n  - In case of karthink, the possible problem is a sheer number of cache\r\n    entries as he is actively using latex previews that heavily make\r\n    use of the cache\r\n    - However, we need the actual profiler data to (1) confirm that\r\n      the problem is there; (2) figure out which part of org-persist\r\n      is slowing things down\r\n\r\n- Chinmay asked about link previews in Org mode (similar to what many\r\n  instant messengers do)\r\n  - visuwesh suggested that creates previews for youtube links:\r\n    https:\/\/github.com\/TobiasZawada\/org-yt\r\n    - Of course, it is only specific to youtube links (special yt: link type)\r\n  - kathink's patch that adds an API to create arbitrary link previews\r\n    is a step towards having web (and other, like, say, pdf) link\r\n    previews\r\n    https:\/\/list.orgmode.org\/orgmode\/875xrqg6cb.fsf@gmail.com\/\r\n    - The patch introduces :preview link parameter that will be used\r\n      by ~org-toggle-inline-images~\r\n    - The patch itself does not produce web link previews, but such\r\n      previews can be implemented using the proposed API\r\n      - There is even a demo previewing youtube links from unpublished\r\n        kathink's code\r\n\thttps:\/\/share.karthinks.com\/org-link-preview-demo-2.mp4\r\n  - We then went on discussing how to generalize the previews to be\r\n    not tied to a specific website\r\n    - Chinmay suggested https:\/\/oembed.com\/ API. It might be used to\r\n      retrieve previews from arbitrary websites\r\n      - I was not so optimistic about the idea because of my\r\n        experience using OpenGraph protocol to retrieve website\r\n        metadata in my Org capture scrambler package:\r\n        https:\/\/github.com\/yantar92\/org-capture-ref\r\n      - Even though there are standards to provide\r\n        website metadata (previews, authors, titles, dates, etc), they\r\n        are simply not followed equally by different websites\r\n\t- ... and you are lucky if the protocol is simply not\r\n          supported. Sometimes, it is kind of supported, but the\r\n          returned data is a complete garbage\r\n    - So, to have some kind of generic previewer, there might be no\r\n      universal solution. We might have to go the route I took in\r\n      org-capture-ref: (1) push our luck with \"standard\" protocol;\r\n      (2) fall back to website-specific scramblers otherwise.\r\n      - It is actually doable, except some especially bad websites\r\n        that do not even provide metadata without running JS\r\n      - As long as we can download HTML to Emacs, it can be parsed\r\n        using built-in libxml parser and searched for website-specific\r\n        info\r\n\r\n- John Wiegley shared his feature idea\r\n  - He wants to have a way to define multiple variants of the same\r\n    paragraph\/block\/heading\/etc\r\n    #+begin_quote\r\n    The idea I was proposing earlier, org-layers, would give you\r\n    markup for specifying multiple versions of a region of text, and\r\n    both Org-mode and the HTML export would give you a simple\r\n    interface for changing the view both locally and globally.\r\n    #+end_quote\r\n  - The inspiration is from https:\/\/en.wikipedia.org\/wiki\/Project_Xanadu#History\r\n    - [2024-10-20 Sun] I did not look into that link during the\r\n      meetup, but now I am a bit confused. According to the wiki, the\r\n      major idea is transclusion, and some people (who probably looked\r\n      into the same wiki page), immediately mentioned\r\n      https:\/\/github.com\/nobiot\/org-transclusion and\r\n      https:\/\/elpa.gnu.org\/packages\/lentic.html\r\n      - daniel german shared his extension to org-transclusion:\r\n        including parts of code in other files (not Org) into Org\r\n        document:\r\n\thttps:\/\/github.com\/dmgerman\/org-transclude-fn\r\n      - The idea is slightly different from org-babel in a way that\r\n        babel is mostly from Org source to code, while\r\n        org-transclude-fn is opposite\r\n\t- [2024-10-20 Sun] On the other hand, we have\r\n          ~org-babel-detangle~ that can ingest code back into Org\r\n          files\r\n\t- As deniel later replied, another difference is that\r\n          org-transclude-fn does not include actual text into Org\r\n          document. It is just to be displayed and read; not edited.\r\n\t  - org-transclusion, in contrast, allows editing the\r\n            \"transcluded\" text, so that edits are reflected in the\r\n            original buffer\r\n      - Then, we went further into the old discussion about Emacs\r\n        allowing to combine parts of multiple buffers, ideally with\r\n        per-region major modes\r\n\t- One of the past discussions of the idea on emacs-devel:\r\n\t  https:\/\/yhetil.org\/emacs-devel\/87h8kou1c0.fsf@telefonica.net\/\r\n\t- And the most recent one (now active):\r\n          https:\/\/yhetil.org\/emacs-devel\/86ttdau8hj.fsf@gmx.net\/T\/#t\r\n\t- ... similar discussions keep popping up on emacs-devel from\r\n          time to time (maybe every 1-2 years or so, AFAIR)\r\n\r\n  - Another analogy that immediately stroke my mind is the problem of\r\n    translations (of manuals or normal user documents)\r\n    - Past discussion on emacs-devel: https:\/\/yhetil.org\/emacs-devel\/835y0b29rk.fsf@gnu.org\/\r\n    - When creating a translation of slowly changing document like\r\n      manual, we cannot simply translate it all at once\r\n      - Parts of the document may be changed over time, often by\r\n        people who are not capable to keep all the available\r\n        translations up to date\r\n      - So, some system is necessary that keeps track of which parts\r\n        of the translated document are obsolete and which parts are\r\n        still up-to-date\r\n      - The classical solution for this task is https:\/\/po4a.org\/index.php.en\r\n\t- ... and it has no Emacs major mode\r\n    - So, I have been long playing around with the idea that Org mode\r\n      may be up to the task of maintaining the translations (of\r\n      manuals or just normal multi-lingual documents\/books; inspired by \r\n      Juan Manuel Mac\u00edas sharing a bilingual book written in Org mode:\r\n      https:\/\/list.orgmode.org\/orgmode\/87h70tyyiz.fsf@posteo.net\/)\r\n      - What if we make use of affiliated keywords to mark some\r\n        paragraphs\/drawers\/blocks\/headings as \"translation\"\r\n      - Such mark will also contain a link and hash of the \"original\"\r\n        paragraph\/...\/heading\r\n      - Then, depending on the #+LANGUAGE: keyword, we may choose to\r\n        export different variants of the text\r\n      - If the original source texts change, but the translations do\r\n        not, it should then be easily tracked, and we can provide\r\n        various ways to handle this, like: throw an error; mark the\r\n        exported obsolete translation somehow; put the original\r\n        instead of the translation; both; etc.\r\n      - We can go even further, and link the \"translation\" to, for\r\n        example, Elisp function docstring (or even body). Then, if the\r\n        docstring changes, we can automatically flag the related\r\n        portion of the manual obsolete. Think about all the extended\r\n        explanations about various Org mode commands - it is often\r\n        hard to remember keeping them in sync with changes in the\r\n        function code.\r\n\r\n- karthink asked about an update on my big Org codebase refactoring\r\n  project\r\n  - There no progress since I started my new job in September (so I\r\n    have less time for Org mode now)\r\n  - I also need to sort out my copyright paperwork with the new\r\n    employer, which is taking some time. I am being cautious about\r\n    patches (especially non-trivial) until things are settled\r\n\r\n- We had a moment of awkward silence and I decided to look into some\r\n  recent feature requests\r\n  - https:\/\/list.orgmode.org\/orgmode\/87frq13w48.fsf@localhost\/\r\n    proposes to extend Org timers (M-x org-timer; [[info:org#Timers]])\r\n    - The idea is to allow chaining multiple timers one after another,\r\n      akin what people do with work\/rest cycles in Pomodoro\r\n    - If anyone is interested in such features, please chime in on the\r\n      mailing list. Unless there are replies, I will have to refute\r\n      the proposal. (Mostly because it might be non-trivial code-wise\r\n      and I do not want to complicate code without popular demand for\r\n      this new feature.)\r\n\r\n- Chinmay raised a topic of using transient in more places (including\r\n  Org mode)\r\n  - My stance of transient is that we should eventually switch all the\r\n    Org menus to use it.\r\n    - We generally want to rely more on the existing Emacs features and\r\n      get rid of Org mode parts that are re-implementing the existing\r\n      functionality (or predate the time when relevant generic\r\n      functionality, like transient, have been added to Emacs)\r\n    - Similarly, we want to move parts of Org mode that are generic\r\n      enough into Emacs itself\r\n  - Several users raised concerns about using transient though\r\n    - Mostly along the lines that is still has problems like not\r\n      supporting what Emacs users are used to\r\n      - For example, ~C-h k~ does not work inside transients\r\n    - Transient menus are also hard to create dynamically: a critical\r\n      feature required for many Org mode menus\r\n    - visuwesh also linked to not-yet-closed bug report for transient\r\n      https:\/\/debbugs.gnu.org\/cgi\/bugreport.cgi?bug=52058\r\n    - I myself faced a few (unreproducible) situations when transient\r\n      left my Emacs in unusable shape with key bindings completely\r\n      broken\r\n    - Having said the above, transient is still going to be an\r\n      improvement as Org menus are even worse in terms of supporting\r\n      ~C-h k~ or even simply switching to the menu buffer (which, in\r\n      contrast, transient allows). After we solve the dynamic menu\r\n      building that is. [2024-10-25 Fri] But there is a hope:\r\n      https:\/\/list.orgmode.org\/orgmode\/8734m28l9a.fsf@gmail.com\/\r\n    - As karthink pointed, a better documentation (user: and\r\n      discoverability!) would greatly benefit developing more\r\n      transient uses\r\n      - There is a good attempt to improve the docs in\r\n        https:\/\/github.com\/psionic-k\/transient-showcase; would be nice\r\n        if it were incorporated into upstream manual\r\n      - Also, karthink suggested that \"The transient manual made sense\r\n        only after I read the EIEIO manual\"\r\n\t- Every instance of transient menu item is an instance of\r\n          EIEIO class\r\n\r\n- Right after we discussed problems with transient, kickingvegas, a\r\n  big transient fan, joined\r\n  - Although, this time he did not talk about transient :)\r\n  - He presented his recent blog post on a small helper for writing Org table formulas\r\n    http:\/\/yummymelon.com\/devnull\/referencing-org-table-cells-with-text-regions.html\r\n  - The problem post is trying to solve is inputting cell references into the formulas\r\n    - Currently, one has to write the references manually, like =@13$7=\r\n      - This sometimes involves annoying counting of rows\/columns\r\n      - Org does allow named rows\/columns, which simplifies things,\r\n        but naming rows and columns require dedicated effort, which is\r\n        only worth it for really large and complex formulas\r\n\thttps:\/\/orgmode.org\/manual\/Advanced-features.html\r\n    - =C-c '= (~M-x org-table-edit-formulas~) helps somewhat by\r\n      highlighting the referenced table cell and by providing\r\n      =S-arrow= keys to modify reference at point interactively: move\r\n      reference up\/down\/left\/right; but entering the reference\r\n      _initially_ still remains awkward\r\n    - kickingvegas used context menu approach to solve the problem\r\n      - He introduced a new context menu item, which copies cell\r\n        reference at point into the kill ring\r\n  - I suggested integrating the idea of getting cell reference via\r\n    mouse with ~org-table-edit-formulas~\r\n    - When inside edit buffer, mouse may automatically insert\r\n      cell\/cell range reference at mouse into the formula editor\r\n  - More details in the followup discussion on the mailing list\r\n    https:\/\/list.orgmode.org\/95CE1447-FC08-431A-9CA1-83B4C3F77BA7@gmail.com\/T\/#t\r\n\r\n- visuwesh raised the topic for recent Org mode's support for M-x yank-media\r\n  - Our support revived interest in better implementations of M-x\r\n    yank-media on all the Emacs platforms\r\n  - Emacs does not support M-x yank-media on Windows well\r\n  - https:\/\/debbugs.gnu.org\/cgi\/bugreport.cgi?bug=71909 discusses how\r\n    to implement it considering Windows quirks (Windows clipboard is\r\n    not directly compatible with the notion of mime type used in\r\n    yank-media support for GNU\/Linux)\r\n    - Beginning of the thread:\r\n      https:\/\/yhetil.org\/emacs-bugs\/tencent_7FA4E415A96083033C6BED7C7354AEE02505@qq.com\/\r\n\r\n- As a reminder, I now post links to meetup summaries and dates for\r\n  the upcoming meetups at https:\/\/orgmode.org\/worg\/orgmeetup.html\r\n  - This is in addition to Mastodon and the mailing list\r\n    - My new Mastodon server is https:\/\/fosstodon.org\/@yantar92\r\n\r\n:chat:\r\n[17:31] Welcome to <b>[[bbb:OrgMeetup]]<\/b>!<br \/><br \/>For help on using BigBlueButton see these (short) <a href=\"https:\/\/www.bigbluebutton.org\/html5\" target=\"_blank\"><u>tutorial videos<\/u><\/a>.<br \/><br \/>To join the audio bridge click the phone button.  Use a headset to avoid causing background noise for others.<br \/><br \/>This server is running <a href=\"https:\/\/docs.bigbluebutton.org\/\" target=\"_blank\"><u>BigBlueButton<\/u><\/a>.\r\n[17:38] Ihor Radchenko : Hi\r\n[17:38] Chinmay : Hi!\r\n[17:38] Ihor Radchenko : We are starting in 20 minutes\r\n[17:38] Chinmay : ye no problem\r\n[17:39] Ihor Radchenko : Meanwhile, the latest Emacs News: https:\/\/sachachua.com\/blog\/2024\/10\/2024-10-07-emacs-news\/\r\n[17:41] Chinmay : omg so many stashes - i need to start naming my stashes to use them more\r\n[17:49] Ihor Radchenko : highlight-parentheses\r\n[17:59] visuwesh : actually, can you have a variable named nil?\r\n[18:00] visuwesh : ahhhh i see\r\n[18:01] visuwesh : i see, i thought the report was about actually setting a variable named nil\r\n[18:02] visuwesh : ahhh okay\r\n[18:04] visuwesh : a question for karthik: did the thread in emacs-orgmode about adapting the new latex-preview code for auctex ever work out? https:\/\/bbb.emacsverse.org\/b\/iho-h7r-qg8-led  or will it have to be changed compeltely now with the new wip emacs-wide intergration?\r\n[18:04] visuwesh : https:\/\/list.orgmode.org\/87edbhljr7.fsf@hyperspace\r\n[18:05] visuwesh : got the link wrong, sry\r\n[18:05] visuwesh : yep\r\n[18:06] visuwesh : yes\r\n[18:06] Dave Marquardt : yes\r\n[18:06] karthink : The demo of latex is at around the 9 minute mmrk\r\n[18:07] karthink : *demo of latex-mode\r\n[18:07] Dave Marquardt : hehe\r\n[18:08] karthink : @visuwesh the demo is based on prototype code that's not very robust\r\n[18:09] visuwesh : hmm, okay.  i was modelling latex preview for my goldbook interface after that thread but it just never worked and i never could work out why\r\n[18:09] visuwesh : i wanted to ask you via mail but i left it for later TM and you released this video :)\r\n[18:09] karthink : The changes required in org-latex-preview are not yet in the dev branch\r\n[18:10] visuwesh : was it ever expected to work before these changes though?\r\n[18:10] karthink : Yes, the code provided by Tony Zorman should work with the dev branch as is\r\n[18:10] visuwesh : i used org-latex-preview-place with (BEG END VALUE) passed to it\r\n[18:10] visuwesh : hmm i see\r\n[18:12] karthink : No I just made it to demo the possibility of latex previews across Emacs\r\n[18:13] Corwin Brust : gm :)\r\n[18:13] karthink : Yeah it could be played at Emacsconf, I guess.  In any case, I need feedback on the API for plugging it into other major modes\r\n[18:16] karthink : It will still `(require 'ox)` for the preamble, but yeah, independent of Org-mode would be great.\r\n[18:17] karthink : The other issue is that I want to avoid runtime dispatch on the major-mode, because we run code in after-change-functions that needs to be very fast\r\n[18:17] Ihor Radchenko : 1. use thingatpt for boundaries\r\n[18:17] Ihor Radchenko : 2. use custom variable\/function for preamble\r\n[18:18] karthink : I mean code like (funcall (plist-get major-mode ...))\r\n[18:18] karthink : Yeah, the current prototype is using buffer-local variables\r\n[18:19] karthink : Noted your point about providing defaults.\r\n\r\nOkay, we can discuss this further in the thread? I think it's not relevant to most people in the meetup\r\n[18:20] karthink : No worries, please take your time\r\n[18:24] Chinmay : is the emacs apac meetup every saturday?\r\n[18:25] visuwesh : I believe it is monthly?\r\n[18:25] Chinmay : ah\r\n[18:25] visuwesh : happens around 2 pm or 2:30 pm IST iirc\r\n[18:25] Chinmay : ye\r\n[18:25] Chinmay : 2\r\n[18:26] karthink : @Ihor that reminds me -- is it expected for Emacs to take 4-5 seconds to exit because of org-persist in kill-emacs-hook?\r\n[18:27] karthink : It happens every time to me, I think it's because of the large volume of latex previews that are cached\r\n[18:28] karthink : How do you profile kill-emacs-hook?\r\n[18:28] visuwesh : Can you not simplyprofile org-persist-write-all?\r\n[18:30] Ihor Radchenko : (add-hook 'kill-emacs-hook #'error 100)\r\n[18:30] Ihor Radchenko : This way, can profile killing emacs\r\n[18:30] karthink : @Ihor, yeah, my experience is similar to yours just now\r\n[18:31] Ihor Radchenko : error will prevent actual killing\r\n[18:32] karthink : Okay, I'll find out what's happening\r\n[18:33] karthink : Yeah, I'm reminded of the problem only when I quit Emacs, which isn't very often\r\n[18:39] Chinmay : has someone tried to add link previews to org mode?\r\n[18:39] Chinmay : this thing https:\/\/imgur.com\/ZqPjZtE\r\n[18:43] visuwesh : https:\/\/github.com\/TobiasZawada\/org-yt this thing maybe?\r\n[18:44] Chinmay : i'll check this out, thanks\r\n[18:44] visuwesh : but is there a general solution for this problem? im sort of interested in this too\r\n[18:45] Chinmay : iinw there's some sort of standard for this too?\r\n[18:45] visuwesh : only thing i can remember is a PR for ement.el to add link previews but i think that simply queries the matrix homeserver\r\n[18:45] Chinmay : like on the web\r\n[18:45] Chinmay : not emacs\r\n[18:45] visuwesh : i see\r\n[18:46] visuwesh : yes\r\n[18:46] daniel german : There is a package called (require 'org-yt) that allows to have previews of an youtube snapshot.\r\n[18:46] visuwesh : we can't see your screen though\r\n[18:46] karthink : @visuwesh what do you mean by a general solution?\r\n[18:47] Chinmay : general links, not just yt i believe\r\n[18:47] visuwesh : i presume the package works by querying youtube for the thumbnail.  i was thinking if there was a gen solution because matrix, discord, etc. show a nice preview of links regardless of the website\r\n[18:48] daniel german : yes, thi s is only for youtube. it creates a special type of link and caches it\r\n[18:48] daniel german : yt:video-url\r\n[18:48] Chinmay : i see\r\n[18:49] karthink : @Ihor there's the org-link-preview patch\r\n[18:49] Ihor Radchenko : https:\/\/github.com\/TobiasZawada\/org-yt\r\n[18:50] Chinmay : this is the standard https:\/\/oembed.com\/\r\n[18:50] karthink : https:\/\/list.orgmode.org\/875xrqg6cb.fsf@gmail.com\r\n[18:50] karthink : It's the :preview link parameter\r\n[18:51] John Wiegley : Good morning (from California timezone)\r\n[18:51] karthink : I think org-yt is advising org-display-inline-images (or whatever it's called)\r\n[18:53] karthink : https:\/\/share.karthinks.com\/org-link-preview-demo-2.mp4\r\n[18:54] karthink : It's just an image placed over the link with C-c C-x C-v\r\n[18:55] Chinmay : ye\r\n[18:56] karthink : It looks like oembed can also be used for inline link previews in Org mode\r\n[18:57] Chinmay : yes\r\n[18:57] Chinmay : lmao\r\n[18:58] Chinmay : i think twitter does its own thing\r\n[18:59] Chinmay : og:image has a png link\r\n[19:01] Chinmay : no idea\r\n[19:02] Chinmay : nice nice\r\n[19:03] visuwesh : Emacs can use libxml for parsing html and xml\r\n[19:03] Chinmay : very cool\r\n[19:03] visuwesh : there's an elisp library for parsing xml too iirc\r\n[19:05] John Wiegley : I just had a feature idea I wanted to brainstorm\r\n[19:06] John Wiegley : Project Xanadu\r\n[19:06] Chinmay : ihor your voice is echoing\r\n[19:06] daniel german : Ted Nelsons' hypertex\r\n[19:06] daniel german : t\r\n[19:07] daniel german : It might be an interesting additjion to org-transclude:\r\n[19:07] daniel german : to have a parameter that indicates isi only the title or the content of the transclusion are transcluded\r\n[19:08] John Wiegley : I hadn't thought of tying it in with transclusion, but I love that idea!\r\n[19:08] John Wiegley : Both!\r\n[19:08] John Wiegley : Translation of multiple languages, and transclusion of title\/content\/etc\r\n[19:08] karthink : What is org translation?\r\n[19:09] John Wiegley : Yes, my microphone on these websites often produces echo, my apologies.\r\n[19:09] daniel german : org-transclude not org translation\r\n[19:09] John Wiegley : https:\/\/github.com\/nobiot\/org-transclusion\r\n[19:10] John Wiegley : I use Org transclusion so that I can give my employees feedback in a meeting file, and then transclude that feedback into their personnel file for the yearly review.\r\n[19:10] daniel german : I am adding transclusion of a function, still in beta, and it will be moved to Nobiot's repo as an module: https:\/\/github.com\/dmgerman\/org-transclude-fn\r\n[19:11] John Wiegley : Saves me from having to either centralize the feedback in a single file, or having to chase links to read them all in one go.\r\n[19:12] visuwesh : hmm how does this different from org-babel?\r\n[19:12] Ihor Radchenko : https:\/\/elpa.gnu.org\/packages\/lentic.html\r\n[19:13] daniel german : I'll respond:\r\n[19:13] daniel german : it executes a function, and dynamically inserts the result, but the result is not part of the actual buffer and it is read only.\r\n[19:13] karthink : It would be great if Emacs provided C-level support for including a part of one buffer in another.  Would solve various issues, including Org babel fontification, LSP support, \"native\" transclusion etc\r\n[19:14] John Wiegley : @daniel It sounds like you could build a webserver on that idea\r\n[19:14] daniel german : :) once you can execute a function, the sky is the limit :)\r\n[19:15] visuwesh : if it is never going to clog up the result, that would be nice yes\r\n[19:15] visuwesh : it can be a bit inconvenient to switch to *Async Shell Command Output* or the sync ersion of that\r\n[19:16] John Wiegley : The idea I was proposing earlier, org-layers, would give you markup for specifying multiple versions of a region of text, and both Org-mode and the HTML export would give you a simple interface for changing the view both locally and globally.\r\n[19:17] Ihor Radchenko : https:\/\/yhetil.org\/emacs-devel\/87h8kou1c0.fsf@telefonica.net\/\r\nDiscussion about having text from multiple buffers in one buffer\r\n[19:17] daniel german : One nice thing of org-transclude is that you can edit the source text in the transcluding buffer. I highly recommend it.\r\n[19:18] karthink : @John Would all versions be written to the file?\r\n[19:18] John Wiegley : AYes\r\n[19:19] John Wiegley : #+begin_layered\r\nVersion one (full text)\r\n,#+next_layered\r\nVersion two (summary)\r\n,#+next layered\r\nVersion three (translation?)\r\n,#+end_layered\r\n[19:21] John Wiegley : That hashing idea is really nice, Ihor, I could see this being applicable to code comments in a source file too...\r\n[19:21] John Wiegley : Like, the PR would not pass CI unless the comment had been updated with the new hash, which requires revision of that text.\r\n[19:25] karthink : @Ihor any update on your big Org refactoring effort?\r\n[19:25] Ihor Radchenko : https:\/\/yhetil.org\/emacs-devel\/835y0b29rk.fsf@gnu.org\/\r\nDiscussion about translations on Emacs devel\r\n[19:25] Jeff Trull : Karthik claims to not be a programmer too ;)\r\n[19:29] Ihor Radchenko : https:\/\/list.orgmode.org\/orgmode\/87frq13w48.fsf@localhost\/\r\n[19:29] Ihor Radchenko : feature request: Chaining multiple org timers\r\n[19:30] Chinmay : i love the transientification of everything\r\n[19:30] John Wiegley : transient does seem like a great UI modality for many things\r\n[19:31] user : I wish transient played more nicely with \"C-h k\" etc. I don't know if things have improved in that regard, but I recall going from transient menu-item to function behind it was not easily discoverable\r\n[19:31] karthink : It's hard to modify a transient menu though\r\n[19:32] karthink : Compared to keymaps\r\n[19:32] user : Fair, it may be better than Org menus\r\n[19:32] visuwesh : I really hope the issues raised in https:\/\/debbugs.gnu.org\/cgi\/bugreport.cgi?bug=52058 will be resolved\r\n[19:32] kickingvegas : hi folks - sorry to jump in late\r\n[19:33] Jeff Trull : Perfect timing\r\n[19:36] Ihor Radchenko : https:\/\/list.orgmode.org\/orgmode\/877cbamq2q.fsf@gmail.com\/\r\n[19:36] Ihor Radchenko : feature: transient menu for opening citations\r\n[19:37] karthink : Oh yeah, I've broken transient several times\r\n[19:38] visuwesh : it i mostly a request for better documentation\r\n[19:38] user : s\/documentation\/discoverability\/\r\n[19:38] visuwesh : and in-transient text that tries to help the user when trying a transient for the first time\r\n[19:38] visuwesh : documentation too, honestly\r\n[19:39] Ihor Radchenko : https:\/\/github.com\/psionic-k\/transient-showcase \r\nsome extra docs\r\n[19:39] Chinmay : gtg, bye!\r\n[19:39] visuwesh : i find the documentation very opaque as  a user\r\n[19:39] user : You don't get the same thing\r\n[19:40] karthink : The transient manual made sense only after I read the EIEIO manual\r\n[19:40] visuwesh : oh i didn't realise that repo contained user documentation.  i thought it was only s bunch of examples so never bothered to open it\r\n[19:42] Jeff Trull : Karthink that's interesting what is the connection between an OO library and a menu library\r\n[19:43] karthink : I think the prefix and suffix distinction made sense when transient was a smaller library -- since a transient-prefix is a generalization of a prefix argument to an interactive elisp command\r\n[19:43] karthink : @Jeff every transient menu item is an instance of an EIEIO class\r\n[19:44] Jeff Trull : Ahhh\r\n[19:44] John Wiegley : Where was it posted?\r\n[19:45] user : Every now and again I wish there was a primer for EIEIO and cl-defstruct. Mostly because I don't use them often enough to ever remember their conventions\r\n[19:45] kickingvegas : http:\/\/yummymelon.com\/devnull\/referencing-org-table-cells-with-text-regions.html\r\n[19:45] user : primer as in cheatsheet as opposed to manual\r\n[19:45] John Wiegley : Thank you! And nice to hear you as well.\r\n[19:45] karthink : @Jeff This also means if you want a menu item with bespoke behavior you have to define a new EIEIO class that implements it, just for one item\r\n[19:48] Ihor Radchenko : 3.5.10 Advanced features describes how to create named rows\/columns\r\n[19:50] karthink : Not seeing KickingVegas' screen yet\r\n[19:51] Dave Marquardt : Unless your screen is the \"Welcome to BigBlueButton\" page\r\n[19:53] karthink : @Ihor, what was the command you invoked to edit the tblfm interactively?\r\n[19:53] karthink : C-c '\r\n[19:53] karthink : Got it, did you call it with the cursor in the #+TBLFM line?\r\n[19:53] Ihor Radchenko : M-x org-table-edit-formulas\r\n[19:54] karthink : Cool thank you\r\n[19:55] Dave Marquardt : yes, I see Ihor's screen\r\n[20:00] Ihor Radchenko : 42.9.2 Overlay Properties\r\n[20:00] Ihor Radchenko : when in org-table-edit-formulas mode, you can create overlay over the table and add 'keymap property to that overlay\r\n[20:00] karthink : (info \"(elisp) Overlay Properties\")\r\n[20:02] Ihor Radchenko : 22.7.5 Drag Events\r\n[20:02] Ihor Radchenko : 22.7 Input Events\r\n[20:03] John Wiegley : I agree, there's inertia for me too in naming cells properly\r\n[20:04] visuwesh : yank-media will be properly supported in Windows soon enough: https:\/\/yhetil.org\/emacs-bugs\/bafcfc5c-e9d5-402c-a6de-321d49229386@imayhem.com\/  it would be nice to provide feedback on what file types will be useful for handlers (currently images, text\/html, filenames, audio and video are mentioned)\r\n[20:05] visuwesh : it is about yank-media\r\n[20:05] visuwesh : yea that was another bug report, with a proepr subject line\r\n[20:05] visuwesh : yeah but they are trying to gather user feedback on useful clipbaord items right now\r\n[20:06] visuwesh : https:\/\/debbugs.gnu.org\/cgi\/bugreport.cgi?bug=71909\r\n[20:07] visuwesh : what clipboard items would be useful for future yank-media usage\r\n[20:09] Ihor Radchenko : bug#71909: 30.0.60; Can not use yank-media for pasting image from clipboad in org-mode on Windows platform\r\n[20:09] Ihor Radchenko : actual thread title\r\n[20:09] visuwesh : https:\/\/yhetil.org\/emacs-bugs\/tencent_7FA4E415A96083033C6BED7C7354AEE02505@qq.com\/\r\n[20:11] visuwesh : i think in windows yo uhave to translate the clipboard data so that it matches the mimetype string that is followed in linux\r\n[20:11] visuwesh : so they will probably end up having a specific bunch of supported types so it would be nice to alert the devs on what clipboard items would be useful\r\n[20:12] visuwesh : yea, it is the same on mac too.  i think they have a very limited num of supported clipboard items if im not wrong\r\n[20:12] visuwesh : (at least on the ns port)\r\n[20:12] visuwesh : yea, the pushed needed to be given c:\r\n[20:13] daniel german : thank you.\r\n[20:13] oylenshpeegul : Thanks, Ihor! Thanks, everybody!\r\n[20:14] visuwesh : thank you all\r\n[20:14] Ihor Radchenko : Meetup page and annoucements: https:\/\/orgmode.org\/worg\/orgmeetup.html\r\nAlso, on Org mailing list and https:\/\/fosstodon.org\/@yantar92\r\n[20:14] kickingvegas : thanks all\r\n[20:14] karthink : Thanks for the meetup\r\n[20:15] John Wiegley : Good bye!\r\n:end:\r\n\r\n-- \r\nIhor Radchenko \/\/ yantar92,\r\nOrg mode contributor,\r\nLearn more about Org mode at <https:\/\/orgmode.org\/>.\r\nSupport Org development at <https:\/\/liberapay.com\/org-mode>,\r\nor support my work at <https:\/\/liberapay.com\/yantar92>\r\n\r\n","subject":"[BLOG] #12 [[bbb:OrgMeetup]] on Wed, Oct 9, 19:00 UTC+3"},{"date":"2024-10-21T05:47:40.377Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/878qui3t7b.fsf@gmail.com","message-id":"878qui3t7b.fsf@gmail.com","config":false,"refs-count":5,"username":"Jack Kamm","references":["87v7xowod1.fsf@localhost","87h6993y6q.fsf@gmail.com"],"related-refs":["878qui3t7b.fsf@gmail.com","87h6993y6q.fsf@gmail.com","877c9k19cc.fsf@gmail.com"],"from":"jackkamm@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/878qui3t7b.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 629788caa86773199fc06af1797cf8fd67a7884a Mon Sep 17 00:00:00 2001\r\nFrom: Jack Kamm <jackkamm@gmail.com>\r\nDate: Thu, 17 Oct 2024 17:33:47 -0700\r\nSubject: [PATCH] Add options to skip extra processing in\r\n org-babel-comint-with-output\r\n\r\nThis patch adds options to org-babel-comint-with-output to skip prompt\r\nremoval.  Allowing individual languages to handle this cleanup can be\r\nmore robust than relying on the generic ob-comint implementation.\r\nThis allows ob-python to switch back to using\r\n`org-babel-comint-with-output' rather than its own bespoke\r\nreimplementation, reducing code duplication.  Furthermore, this adds a\r\nnew implementation of ob-R non-async session output evaluation, that\r\nis similar to the ob-python approach in that it avoids leaking\r\nprompts, rather than relying on the cleanup from\r\n`org-babel-comint-with-output'.  A test is added to test-ob-R.el to\r\ndemonstrate the improved robustness of the new approach; previously,\r\nthis test would fail due to a false positive prompt, but now passes.\r\n\r\n* lisp\/ob-comint.el (org-babel-comint-with-output): Add new arguments\r\nto prevent extra processing for prompt cleanup.  Also, search for the\r\nend-of-execution sentinel within the collected output rather than the\r\ncomint buffer, which allows for evaluation via\r\n`process-send-string' (or similar functions like\r\n`python-shell-send-string' and `'ess-send-string') rather than\r\ndirectly entering the code block into the comint buffer.\r\n* lisp\/ob-python.el (org-babel-python-send-string): Switch to using\r\n`org-babel-comint-with-output', rather than bespoke reimplementation.\r\n* lisp\/ob-R.el (ess-send-string): Declare external function.\r\n(org-babel-R-evaluate-session): New implementation of output\r\nevaluation that avoids leaking prompts, by writing the code block to a\r\ntmp file and then sourcing it.\r\n* testing\/lisp\/test-ob-R.el (test-ob-r\/session-output-with->-bol): New\r\ntest for robustness against false positive prompts at the beginning of\r\na line.\r\n---\r\n lisp\/ob-R.el              | 33 +++++++++++-----------------\r\n lisp\/ob-comint.el         | 46 ++++++++++++++++++++++-----------------\r\n lisp\/ob-python.el         | 26 ++++++----------------\r\n testing\/lisp\/test-ob-R.el | 12 ++++++++++\r\n 4 files changed, 58 insertions(+), 59 deletions(-)\r\n\r\ndiff --git a\/lisp\/ob-R.el b\/lisp\/ob-R.el\r\nindex 481212202..fb29590e0 100644\r\n--- a\/lisp\/ob-R.el\r\n+++ b\/lisp\/ob-R.el\r\n@@ -42,6 +42,8 @@ (declare-function ess-make-buffer-current \"ext:ess-inf\" ())\r\n (declare-function ess-eval-buffer \"ext:ess-inf\" (vis))\r\n (declare-function ess-wait-for-process \"ext:ess-inf\"\r\n \t\t  (&optional proc sec-prompt wait force-redisplay))\r\n+(declare-function ess-send-string \"ext:ess-inf\"\r\n+                  (process string &optional visibly message type))\r\n \r\n (defvar ess-current-process-name) ; ess-custom.el\r\n (defvar ess-local-process-name)   ; ess-custom.el\r\n@@ -448,26 +450,17 @@ (defun org-babel-R-evaluate-session\r\n \t  (org-babel-import-elisp-from-file tmp-file '(16)))\r\n \tcolumn-names-p)))\r\n     (output\r\n-     (mapconcat\r\n-      'org-babel-chomp\r\n-      (butlast\r\n-       (delq nil\r\n-\t     (mapcar\r\n-\t      (lambda (line) (when (> (length line) 0) line))\r\n-\t      (mapcar\r\n-\t       (lambda (line) ;; cleanup extra prompts left in output\r\n-\t\t (if (string-match\r\n-\t\t      \"^\\\\([>+.]\\\\([ ][>.+]\\\\)*[ ]\\\\)\"\r\n-\t\t      (car (split-string line \"\\n\")))\r\n-\t\t     (substring line (match-end 1))\r\n-\t\t   line))\r\n-\t       (with-current-buffer session\r\n-\t\t (let ((comint-prompt-regexp (concat \"^\" comint-prompt-regexp)))\r\n-\t\t   (org-babel-comint-with-output (session org-babel-R-eoe-output)\r\n-\t\t     (insert (mapconcat 'org-babel-chomp\r\n-\t\t\t\t\t(list body org-babel-R-eoe-indicator)\r\n-\t\t\t\t\t\"\\n\"))\r\n-\t\t     (inferior-ess-send-input)))))))) \"\\n\"))))\r\n+     (let ((tmp-src-file (org-babel-temp-file \"R-\")))\r\n+       (with-temp-file tmp-src-file\r\n+         (insert (concat\r\n+                  (org-babel-chomp body) \"\\n\" org-babel-R-eoe-indicator)))\r\n+       (with-current-buffer session\r\n+         (org-babel-comint-with-output\r\n+             (session org-babel-R-eoe-output nil nil t)\r\n+           (ess-send-string (get-buffer-process (current-buffer))\r\n+                            (format \"source('%s', echo=F, print.eval=T)\"\r\n+                                    (org-babel-process-file-name\r\n+\t\t\t             tmp-src-file 'noquote)))))))))\r\n \r\n (defun org-babel-R-process-value-result (result column-names-p)\r\n   \"R-specific processing of return value.\r\ndiff --git a\/lisp\/ob-comint.el b\/lisp\/ob-comint.el\r\nindex b88ac445a..a21c50ff1 100644\r\n--- a\/lisp\/ob-comint.el\r\n+++ b\/lisp\/ob-comint.el\r\n@@ -105,11 +105,15 @@ (defmacro org-babel-comint-with-output (meta &rest body)\r\n   \"Evaluate BODY in BUFFER and return process output.\r\n Will wait until EOE-INDICATOR appears in the output, then return\r\n all process output.  If REMOVE-ECHO and FULL-BODY are present and\r\n-non-nil, then strip echo'd body from the returned output.  META\r\n-should be a list containing the following where the last two\r\n-elements are optional.\r\n+non-nil, then strip echo'd body from the returned output.  If\r\n+NO-CLEANUP-PROMPT is nil, prompts are detected in the output, and\r\n+the returned value is a list of the output split on the prompt\r\n+positions; if non-nil, suppress that behavior, and just return a\r\n+single string of all the output up to EOE-INDICATOR.  META should\r\n+be a list containing the following where the last three elements\r\n+are optional.\r\n \r\n- (BUFFER EOE-INDICATOR REMOVE-ECHO FULL-BODY)\r\n+ (BUFFER EOE-INDICATOR REMOVE-ECHO FULL-BODY NO-CLEANUP-PROMPT)\r\n \r\n This macro ensures that the filter is removed in case of an error\r\n or user `keyboard-quit' during execution of body.\"\r\n@@ -117,7 +121,8 @@ (defmacro org-babel-comint-with-output (meta &rest body)\r\n   (let ((buffer (nth 0 meta))\r\n \t(eoe-indicator (nth 1 meta))\r\n \t(remove-echo (nth 2 meta))\r\n-\t(full-body (nth 3 meta)))\r\n+\t(full-body (nth 3 meta))\r\n+        (no-cleanup-prompt (nth 4 meta)))\r\n     `(org-babel-comint-in-buffer ,buffer\r\n        (let* ((string-buffer \"\")\r\n \t      (comint-output-filter-functions\r\n@@ -125,7 +130,7 @@ (defmacro org-babel-comint-with-output (meta &rest body)\r\n                        (setq string-buffer (concat string-buffer text)))\r\n \t\t     comint-output-filter-functions))\r\n \t      dangling-text)\r\n-\t ;; got located, and save dangling text\r\n+         ;; got located, and save dangling text\r\n \t (goto-char (process-mark (get-buffer-process (current-buffer))))\r\n \t (let ((start (point))\r\n \t       (end (point-max)))\r\n@@ -135,13 +140,11 @@ (defmacro org-babel-comint-with-output (meta &rest body)\r\n \t ,@body\r\n \t ;; wait for end-of-evaluation indicator\r\n          (let ((start-time (current-time)))\r\n-\t   (while (progn\r\n-\t\t    (goto-char comint-last-input-end)\r\n-\t\t    (not (save-excursion\r\n-\t\t         (and (re-search-forward\r\n-\t\t\t       (regexp-quote ,eoe-indicator) nil t)\r\n-\t\t\t      (re-search-forward\r\n-\t\t\t       comint-prompt-regexp nil t)))))\r\n+\t   (while (not (save-excursion\r\n+\t\t         (and (string-match\r\n+\t\t\t       (regexp-quote ,eoe-indicator) string-buffer)\r\n+\t\t\t      (string-match\r\n+\t\t\t       comint-prompt-regexp string-buffer))))\r\n \t     (accept-process-output\r\n               (get-buffer-process (current-buffer))\r\n               org-babel-comint-fallback-regexp-threshold)\r\n@@ -152,21 +155,24 @@ (defmacro org-babel-comint-with-output (meta &rest body)\r\n \t\t          (goto-char comint-last-input-end)\r\n \t\t          (save-excursion\r\n                             (and\r\n-                             (re-search-forward\r\n-\t\t\t      (regexp-quote ,eoe-indicator) nil t)\r\n-\t\t\t     (re-search-forward\r\n-                              org-babel-comint-prompt-regexp-fallback nil t)))))\r\n+                             (string-match\r\n+\t\t\t      (regexp-quote ,eoe-indicator) string-buffer)\r\n+\t\t\t     (string-match\r\n+                              org-babel-comint-prompt-regexp-fallback string-buffer)))))\r\n                (org-babel-comint--set-fallback-prompt))))\r\n \t ;; replace cut dangling text\r\n-\t (goto-char (process-mark (get-buffer-process (current-buffer))))\r\n+         (goto-char (process-mark (get-buffer-process (current-buffer))))\r\n \t (insert dangling-text)\r\n \r\n          ;; remove echo'd FULL-BODY from input\r\n          (and ,remove-echo ,full-body\r\n               (setq string-buffer (org-babel-comint--echo-filter string-buffer ,full-body)))\r\n \r\n-         ;; Filter out prompts.\r\n-         (org-babel-comint--prompt-filter string-buffer)))))\r\n+         (if ,no-cleanup-prompt\r\n+             (save-match-data\r\n+               (string-match (regexp-quote ,eoe-indicator) string-buffer)\r\n+               (org-babel-chomp (substring string-buffer 0 (match-beginning 0))))\r\n+           (org-babel-comint--prompt-filter string-buffer))))))\r\n \r\n (defun org-babel-comint-input-command (buffer cmd)\r\n   \"Pass CMD to BUFFER.\r\ndiff --git a\/lisp\/ob-python.el b\/lisp\/ob-python.el\r\nindex 8a3c24f70..ceade40ee 100644\r\n--- a\/lisp\/ob-python.el\r\n+++ b\/lisp\/ob-python.el\r\n@@ -451,31 +451,19 @@ (defun org-babel-python-evaluate-external-process\r\n (defun org-babel-python-send-string (session body)\r\n   \"Pass BODY to the Python process in SESSION.\r\n Return output.\"\r\n-  (with-current-buffer session\r\n-    (let* ((string-buffer \"\")\r\n-\t   (comint-output-filter-functions\r\n-\t    (cons (lambda (text) (setq string-buffer\r\n-\t\t\t\t       (concat string-buffer text)))\r\n-\t\t  comint-output-filter-functions))\r\n-\t   (body (format \"\\\r\n+  (org-babel-comint-with-output\r\n+      ((org-babel-session-buffer:python session)\r\n+       org-babel-python-eoe-indicator\r\n+       nil nil t)\r\n+    (python-shell-send-string (format \"\\\r\n try:\r\n %s\r\n except:\r\n     raise\r\n finally:\r\n     print('%s')\"\r\n-\t\t\t (org-babel-python--shift-right body 4)\r\n-\t\t\t org-babel-python-eoe-indicator)))\r\n-      (let ((python-shell-buffer-name\r\n-\t     (org-babel-python-without-earmuffs session)))\r\n-\t(python-shell-send-string body))\r\n-      ;; same as `python-shell-comint-end-of-output-p' in emacs-25.1+\r\n-      (while (not (and (python-shell-comint-end-of-output-p string-buffer)\r\n-                       (string-match\r\n-\t\t        org-babel-python-eoe-indicator\r\n-\t\t        string-buffer)))\r\n-\t(accept-process-output (get-buffer-process (current-buffer))))\r\n-      (org-babel-chomp (substring string-buffer 0 (match-beginning 0))))))\r\n+\t\t\t              (org-babel-python--shift-right body 4)\r\n+\t\t\t              org-babel-python-eoe-indicator))))\r\n \r\n (defun org-babel-python-evaluate-session\r\n     (session body &optional result-type result-params graphics-file)\r\ndiff --git a\/testing\/lisp\/test-ob-R.el b\/testing\/lisp\/test-ob-R.el\r\nindex 0d291bf54..b8dcaa973 100644\r\n--- a\/testing\/lisp\/test-ob-R.el\r\n+++ b\/testing\/lisp\/test-ob-R.el\r\n@@ -126,6 +126,18 @@ (ert-deftest test-ob-r\/output-with-<> ()\r\n ))))\r\n \r\n \r\n+(ert-deftest test-ob-r\/session-output-with->-bol ()\r\n+  \"make sure prompt-like strings are well formatted, even when at beginning of line.\"\r\n+    (let (ess-ask-for-ess-directory ess-history-file)\r\n+      (should (string=\"abc\r\n+def> <ghi\"\r\n+  (org-test-with-temp-text \"#+begin_src R :results output :session R\r\n+     cat(\\\"abc\r\n+     def> <ghi\\\")\r\n+   #+end_src\r\n+\"\r\n+    (org-babel-execute-src-block))\r\n+))))\r\n \r\n \r\n ;; (ert-deftest test-ob-r\/output-with-error ()\r\n-- \r\n2.46.2\r\n\r\n","subject":"Re: [PATCH] ob-comint,R,python: Options for more robust non-async session output"},{"date":"2024-10-20T09:51:26.369Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87zfmzqezp.fsf@localhost","message-id":"87zfmzqezp.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["95CE1447-FC08-431A-9CA1-83B4C3F77BA7@gmail.com"],"related-refs":["87zfmzqezp.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] Insert reference to Org table cell or cell range from region selection (w\/without mouse)"},{"date":"2024-10-18T21:22:42.657Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87h6993y6q.fsf@gmail.com","message-id":"87h6993y6q.fsf@gmail.com","config":false,"refs-count":7,"username":"Jack Kamm","related-refs":["878qui3t7b.fsf@gmail.com","87h6993y6q.fsf@gmail.com","877c9k19cc.fsf@gmail.com"],"from":"jackkamm@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87h6993y6q.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 232f4c60323b13e3d46cb377095a8b2751f7ed74 Mon Sep 17 00:00:00 2001\r\nFrom: Jack Kamm <jackkamm@gmail.com>\r\nDate: Thu, 17 Oct 2024 17:33:47 -0700\r\nSubject: [PATCH] Add options to skip extra processing in\r\n org-babel-comint-with-output\r\n\r\nThis patch adds options to org-babel-comint-with-output to skip prompt\r\nremoval and saving of dangling text.  Allowing individual languages to\r\nhandle this cleanup can be more robust than relying on the generic\r\nob-comint implementation.  This allows ob-python to switch back to\r\nusing `org-babel-comint-with-output' rather than its own bespoke\r\nreimplementation, reducing code duplication.  Furthermore, this adds a\r\nnew implementation of ob-R non-async session output evaluation, that\r\nis similar to the ob-python approach in that it avoids leaking prompts\r\nor interfering with dangling text altogether, rather than relying on\r\nthe cleanup from `org-babel-comint-with-output'.  A test is added to\r\ntest-ob-R.el to demonstrate the improved robustness of the new\r\napproach; previously, this test would fail due to a false positive\r\nprompt, but now passes.\r\n\r\n* lisp\/ob-comint.el (org-babel-comint-with-output): Add new arguments\r\nto prevent extra processing for prompt cleanup and saving dangling\r\noutput.  Also, search for the end-of-execution sentinel within the\r\ncollected output rather than the comint buffer, so that point and\r\ndangling text don't need to be modified.\r\n* lisp\/ob-python.el (org-babel-python-send-string): Switch to using\r\n`org-babel-comint-with-output', rather than bespoke reimplementation.\r\n* lisp\/ob-R.el (ess-send-string): Declare external function.\r\n(org-babel-R-evaluate-session): New implementation of output\r\nevaluation that avoids leaking prompts, by writing the code block to a\r\ntmp file and then sourcing it.  Also uses `ess-send-string' (rather\r\nthan inserting code into the comint buffer) to avoid interfering with\r\ndangling text.\r\n* testing\/lisp\/test-ob-R.el (test-ob-r\/session-output-with->-bol): New\r\ntest for robustness against false positive prompts at the beginning of\r\na line.\r\n---\r\n lisp\/ob-R.el              | 32 ++++++++-----------\r\n lisp\/ob-comint.el         | 65 +++++++++++++++++++++++----------------\r\n lisp\/ob-python.el         | 26 +++++-----------\r\n testing\/lisp\/test-ob-R.el | 12 ++++++++\r\n 4 files changed, 69 insertions(+), 66 deletions(-)\r\n\r\ndiff --git a\/lisp\/ob-R.el b\/lisp\/ob-R.el\r\nindex 481212202..80c6b0e09 100644\r\n--- a\/lisp\/ob-R.el\r\n+++ b\/lisp\/ob-R.el\r\n@@ -42,6 +42,8 @@ (declare-function ess-make-buffer-current \"ext:ess-inf\" ())\r\n (declare-function ess-eval-buffer \"ext:ess-inf\" (vis))\r\n (declare-function ess-wait-for-process \"ext:ess-inf\"\r\n \t\t  (&optional proc sec-prompt wait force-redisplay))\r\n+(declare-function ess-send-string \"ext:ess-inf\"\r\n+                  (process string &optional visibly message type))\r\n \r\n (defvar ess-current-process-name) ; ess-custom.el\r\n (defvar ess-local-process-name)   ; ess-custom.el\r\n@@ -448,26 +450,16 @@ (defun org-babel-R-evaluate-session\r\n \t  (org-babel-import-elisp-from-file tmp-file '(16)))\r\n \tcolumn-names-p)))\r\n     (output\r\n-     (mapconcat\r\n-      'org-babel-chomp\r\n-      (butlast\r\n-       (delq nil\r\n-\t     (mapcar\r\n-\t      (lambda (line) (when (> (length line) 0) line))\r\n-\t      (mapcar\r\n-\t       (lambda (line) ;; cleanup extra prompts left in output\r\n-\t\t (if (string-match\r\n-\t\t      \"^\\\\([>+.]\\\\([ ][>.+]\\\\)*[ ]\\\\)\"\r\n-\t\t      (car (split-string line \"\\n\")))\r\n-\t\t     (substring line (match-end 1))\r\n-\t\t   line))\r\n-\t       (with-current-buffer session\r\n-\t\t (let ((comint-prompt-regexp (concat \"^\" comint-prompt-regexp)))\r\n-\t\t   (org-babel-comint-with-output (session org-babel-R-eoe-output)\r\n-\t\t     (insert (mapconcat 'org-babel-chomp\r\n-\t\t\t\t\t(list body org-babel-R-eoe-indicator)\r\n-\t\t\t\t\t\"\\n\"))\r\n-\t\t     (inferior-ess-send-input)))))))) \"\\n\"))))\r\n+     (let ((tmp-src-file (org-babel-temp-file \"R-\")))\r\n+       (with-temp-file tmp-src-file\r\n+         (insert (concat\r\n+                  (org-babel-chomp body) \"\\n\" org-babel-R-eoe-indicator)))\r\n+       (with-current-buffer session\r\n+         (org-babel-comint-with-output (session org-babel-R-eoe-output nil nil t t)\r\n+           (ess-send-string (get-buffer-process (current-buffer))\r\n+                            (format \"source('%s', echo=F, print.eval=T)\"\r\n+                                    (org-babel-process-file-name\r\n+\t\t\t             tmp-src-file 'noquote)))))))))\r\n \r\n (defun org-babel-R-process-value-result (result column-names-p)\r\n   \"R-specific processing of return value.\r\ndiff --git a\/lisp\/ob-comint.el b\/lisp\/ob-comint.el\r\nindex b88ac445a..3fbfbe0ec 100644\r\n--- a\/lisp\/ob-comint.el\r\n+++ b\/lisp\/ob-comint.el\r\n@@ -105,11 +105,17 @@ (defmacro org-babel-comint-with-output (meta &rest body)\r\n   \"Evaluate BODY in BUFFER and return process output.\r\n Will wait until EOE-INDICATOR appears in the output, then return\r\n all process output.  If REMOVE-ECHO and FULL-BODY are present and\r\n-non-nil, then strip echo'd body from the returned output.  META\r\n-should be a list containing the following where the last two\r\n-elements are optional.\r\n-\r\n- (BUFFER EOE-INDICATOR REMOVE-ECHO FULL-BODY)\r\n+non-nil, then strip echo'd body from the returned output.  If\r\n+NO-SAVE-DANGLE is nil, current text at the prompt is removed\r\n+before evaluation, then restored; if non-nil, supress that\r\n+behavior.  If NO-CLEANUP-PROMPT is nil, prompts are detected in\r\n+the output, and the returned value is a list of the output split\r\n+on the prompt positions; if non-nil, suppress that behavior, and\r\n+just return a single string of all the output up to\r\n+EOE-INDICATOR.  META should be a list containing the following\r\n+where the last four elements are optional.\r\n+\r\n+ (BUFFER EOE-INDICATOR REMOVE-ECHO FULL-BODY NO-SAVE-DANGLE NO-CLEANUP-PROMPT)\r\n \r\n This macro ensures that the filter is removed in case of an error\r\n or user `keyboard-quit' during execution of body.\"\r\n@@ -117,7 +123,9 @@ (defmacro org-babel-comint-with-output (meta &rest body)\r\n   (let ((buffer (nth 0 meta))\r\n \t(eoe-indicator (nth 1 meta))\r\n \t(remove-echo (nth 2 meta))\r\n-\t(full-body (nth 3 meta)))\r\n+\t(full-body (nth 3 meta))\r\n+        (no-save-dangle (nth 5 meta))\r\n+        (no-cleanup-prompt (nth 4 meta)))\r\n     `(org-babel-comint-in-buffer ,buffer\r\n        (let* ((string-buffer \"\")\r\n \t      (comint-output-filter-functions\r\n@@ -125,23 +133,22 @@ (defmacro org-babel-comint-with-output (meta &rest body)\r\n                        (setq string-buffer (concat string-buffer text)))\r\n \t\t     comint-output-filter-functions))\r\n \t      dangling-text)\r\n-\t ;; got located, and save dangling text\r\n-\t (goto-char (process-mark (get-buffer-process (current-buffer))))\r\n-\t (let ((start (point))\r\n-\t       (end (point-max)))\r\n-\t   (setq dangling-text (buffer-substring start end))\r\n-\t   (delete-region start end))\r\n+         (unless ,no-save-dangle\r\n+\t   ;; got located, and save dangling text\r\n+\t   (goto-char (process-mark (get-buffer-process (current-buffer))))\r\n+\t   (let ((start (point))\r\n+\t         (end (point-max)))\r\n+\t     (setq dangling-text (buffer-substring start end))\r\n+\t     (delete-region start end)))\r\n \t ;; pass FULL-BODY to process\r\n \t ,@body\r\n \t ;; wait for end-of-evaluation indicator\r\n          (let ((start-time (current-time)))\r\n-\t   (while (progn\r\n-\t\t    (goto-char comint-last-input-end)\r\n-\t\t    (not (save-excursion\r\n-\t\t         (and (re-search-forward\r\n-\t\t\t       (regexp-quote ,eoe-indicator) nil t)\r\n-\t\t\t      (re-search-forward\r\n-\t\t\t       comint-prompt-regexp nil t)))))\r\n+\t   (while (not (save-excursion\r\n+\t\t         (and (string-match\r\n+\t\t\t       (regexp-quote ,eoe-indicator) string-buffer)\r\n+\t\t\t      (string-match\r\n+\t\t\t       comint-prompt-regexp string-buffer))))\r\n \t     (accept-process-output\r\n               (get-buffer-process (current-buffer))\r\n               org-babel-comint-fallback-regexp-threshold)\r\n@@ -152,21 +159,25 @@ (defmacro org-babel-comint-with-output (meta &rest body)\r\n \t\t          (goto-char comint-last-input-end)\r\n \t\t          (save-excursion\r\n                             (and\r\n-                             (re-search-forward\r\n-\t\t\t      (regexp-quote ,eoe-indicator) nil t)\r\n-\t\t\t     (re-search-forward\r\n-                              org-babel-comint-prompt-regexp-fallback nil t)))))\r\n+                             (string-match\r\n+\t\t\t      (regexp-quote ,eoe-indicator) string-buffer)\r\n+\t\t\t     (string-match\r\n+                              org-babel-comint-prompt-regexp-fallback string-buffer)))))\r\n                (org-babel-comint--set-fallback-prompt))))\r\n \t ;; replace cut dangling text\r\n-\t (goto-char (process-mark (get-buffer-process (current-buffer))))\r\n-\t (insert dangling-text)\r\n+         (unless ,no-save-dangle\r\n+\t   (goto-char (process-mark (get-buffer-process (current-buffer))))\r\n+\t   (insert dangling-text))\r\n \r\n          ;; remove echo'd FULL-BODY from input\r\n          (and ,remove-echo ,full-body\r\n               (setq string-buffer (org-babel-comint--echo-filter string-buffer ,full-body)))\r\n \r\n-         ;; Filter out prompts.\r\n-         (org-babel-comint--prompt-filter string-buffer)))))\r\n+         (if ,no-cleanup-prompt\r\n+             (save-match-data\r\n+               (string-match (regexp-quote ,eoe-indicator) string-buffer)\r\n+               (org-babel-chomp (substring string-buffer 0 (match-beginning 0))))\r\n+           (org-babel-comint--prompt-filter string-buffer))))))\r\n \r\n (defun org-babel-comint-input-command (buffer cmd)\r\n   \"Pass CMD to BUFFER.\r\ndiff --git a\/lisp\/ob-python.el b\/lisp\/ob-python.el\r\nindex 8a3c24f70..82f7e4e8f 100644\r\n--- a\/lisp\/ob-python.el\r\n+++ b\/lisp\/ob-python.el\r\n@@ -451,31 +451,19 @@ (defun org-babel-python-evaluate-external-process\r\n (defun org-babel-python-send-string (session body)\r\n   \"Pass BODY to the Python process in SESSION.\r\n Return output.\"\r\n-  (with-current-buffer session\r\n-    (let* ((string-buffer \"\")\r\n-\t   (comint-output-filter-functions\r\n-\t    (cons (lambda (text) (setq string-buffer\r\n-\t\t\t\t       (concat string-buffer text)))\r\n-\t\t  comint-output-filter-functions))\r\n-\t   (body (format \"\\\r\n+  (org-babel-comint-with-output\r\n+      ((org-babel-session-buffer:python session)\r\n+       org-babel-python-eoe-indicator\r\n+       nil nil t t)\r\n+    (python-shell-send-string (format \"\\\r\n try:\r\n %s\r\n except:\r\n     raise\r\n finally:\r\n     print('%s')\"\r\n-\t\t\t (org-babel-python--shift-right body 4)\r\n-\t\t\t org-babel-python-eoe-indicator)))\r\n-      (let ((python-shell-buffer-name\r\n-\t     (org-babel-python-without-earmuffs session)))\r\n-\t(python-shell-send-string body))\r\n-      ;; same as `python-shell-comint-end-of-output-p' in emacs-25.1+\r\n-      (while (not (and (python-shell-comint-end-of-output-p string-buffer)\r\n-                       (string-match\r\n-\t\t        org-babel-python-eoe-indicator\r\n-\t\t        string-buffer)))\r\n-\t(accept-process-output (get-buffer-process (current-buffer))))\r\n-      (org-babel-chomp (substring string-buffer 0 (match-beginning 0))))))\r\n+\t\t\t              (org-babel-python--shift-right body 4)\r\n+\t\t\t              org-babel-python-eoe-indicator))))\r\n \r\n (defun org-babel-python-evaluate-session\r\n     (session body &optional result-type result-params graphics-file)\r\ndiff --git a\/testing\/lisp\/test-ob-R.el b\/testing\/lisp\/test-ob-R.el\r\nindex 0d291bf54..b8dcaa973 100644\r\n--- a\/testing\/lisp\/test-ob-R.el\r\n+++ b\/testing\/lisp\/test-ob-R.el\r\n@@ -126,6 +126,18 @@ (ert-deftest test-ob-r\/output-with-<> ()\r\n ))))\r\n \r\n \r\n+(ert-deftest test-ob-r\/session-output-with->-bol ()\r\n+  \"make sure prompt-like strings are well formatted, even when at beginning of line.\"\r\n+    (let (ess-ask-for-ess-directory ess-history-file)\r\n+      (should (string=\"abc\r\n+def> <ghi\"\r\n+  (org-test-with-temp-text \"#+begin_src R :results output :session R\r\n+     cat(\\\"abc\r\n+     def> <ghi\\\")\r\n+   #+end_src\r\n+\"\r\n+    (org-babel-execute-src-block))\r\n+))))\r\n \r\n \r\n ;; (ert-deftest test-ob-r\/output-with-error ()\r\n-- \r\n2.46.2\r\n\r\n","subject":"[PATCH] ob-comint,R,python: Options for more robust non-async session output"},{"date":"2024-10-15T07:05:51.042Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87wmi9etku.fsf@gmail.com","message-id":"87wmi9etku.fsf@gmail.com","config":false,"refs-count":9,"username":"Jack Kamm","references":["87setrqs4z.fsf@gmail.com","87wmiqigfp.fsf@localhost"],"related-refs":["87ed4b45r7.fsf@gmail.com","87wmi9etku.fsf@gmail.com","87ldy9gcmn.fsf@gmail.com","8734koert4.fsf@gmail.com"],"from":"jackkamm@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87wmi9etku.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 5c9d6f28f14c51fc542c997ed6aa6792e59857c6 Mon Sep 17 00:00:00 2001\r\nFrom: Jack Kamm <jackkamm@gmail.com>\r\nDate: Sun, 22 Sep 2024 13:48:45 -0700\r\nSubject: [PATCH] Disable async prompt removal in ob-R,python\r\n\r\n* lisp\/ob-comint.el (org-babel-comint-async-remove-prompts-p): New\r\nvariable to disable prompt removal in async output.\r\n(org-babel-comint-async-filter): Check\r\n`org-babel-comint-async-remove-prompts-p' before calling\r\n`org-babel-comint--prompt-filter'.\r\n(org-babel-comint-async-register): Added argument for whether prompts\r\nshould be removed from async output.\r\n* lisp\/ob-python.el (org-babel-python-async-evaluate-session): Set\r\noption to inhibit prompt removal when registering async evaluators.\r\n* lisp\/ob-R.el (ob-session-async-org-babel-R-evaluate-session): Set\r\noption to inhibit prompt removal when registering async evaluators.\r\n* testing\/lisp\/test-ob-R.el (test-ob-R\/async-prompt-filter): Test for\r\nover-aggressive prompt removal.\r\n---\r\n lisp\/ob-R.el              |  3 ++-\r\n lisp\/ob-comint.el         | 27 ++++++++++++++++++++-------\r\n lisp\/ob-python.el         |  3 ++-\r\n testing\/lisp\/test-ob-R.el | 28 ++++++++++++++++++++++++++++\r\n 4 files changed, 52 insertions(+), 9 deletions(-)\r\n\r\ndiff --git a\/lisp\/ob-R.el b\/lisp\/ob-R.el\r\nindex de2d27a9a..08d8227f0 100644\r\n--- a\/lisp\/ob-R.el\r\n+++ b\/lisp\/ob-R.el\r\n@@ -486,7 +486,8 @@ (defun ob-session-async-org-babel-R-evaluate-session\r\n    session (current-buffer)\r\n    \"^\\\\(?:[>.+] \\\\)*\\\\[1\\\\] \\\"ob_comint_async_R_\\\\(start\\\\|end\\\\|file\\\\)_\\\\(.+\\\\)\\\"$\"\r\n    'org-babel-chomp\r\n-   'ob-session-async-R-value-callback)\r\n+   'ob-session-async-R-value-callback\r\n+   t)\r\n   (cl-case result-type\r\n     (value\r\n      (let ((tmp-file (org-babel-temp-file \"R-\")))\r\ndiff --git a\/lisp\/ob-comint.el b\/lisp\/ob-comint.el\r\nindex 764927af7..f37aa5264 100644\r\n--- a\/lisp\/ob-comint.el\r\n+++ b\/lisp\/ob-comint.el\r\n@@ -239,6 +239,9 @@ (defvar-local org-babel-comint-async-chunk-callback nil\r\n comint process.  It should return a string that will be passed\r\n to `org-babel-insert-result'.\")\r\n \r\n+(defvar-local org-babel-comint-async-remove-prompts-p t\r\n+  \"Whether prompts should be detected and removed from async output.\")\r\n+\r\n (defvar-local org-babel-comint-async-dangling nil\r\n   \"Dangling piece of the last process output, as a string.\r\n Used when `org-babel-comint-async-indicator' is spread across multiple\r\n@@ -326,10 +329,16 @@ (defun org-babel-comint-async-filter (string)\r\n \t\t      until (and (equal (match-string 1) \"start\")\r\n \t\t\t\t (equal (match-string 2) uuid))\r\n \t\t      finally return (+ 1 (match-end 0)))))\r\n-                   ;; Remove prompt\r\n-                   (res-promptless (org-trim (string-join (mapcar #'org-trim (org-babel-comint--prompt-filter res-str-raw)) \"\\n\") \"\\n\"))\r\n \t\t   ;; Apply user callback\r\n-\t\t   (res-str (funcall org-babel-comint-async-chunk-callback res-promptless)))\r\n+\t\t   (res-str (funcall org-babel-comint-async-chunk-callback\r\n+                                     (if org-babel-comint-async-remove-prompts-p\r\n+                                         (org-trim (string-join\r\n+                                                    (mapcar #'org-trim\r\n+                                                            (org-babel-comint--prompt-filter\r\n+                                                             res-str-raw))\r\n+                                                    \"\\n\")\r\n+                                                   t)\r\n+                                       res-str-raw))))\r\n \t      ;; Search for uuid in associated org-buffers to insert results\r\n \t      (cl-loop for buf in org-buffers\r\n \t\t       until (with-current-buffer buf\r\n@@ -350,18 +359,22 @@ (defun org-babel-comint-async-filter (string)\r\n \r\n (defun org-babel-comint-async-register\r\n     (session-buffer org-buffer indicator-regexp\r\n-\t\t    chunk-callback file-callback)\r\n+\t\t    chunk-callback file-callback\r\n+                    &optional inhibit-prompt-removal)\r\n   \"Set local org-babel-comint-async variables in SESSION-BUFFER.\r\n ORG-BUFFER is added to `org-babel-comint-async-buffers' if not\r\n present.  `org-babel-comint-async-indicator',\r\n `org-babel-comint-async-chunk-callback', and\r\n `org-babel-comint-async-file-callback' are set to\r\n-INDICATOR-REGEXP, CHUNK-CALLBACK, and FILE-CALLBACK\r\n-respectively.\"\r\n+INDICATOR-REGEXP, CHUNK-CALLBACK, and FILE-CALLBACK respectively.\r\n+If INHIBIT-PROMPT-REMOVAL,\r\n+`org-babel-comint-async-remove-prompts-p' is set to `nil' to\r\n+prevent prompt detection and removal from async output.\"\r\n   (org-babel-comint-in-buffer session-buffer\r\n     (setq org-babel-comint-async-indicator indicator-regexp\r\n \t  org-babel-comint-async-chunk-callback chunk-callback\r\n-\t  org-babel-comint-async-file-callback file-callback)\r\n+\t  org-babel-comint-async-file-callback file-callback\r\n+          org-babel-comint-async-remove-prompts-p (not inhibit-prompt-removal))\r\n     (unless (memq org-buffer org-babel-comint-async-buffers)\r\n       (setq org-babel-comint-async-buffers\r\n \t    (cons org-buffer org-babel-comint-async-buffers)))\r\ndiff --git a\/lisp\/ob-python.el b\/lisp\/ob-python.el\r\nindex 8a3c24f70..38ebe9147 100644\r\n--- a\/lisp\/ob-python.el\r\n+++ b\/lisp\/ob-python.el\r\n@@ -538,7 +538,8 @@ (defun org-babel-python-async-evaluate-session\r\n   (org-babel-comint-async-register\r\n    session (current-buffer)\r\n    \"ob_comint_async_python_\\\\(start\\\\|end\\\\|file\\\\)_\\\\(.+\\\\)\"\r\n-   'org-babel-chomp 'org-babel-python-async-value-callback)\r\n+   'org-babel-chomp 'org-babel-python-async-value-callback\r\n+   t)\r\n   (pcase result-type\r\n     (`output\r\n      (let ((uuid (org-id-uuid)))\r\ndiff --git a\/testing\/lisp\/test-ob-R.el b\/testing\/lisp\/test-ob-R.el\r\nindex 9ffbf3afd..05b91afd6 100644\r\n--- a\/testing\/lisp\/test-ob-R.el\r\n+++ b\/testing\/lisp\/test-ob-R.el\r\n@@ -316,6 +316,34 @@ (org-test-with-temp-text-in-file\r\n             (string= (concat text result)\r\n                      (buffer-string)))))))\r\n \r\n+(ert-deftest test-ob-R\/async-prompt-filter ()\r\n+  \"Test that async evaluation doesn't remove spurious prompts and leading indentation.\"\r\n+  (let* (ess-ask-for-ess-directory\r\n+         ess-history-file\r\n+         org-confirm-babel-evaluate\r\n+         (session-name \"*R:test-ob-R\/session-async-results*\")\r\n+         (kill-buffer-query-functions nil)\r\n+         (start-time (current-time))\r\n+         (wait-time (time-add start-time 3))\r\n+         uuid-placeholder)\r\n+    (org-test-with-temp-text\r\n+     (concat \"#+begin_src R :session \" session-name \" :async t :results output\r\n+table(c('ab','ab','c',NA,NA), useNA='always')\r\n+#+end_src\")\r\n+     (setq uuid-placeholder (org-trim (org-babel-execute-src-block)))\r\n+     (catch 'too-long\r\n+       (while (string-match uuid-placeholder (buffer-string))\r\n+         (progn\r\n+           (sleep-for 0.01)\r\n+           (when (time-less-p wait-time (current-time))\r\n+             (throw 'too-long (ert-fail \"Took too long to get result from callback\"))))))\r\n+     (search-forward \"#+results\")\r\n+     (beginning-of-line 2)\r\n+     (when (should (re-search-forward \"\\\r\n+:\\\\([ ]+ab\\\\)[ ]+c[ ]+<NA>[ ]*\r\n+:\\\\([ ]+2\\\\)[ ]+1[ ]+2\"))\r\n+       (should (equal (length (match-string 1)) (length (match-string 2))))\r\n+       (kill-buffer session-name)))))\r\n \r\n (provide 'test-ob-R)\r\n \r\n-- \r\n2.47.0\r\n\r\n","subject":"Re: [PATCH] Async sessions: Fix prompt removal regression in ob-R"},{"date":"2024-10-14T16:38:39.325Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87r08i3alo.fsf@gmail.com","message-id":"87r08i3alo.fsf@gmail.com","config":false,"refs-count":23,"username":"Visuwesh","related-refs":["87bjxyqgo5.fsf@gmail.com","878qs5bxm2.fsf@gmail.com","87r08i3alo.fsf@gmail.com"],"from":"visuweshm@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87r08i3alo.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 0cd4b1c5402256ed64c9e1711db11ad215c6c1a3 Mon Sep 17 00:00:00 2001\r\nFrom: Visuwesh <visuweshm@gmail.com>\r\nDate: Mon, 14 Oct 2024 22:04:23 +0530\r\nSubject: [PATCH] Add `yank-media' handler for LibreOffice Calc tables\r\n\r\n* lisp\/org.el (org--libreoffice-table-handler): Add new `yank-media'\r\nhandler for tables copied from LibreOffice Calc documents.\r\n(org-setup-yank-dnd-handlers): Register it.\r\n* doc\/org-manual.org: (Drag and Drop & ~yank-media~): Update the\r\nmanual to mention the new feature.\r\n* etc\/ORG-NEWS: Announce the new feature.\r\n---\r\n doc\/org-manual.org |  6 +++++-\r\n etc\/ORG-NEWS       |  5 +++++\r\n lisp\/org.el        | 14 +++++++++++++-\r\n 3 files changed, 23 insertions(+), 2 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 451fd72cd..e8da07356 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -21640,7 +21640,8 @@ value as ~org-attach-method~ (~cp~ by default).]\r\n \r\n #+cindex: pasting files, images from clipboard\r\n Starting from Emacs 29, Org mode supports ~yank-media~ command to yank\r\n-images from the clipboard and files from a file manager.\r\n+images from the clipboard, files from a file manager and tables copied\r\n+from LibreOffice Calc documents.\r\n \r\n #+vindex: org-yank-image-save-method\r\n When yanking images from clipboard, Org saves the image on disk and\r\n@@ -21658,6 +21659,9 @@ of ~org-yank-dnd-method~.  Image files pasted this way also respect\r\n the value of ~org-yank-image-save-method~ when the action to perform\r\n is =attach=.\r\n \r\n+When yanking tables copied from LibreOffice Calc documents, they are\r\n+inserted as Org tables when yanking them.\r\n+\r\n ** Repeating commands\r\n :PROPERTIES:\r\n :DESCRIPTION: Repeating navigation commands\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 5d421172f..37ee9a52f 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -114,6 +114,11 @@ The keybindings in the repeat-maps can be changed by customizing\r\n \r\n See the new [[info:org#Repeating commands][\"Repeating commands\"]] section in Org mode manual.\r\n \r\n+*** Tables copied from LibreOffice Calc documents can be pasted as Org tables\r\n+\r\n+Tables copied into the clipboard from LibreOffice Calc documents can\r\n+now be pasted as an Org table using ~yank-media~.\r\n+\r\n ** New and changed options\r\n \r\n # Chanes deadling with changing default values of customizations,\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex 6177856c3..82ad40527 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -20860,7 +20860,9 @@ (defun org-setup-yank-dnd-handlers ()\r\n     ;; Looks like different DEs go for different handler names,\r\n     ;; https:\/\/larsee.com\/blog\/2019\/05\/clipboard-files\/.\r\n     (yank-media-handler \"x\/special-\\\\(?:gnome\\\\|KDE\\\\|mate\\\\)-files\"\r\n-                        #'org--copied-files-yank-media-handler))\r\n+                        #'org--copied-files-yank-media-handler)\r\n+    (yank-media-handler \"application\/x-libreoffice-tsvc\"\r\n+                        #'org--libreoffice-table-handler))\r\n   (when (boundp 'x-dnd-direct-save-function)\r\n     (setq-local x-dnd-direct-save-function #'org--dnd-xds-function)))\r\n \r\n@@ -20953,6 +20955,16 @@ (defun org--copied-files-yank-media-handler (_mimetype data)\r\n           (org--dnd-local-file-handler f action sep)\r\n         (message \"File `%s' is not readable, skipping\" f)))))\r\n \r\n+(defun org--libreoffice-table-handler (_mimetype data)\r\n+  \"Insert LibreOffice Calc table DATA as an Org table.\r\n+DATA is in the TSV format.\"\r\n+  (let ((beg (point)))\r\n+    (insert data)\r\n+    ;; LibreOffice source code defines\r\n+    ;; 'application\/x-libreoffice-tsvc' as Text TSV-Calc so it should\r\n+    ;; be safe to handle this as TSV always.\r\n+    (org-table-convert-region beg (point) '(16))))\r\n+\r\n (defcustom org-yank-dnd-method 'ask\r\n   \"Action to perform on the dropped and the pasted files.\r\n When the value is the symbol,\r\n-- \r\n2.45.2\r\n\r\n","subject":"[PATCH] Add yank-media handler for LibreOffice Calc tables"},{"date":"2024-10-13T11:20:06.470Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87v7xwz1v8.fsf@localhost","message-id":"87v7xwz1v8.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["cee83d4d2edacdc40bd4c705aa6cd709@anonaddy.com"],"related-refs":["87v7xwz1v8.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow searching by outline path in file: links to Org files [file:<filename::*parent heading::*child] (was: org-store-link relative to parent headings)"},{"date":"2024-09-22T07:57:26.209Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ed5cruis.fsf@localhost","message-id":"87ed5cruis.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["ca76997e-6571-4817-8b9d-8cbf350fd1e2@cosent.net","4b0d8deb-585e-4dd5-a332-72de057a3247@cosent.net","8734m1ktv9.fsf@localhost"],"related-refs":["87ed5cruis.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Regression: org-duration fails to support duration ranges since Org 9.0.6 (was: support range durations)"},{"date":"2024-09-18T01:46:31.887Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8734lx4twk.fsf@gmail.com","message-id":"8734lx4twk.fsf@gmail.com","config":false,"refs-count":21,"username":"Karthik Chikmagalur","references":["878qwb8qw1.fsf@localhost","CAL1eYuK5Nc0br3bX0fHU4e=wGd=MmmDPzKYC6VZMUoM6soqQ4Q@mail.gmail.com","875xrqg6cb.fsf@gmail.com","87h6b09v4o.fsf@gmail.com","87r0ajawgj.fsf@localhost","87cym38aj8.fsf@gmail.com","87o74mjgcy.fsf@localhost","87o74ypp3b.fsf@localhost","874j70n559.fsf@localhost","87v7zyyvm3.fsf@localhost","87h6ah72ui.fsf@localhost","87frr07xz8.fsf@gmail.com","87msksabld.fsf@gmail.com","87r09rxpjg.fsf@gmail.com","87jzfwljkq.fsf@localhost","87msl4wv8d.fsf@localhost","87a5h77zb1.fsf@gmail.com","878qw9ak6a.fsf@gmail.com","6461a84b.a70a0220.b6d36.5d00@mx.google.com","87o75yhwnu.fsf@localhost","8734m060ma.fsf@gmail.com"],"related-refs":["87tte7wdpj.fsf@gmail.com","87h68weovw.fsf@gmail.com","87h6b09v4o.fsf@gmail.com","8734lx4twk.fsf@gmail.com","87msimtz88.fsf@gmail.com","87a5enevy5.fsf@gmail.com","87cykbfodz.fsf@gmail.com","8734m060ma.fsf@gmail.com"],"from":"karthikchikmagalur@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/8734lx4twk.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From e35fdf594f34ca5b433013d0e7cfedc71b5321e7 Mon Sep 17 00:00:00 2001\r\nFrom: Karthik Chikmagalur <karthikchikmagalur@gmail.com>\r\nDate: Fri, 23 Aug 2024 15:46:53 -0700\r\nSubject: [PATCH] org-link: Customizable preview API for arbitrary link types\r\n\r\nAdd a customizable preview API for arbitrary link types.  Make\r\ninline image previews a part of the more universal org-link\r\npreview feature.  Each link type can now be previewed differently\r\nbased on a new link parameter.\r\n\r\n* lisp\/ol.el (org-link-parameters, org-link-preview-batch-size,\r\norg-link-preview-delay, org-link-preview--timer,\r\norg-link-preview--queue, org-link-preview-overlays,\r\norg-link-preview--get-overlays, org-link-preview--remove-overlay,\r\norg-link-preview, org-link-preview-region,\r\norg-link-preview--process-queue, org-link-preview-clear,\r\norg-link-preview-file, org-display-remote-inline-images,\r\norg-image-align, org--create-inline-image,\r\norg-display-inline-image--width, org-image--align): Add new\r\ncommands `org-link-preview', `org-link-preview-region' and\r\n`org-link-preview-clear' for creating link previews for any kind\r\nof link.  Add new org-link parameter `:preview' for specifying how\r\na link type should be previewed.  This link parameter is a\r\nfunction called asynchronously to place previes.  File links and\r\nattachments are previewed using inline image previews as before.\r\nMove image handling utilities from lisp\/org.el to lisp\/ol.el.\r\n\r\n* testing\/lisp\/test-org-fold.el: Use `org-link-preview'.\r\n\r\n* lisp\/org.el (org-toggle-inline-images,\r\norg-toggle-inline-images-command, org-display-inline-images,\r\norg--inline-image-overlays, org-inline-image-overlays,\r\norg-redisplay-inline-images, org-image-align,\r\norg-display-inline-remove-overlay, org-remove-inline-images):\r\nObsolete and move `org-toggle-inline-images',\r\n`org-display-inline-images' and `org-redisplay-inline-images' to\r\norg-compat.  These are obsoleted by `org-link-preview' and\r\n`org-link-preview-region'.  Remove\r\n`org-toggle-inline-images-command'.  Move the other internal\r\nfunctions to org-link.\r\n\r\n* lisp\/org-plot.el (org-plot\/redisplay-img-in-buffer): Modify to\r\nuse `org-link-preview'.\r\n\r\n* lisp\/org-keys.el: Bind `C-c C-x C-v' to new command\r\n`org-link-preview', which has the same prefix arg behaviors as\r\n`org-latex-preview'.  In addition to these, it supports numeric\r\nprefix args 1 and 11 to preview links with descriptions at\r\npoint\/region (with 1) and across the buffer (with 11).\r\n\r\n* lisp\/org-cycle.el (org-cycle-display-inline-images): Use\r\n`org-link-preview'.\r\n\r\n* lisp\/org-compat.el (org-display-inline-remove-overlay,\r\norg--inline-image-overlays, org-remove-inline-images,\r\norg-inline-image-overlays, org-display-inline-images,\r\norg-toggle-inline-images):\r\n\r\n* lisp\/org-attach.el (org-attach-preview-file): Add new `:preview'\r\nlink parameter for links of type \"attachment\", set to the new\r\nfunction `org-attach-preview-file'.\r\n---\r\n lisp\/ol.el                    | 594 +++++++++++++++++++++++++++++++++-\r\n lisp\/org-attach.el            |  11 +-\r\n lisp\/org-compat.el            | 189 +++++++++++\r\n lisp\/org-cycle.el             |  10 +-\r\n lisp\/org-keys.el              |   4 +-\r\n lisp\/org-plot.el              |   2 +-\r\n lisp\/org.el                   | 534 +-----------------------------\r\n testing\/lisp\/test-org-fold.el |   4 +-\r\n 8 files changed, 803 insertions(+), 545 deletions(-)\r\n\r\ndiff --git a\/lisp\/ol.el b\/lisp\/ol.el\r\nindex 52ea62d69..b0d7294fe 100644\r\n--- a\/lisp\/ol.el\r\n+++ b\/lisp\/ol.el\r\n@@ -82,6 +82,11 @@ (declare-function org-src-source-buffer \"org-src\" ())\r\n (declare-function org-src-source-type \"org-src\" ())\r\n (declare-function org-time-stamp-format \"org\" (&optional long inactive))\r\n (declare-function outline-next-heading \"outline\" ())\r\n+(declare-function image-flush \"image\" (spec &optional frame))\r\n+(declare-function org-entry-end-position \"org\" ())\r\n+(declare-function org-element-contents-begin \"org-element\" (node))\r\n+(declare-function org-element-contents-end \"org-element\" (node))\r\n+(declare-function org-property-or-variable-value \"org\" (var &optional inherit))\r\n \r\n \f\r\n ;;; Customization\r\n@@ -171,6 +176,16 @@ (defcustom org-link-parameters nil\r\n \r\n   The default face is `org-link'.\r\n \r\n+`:preview'\r\n+\r\n+  Function to run to generate an in-buffer preview for the link.  It\r\n+  must accept three arguments:\r\n+  - an overlay placed from the start to the end of the link.\r\n+  - the link path, as a string.\r\n+  - the link element\r\n+\r\n+  This function must return a non-nil value to indicate success.\r\n+\r\n `:help-echo'\r\n \r\n   String or function used as a value for the `help-echo' text\r\n@@ -521,6 +536,80 @@ (defcustom org-link-keep-stored-after-insertion nil\r\n   :type 'boolean\r\n   :safe #'booleanp)\r\n \r\n+(defcustom org-link-preview-delay 0.05\r\n+  \"Idle delay in seconds between link previews when using\r\n+`org-link-preview'.  Links are previewed in batches (see\r\n+`org-link-preview-batch-size') spaced out by this delay.  Set\r\n+this to a small number for more immediate previews, but at the\r\n+expense of higher lag.\"\r\n+  :group 'org-link\r\n+  :type 'number)\r\n+\r\n+(defcustom org-link-preview-batch-size 6\r\n+  \"Number of links that are previewed at once with\r\n+`org-link-preview'.  Links are previewed in batches spaced out in\r\n+time (see `org-link-preview-delay').  Set this to a large integer\r\n+for more immediate previews, but at the expense of higher lag.\"\r\n+  :group 'org-link\r\n+  :type 'natnum)\r\n+\r\n+(defcustom org-display-remote-inline-images 'skip\r\n+  \"How to display remote inline images.\r\n+Possible values of this option are:\r\n+\r\n+skip        Don't display remote images.\r\n+download    Always download and display remote images.\r\n+t\r\n+cache       Display remote images, and open them in separate buffers\r\n+            for caching.  Silently update the image buffer when a file\r\n+            change is detected.\"\r\n+  :group 'org-appearance\r\n+  :package-version '(Org . \"9.7\")\r\n+  :type '(choice\r\n+\t  (const :tag \"Ignore remote images\" skip)\r\n+\t  (const :tag \"Always display remote images\" download)\r\n+\t  (const :tag \"Display and silently update remote images\" cache))\r\n+  :safe #'symbolp)\r\n+\r\n+(defcustom org-image-max-width 'fill-column\r\n+  \"When non-nil, limit the displayed image width.\r\n+This setting only takes effect when `org-image-actual-width' is set to\r\n+t or when #+ATTR* is set to t.\r\n+\r\n+Possible values:\r\n+- `fill-column' :: limit width to `fill-column'\r\n+- `window'      :: limit width to window width\r\n+- integer       :: limit width to number in pixels\r\n+- float         :: limit width to that fraction of window width\r\n+- nil             :: do not limit image width\"\r\n+  :group 'org-appearance\r\n+  :package-version '(Org . \"9.7\")\r\n+  :type '(choice\r\n+          (const :tag \"Do not limit image width\" nil)\r\n+          (const :tag \"Limit to `fill-column'\" fill-column)\r\n+          (const :tag \"Limit to window width\" window)\r\n+          (integer :tag \"Limit to a number of pixels\")\r\n+          (float :tag \"Limit to a fraction of window width\")))\r\n+\r\n+(defcustom org-image-align 'left\r\n+  \"How to align images previewed using `org-link-preview-region'.\r\n+\r\n+Only stand-alone image links are affected by this setting.  These\r\n+are links without surrounding text.\r\n+\r\n+Possible values of this option are:\r\n+\r\n+left     Insert image at specified position.\r\n+center   Center image previews.\r\n+right    Right-align image previews.\"\r\n+  :group 'org-appearance\r\n+  :package-version '(Org . \"9.7\")\r\n+  :type '(choice\r\n+          (const :tag \"Left align (or don\\\\='t align) image previews\" left)\r\n+\t  (const :tag \"Center image previews\" center)\r\n+\t  (const :tag \"Right align image previews\" right))\r\n+  :safe #'symbolp)\r\n+\r\n ;;; Public variables\r\n \r\n (defconst org-target-regexp (let ((border \"[^<>\\n\\r \\t]\"))\r\n@@ -649,6 +738,29 @@ (defvar org-link--insert-history nil\r\n (defvar org-link--search-failed nil\r\n   \"Non-nil when last link search failed.\")\r\n \r\n+(defvar-local org-link-preview-overlays nil)\r\n+;; Preserve when switching modes or when restarting Org.\r\n+;; If we clear the overlay list and later enable Or mode, the existing\r\n+;; image overlays will never be cleared by `org-link-preview'\r\n+;; and `org-link-preview-clear'.\r\n+(put 'org-link-preview-overlays 'permanent-local t)\r\n+\r\n+(defvar-local org-link-preview--timer nil\r\n+  \"Timer for previewing Org links in buffer.\r\n+\r\n+This timer creates previews for specs in\r\n+`org-link-preview--queue'.\")\r\n+\r\n+(defvar-local org-link-preview--queue nil\r\n+  \"Queue of pending previews for Org links in buffer.\r\n+\r\n+Each element of this queue is a list of the form\r\n+\r\n+(PREVIEW-FUNC OVERLAY PATH LINK)\r\n+\r\n+where PREVIEW-FUNC places a preview of PATH using OVERLAY.  LINK\r\n+is the Org element being previewed.\")\r\n+\r\n \f\r\n ;;; Internal Functions\r\n \r\n@@ -881,7 +993,228 @@ (defun org-link--file-link-to-here ()\r\n          (setq desc search-desc))))\r\n     (cons link desc)))\r\n \r\n+(defun org-link-preview--get-overlays (&optional beg end)\r\n+  \"Return link preview overlays between BEG and END.\"\r\n+  (let* ((beg (or beg (point-min)))\r\n+         (end (or end (point-max)))\r\n+         (overlays (overlays-in beg end))\r\n+         result)\r\n+    (dolist (ov overlays result)\r\n+      (when (memq ov org-link-preview-overlays)\r\n+        (push ov result)))))\r\n+\r\n+(defun org-link-preview--remove-overlay (ov after _beg _end &optional _len)\r\n+  \"Remove link-preview overlay OV if a corresponding region is modified.\r\n+\r\n+AFTER is true when this function is called post-change.\"\r\n+  (when (and ov after)\r\n+    (setq org-link-preview-overlays (delq ov org-link-preview-overlays))\r\n+    ;; Clear image from cache to avoid image not updating upon\r\n+    ;; changing on disk.  See Emacs bug#59902.\r\n+    (when-let* (((overlay-get ov 'org-image-overlay))\r\n+                (disp (overlay-get ov 'display))\r\n+                ((imagep disp)))\r\n+      (image-flush disp))\r\n+    (delete-overlay ov)))\r\n+\r\n \f\r\n+\r\n+;;;; Utilities for image preview display\r\n+\r\n+;; For without-x builds.\r\n+(declare-function image-flush \"image\" (spec &optional frame))\r\n+\r\n+(defun org--create-inline-image (file width)\r\n+  \"Create image located at FILE, or return nil.\r\n+WIDTH is the width of the image.  The image may not be created\r\n+according to the value of `org-display-remote-inline-images'.\"\r\n+  (let* ((remote? (file-remote-p file))\r\n+\t (file-or-data\r\n+\t  (pcase org-display-remote-inline-images\r\n+\t    ((guard (not remote?)) file)\r\n+\t    (`download (with-temp-buffer\r\n+\t\t\t (set-buffer-multibyte nil)\r\n+\t\t\t (insert-file-contents-literally file)\r\n+\t\t\t (buffer-string)))\r\n+\t    ((or `cache `t)\r\n+             (let ((revert-without-query '(\".\")))\r\n+\t       (with-current-buffer (find-file-noselect file)\r\n+\t\t (buffer-string))))\r\n+\t    (`skip nil)\r\n+\t    (other\r\n+\t     (message \"Invalid value of `org-display-remote-inline-images': %S\"\r\n+\t\t      other)\r\n+\t     nil))))\r\n+    (when file-or-data\r\n+      (create-image file-or-data\r\n+\t\t    (and (image-type-available-p 'imagemagick)\r\n+\t\t\t width\r\n+\t\t\t 'imagemagick)\r\n+\t\t    remote?\r\n+\t\t    :width width\r\n+                    :max-width\r\n+                    (pcase org-image-max-width\r\n+                      (`fill-column (* fill-column (frame-char-width (selected-frame))))\r\n+                      (`window (window-width nil t))\r\n+                      ((pred integerp) org-image-max-width)\r\n+                      ((pred floatp) (floor (* org-image-max-width (window-width nil t))))\r\n+                      (`nil nil)\r\n+                      (_ (error \"Unsupported value of `org-image-max-width': %S\"\r\n+                                org-image-max-width)))\r\n+                    :scale 1))))\r\n+\r\n+(declare-function org-export-read-attribute \"ox\"\r\n+                  (attribute element &optional property))\r\n+(defvar visual-fill-column-width) ; Silence compiler warning\r\n+(defun org-display-inline-image--width (link)\r\n+  \"Determine the display width of the image LINK, in pixels.\r\n+- When `org-image-actual-width' is t, the image's pixel width is used.\r\n+- When `org-image-actual-width' is a number, that value will is used.\r\n+- When `org-image-actual-width' is nil or a list, :width attribute of\r\n+  #+attr_org or the first #+attr_...  (if it exists) is used to set the\r\n+  image width.  A width of X% is divided by 100.  If the value is a\r\n+  float between 0 and 2, it interpreted as that proportion of the text\r\n+  width in the buffer.\r\n+\r\n+  If no :width attribute is given and `org-image-actual-width' is a\r\n+  list with a number as the car, then that number is used as the\r\n+  default value.\"\r\n+  ;; Apply `org-image-actual-width' specifications.\r\n+  ;; Support subtree-level property \"ORG-IMAGE-ACTUAL-WIDTH\" specified\r\n+  ;; width.\r\n+  (let ((org-image-actual-width (org-property-or-variable-value 'org-image-actual-width)))\r\n+    (cond\r\n+     ((eq org-image-actual-width t) nil)\r\n+     ((listp org-image-actual-width)\r\n+      (require 'ox)\r\n+      (let* ((par (org-element-lineage link 'paragraph))\r\n+             ;; Try to find an attribute providing a :width.\r\n+             ;; #+ATTR_ORG: :width ...\r\n+             (attr-width (org-export-read-attribute :attr_org par :width))\r\n+             (width-unreadable?\r\n+              (lambda (value)\r\n+                (or (not (stringp value))\r\n+                    (unless (string= value \"t\")\r\n+                      (or (not (string-match\r\n+                              (rx bos (opt \"+\")\r\n+                                  (or\r\n+                                   ;; Number of pixels\r\n+                                   ;; must be a lone number, not\r\n+                                   ;; things like 4in\r\n+                                   (seq (1+ (in \"0-9\")) eos)\r\n+                                   ;; Numbers ending with %\r\n+                                   (seq (1+ (in \"0-9.\")) (group-n 1 \"%\"))\r\n+                                   ;; Fractions\r\n+                                   (seq (0+ (in \"0-9\")) \".\" (1+ (in \"0-9\")))))\r\n+                              value))\r\n+                          (let ((number (string-to-number value)))\r\n+                            (and (floatp number)\r\n+                                 (not (match-string 1 value)) ; X%\r\n+                                 (not (<= 0.0 number 2.0)))))))))\r\n+             ;; #+ATTR_BACKEND: :width ...\r\n+             (attr-other\r\n+              (catch :found\r\n+                (org-element-properties-map\r\n+                 (lambda (prop _)\r\n+                   (when (and\r\n+                          (not (eq prop :attr_org))\r\n+                          (string-match-p \"^:attr_\" (symbol-name prop))\r\n+                          (not (funcall width-unreadable? (org-export-read-attribute prop par :width))))\r\n+                     (throw :found prop)))\r\n+                 par)))\r\n+             (attr-width\r\n+              (if (not (funcall width-unreadable? attr-width))\r\n+                  attr-width\r\n+                ;; When #+attr_org: does not have readable :width\r\n+                (and attr-other\r\n+                     (org-export-read-attribute attr-other par :width))))\r\n+             (width\r\n+              (cond\r\n+               ;; Treat :width t as if `org-image-actual-width' were t.\r\n+               ((string= attr-width \"t\") nil)\r\n+               ;; Fallback to `org-image-actual-width' if no interprable width is given.\r\n+               ((funcall width-unreadable? attr-width)\r\n+                (car org-image-actual-width))\r\n+               ;; Convert numeric widths to numbers, converting percentages.\r\n+               ((string-match-p \"\\\\`[[+]?[0-9.]+%\" attr-width)\r\n+                (\/ (string-to-number attr-width) 100.0))\r\n+               (t (string-to-number attr-width)))))\r\n+        (if (and (floatp width) (<= 0.0 width 2.0))\r\n+            ;; A float in [0,2] should be interpereted as this portion of\r\n+            ;; the text width in the window.  This works well with cases like\r\n+            ;; #+attr_latex: :width 0.X\\{line,page,column,etc.}width,\r\n+            ;; as the \"0.X\" is pulled out as a float.  We use 2 as the upper\r\n+            ;; bound as cases such as 1.2\\linewidth are feasible.\r\n+            (round (* width\r\n+                      (window-pixel-width)\r\n+                      (\/ (or (and (bound-and-true-p visual-fill-column-mode)\r\n+                                  (or visual-fill-column-width auto-fill-function))\r\n+                             (when auto-fill-function fill-column)\r\n+                             (- (window-text-width) (line-number-display-width)))\r\n+                         (float (window-total-width)))))\r\n+          width)))\r\n+     ((numberp org-image-actual-width)\r\n+      org-image-actual-width)\r\n+     (t nil))))\r\n+\r\n+(defun org-image--align (link)\r\n+  \"Determine the alignment of the image LINK.\r\n+LINK is a link object.\r\n+\r\n+In decreasing order of priority, this is controlled:\r\n+- Per image by the value of `:center' or `:align' in the\r\n+affiliated keyword `#+attr_org'.\r\n+- By the `#+attr_html' or `#+attr_latex` keywords with valid\r\n+  `:center' or `:align' values.\r\n+- Globally by the user option `org-image-align'.\r\n+\r\n+The result is either nil or one of the strings \\\"left\\\",\r\n+\\\"center\\\" or \\\"right\\\".\r\n+\r\n+\\\"center\\\" will cause the image preview to be centered, \\\"right\\\"\r\n+will cause it to be right-aligned.  A value of \\\"left\\\" or nil\r\n+implies no special alignment.\"\r\n+  (let ((par (org-element-lineage link 'paragraph)))\r\n+    ;; Only align when image is not surrounded by paragraph text:\r\n+    (when (and par ; when image is not in paragraph, but in table\/headline\/etc, do not align\r\n+               (= (org-element-begin link)\r\n+                  (save-excursion\r\n+                    (goto-char (org-element-contents-begin par))\r\n+                    (skip-chars-forward \"\\t \")\r\n+                    (point)))           ;account for leading space\r\n+                                        ;before link\r\n+               (<= (- (org-element-contents-end par)\r\n+                     (org-element-end link))\r\n+                  1))                  ;account for trailing newline\r\n+                                        ;at end of paragraph\r\n+      (save-match-data\r\n+        ;; Look for a valid \":center t\" or \":align left|center|right\"\r\n+        ;; attribute.\r\n+        ;;\r\n+        ;; An attr_org keyword has the highest priority, with\r\n+        ;; any attr.* next.  Choosing between these is\r\n+        ;; unspecified.\r\n+        (let ((center-re \":\\\\(center\\\\)[[:space:]]+t\\\\b\")\r\n+              (align-re \":align[[:space:]]+\\\\(left\\\\|center\\\\|right\\\\)\\\\b\")\r\n+              attr-align)\r\n+          (catch 'exit\r\n+            (org-element-properties-mapc\r\n+             (lambda (propname propval)\r\n+               (when (and propval\r\n+                          (string-match-p \":attr.*\" (symbol-name propname)))\r\n+                 (setq propval (car-safe propval))\r\n+                 (when (or (string-match center-re propval)\r\n+                           (string-match align-re propval))\r\n+                   (setq attr-align (match-string 1 propval))\r\n+                   (when (eq propname :attr_org)\r\n+                     (throw 'exit t)))))\r\n+             par))\r\n+          (if attr-align\r\n+              (when (member attr-align '(\"center\" \"right\")) attr-align)\r\n+            ;; No image-specific keyword, check global alignment property\r\n+            (when (memq org-image-align '(center right))\r\n+              (symbol-name org-image-align))))))))\r\n+\r\n ;;; Public API\r\n \r\n (defun org-link-types ()\r\n@@ -1573,6 +1906,224 @@ (defun org-link-add-angle-brackets (s)\r\n   (unless (equal (substring s -1) \">\") (setq s (concat s \">\")))\r\n   s)\r\n \r\n+;;;###autoload\r\n+(defun org-link-preview (&optional arg beg end)\r\n+  \"Toggle display of link previews in the buffer.\r\n+\r\n+When region BEG..END is active, preview links in the\r\n+region.\r\n+\r\n+When point is at a link, display a preview for that link only.\r\n+Otherwise, display previews for links in current entry.\r\n+\r\n+With numeric prefix ARG 1, preview links with description as\r\n+well.\r\n+\r\n+With prefix ARG `\\\\[universal-argument]', clear link previews at\r\n+point or in the current entry.\r\n+\r\n+With prefix ARG `\\\\[universal-argument] \\\\[universal-argument]',\r\n+ display link previews in the accessible portion of the\r\n+ buffer.  With numeric prefix ARG 11, do the same, but include\r\n+ links with descriptions.\r\n+\r\n+With prefix ARG `\\\\[universal-argument] \\\\[universal-argument] \\\\[universal-argument]',\r\n+hide all link previews in the accessible portion of the buffer.\r\n+\r\n+This command is designed for interactive use.  From Elisp, you can\r\n+also use `org-link-preview-region'.\"\r\n+  (interactive (cons current-prefix-arg\r\n+                     (when (use-region-p)\r\n+                       (list (region-beginning) (region-end)))))\r\n+  (let* ((include-linked\r\n+          (cond\r\n+           ((member arg '(nil (4) (16)) ) nil)\r\n+           ((member arg '(1 11)) 'include-linked)\r\n+           (t 'include-linked)))\r\n+         (interactive? (called-interactively-p 'any))\r\n+         (toggle-previews\r\n+          (lambda (&optional beg end scope remove)\r\n+            (let* ((beg (or beg (point-min)))\r\n+                   (end (or end (point-max)))\r\n+                   (old (org-link-preview--get-overlays beg end))\r\n+                   (scope (or scope (format \"%d:%d\" beg end))))\r\n+              (if remove\r\n+                  (progn\r\n+                    (org-link-preview-clear beg end)\r\n+                    (when interactive?\r\n+                      (message\r\n+                       \"[%s] Inline link previews turned off (removed %d images)\"\r\n+                       scope (length old))))\r\n+\t        (org-link-preview-region include-linked t beg end)\r\n+                (when interactive?\r\n+                  (let ((new (org-link-preview--get-overlays beg end)))\r\n+                    (message\r\n+                     (if new\r\n+\t\t         (format \"[%s] Displaying %d images inline %s\"\r\n+\t\t\t         scope (length new)\r\n+                                 (if include-linked \"(including images with description)\"\r\n+                                   \"\"))\r\n+\t\t       (format \"[%s] No images to display inline\" scope))))))))))\r\n+    (cond\r\n+     ;; Region selected :: display previews in region.\r\n+     ((and beg end)\r\n+      (funcall toggle-previews beg end \"region\"\r\n+               (and (equal arg '(4)) 'remove)))\r\n+     ;; C-u argument: clear image at point or in entry\r\n+     ((equal arg '(4))\r\n+      (if-let ((ov (cdr (get-char-property-and-overlay\r\n+                         (point) 'org-image-overlay))))\r\n+          ;; clear link preview at point\r\n+          (funcall toggle-previews\r\n+                   (overlay-start ov) (overlay-end ov)\r\n+                   \"preview at point\" 'remove)\r\n+        ;; Clear link previews in entry\r\n+        (funcall toggle-previews\r\n+                 (if (org-before-first-heading-p) (point-min)\r\n+                   (save-excursion\r\n+                     (org-with-limited-levels (org-back-to-heading t) (point))))\r\n+                 (org-with-limited-levels (org-entry-end-position))\r\n+                 \"current section\" 'remove)))\r\n+     ;; C-u C-u or C-11 argument :: display images in the whole buffer.\r\n+     ((member arg '(11 (16))) (funcall toggle-previews nil nil \"buffer\"))\r\n+     ;; C-u C-u C-u argument :: unconditionally hide images in the buffer.\r\n+     ((equal arg '(64)) (funcall toggle-previews nil nil \"buffer\" 'remove))\r\n+     ;; Argument nil or 1, no region selected :: display images in\r\n+     ;; current section or image link at point.\r\n+     ((and (member arg '(nil 1)) (null beg) (null end))\r\n+      (let ((context (org-element-context)))\r\n+        ;; toggle display of inline image link at point.\r\n+        (if (org-element-type-p context 'link)\r\n+            (let* ((ov (cdr-safe (get-char-property-and-overlay\r\n+                                  (point) 'org-image-overlay)))\r\n+                   (remove? (and ov (memq ov org-link-preview-overlays)\r\n+                                 'remove)))\r\n+              (funcall toggle-previews\r\n+                       (org-element-begin context)\r\n+                       (org-element-end context)\r\n+                       \"image at point\" remove?))\r\n+          (let ((beg (if (org-before-first-heading-p) (point-min)\r\n+\t               (save-excursion\r\n+\t                 (org-with-limited-levels (org-back-to-heading t) (point)))))\r\n+                (end (org-with-limited-levels (org-entry-end-position))))\r\n+            (funcall toggle-previews beg end \"current section\")))))\r\n+     ;; Any other non-nil argument.\r\n+     ((not (null arg)) (funcall toggle-previews beg end \"region\")))))\r\n+\r\n+(defun org-link-preview-region (&optional include-linked refresh beg end)\r\n+  \"Display link previews.\r\n+\r\n+A previewable link type is one that has a `:preview' link\r\n+parameter, see `org-link-parameters'.\r\n+\r\n+By default, a file link or attachment is previewable if it\r\n+follows either of these conventions:\r\n+\r\n+  1. Its path is a file with an extension matching return value\r\n+     from `image-file-name-regexp' and it has no contents.\r\n+\r\n+  2. Its description consists in a single link of the previous\r\n+     type.  In this case, that link must be a well-formed plain\r\n+     or angle link, i.e., it must have an explicit \\\"file\\\" or\r\n+     \\\"attachment\\\" type.\r\n+\r\n+File links are equipped with the keymap `image-map'.\r\n+\r\n+When optional argument INCLUDE-LINKED is non-nil, links with a\r\n+text description part will also be inlined.  This can be nice for\r\n+a quick look at those images, but it does not reflect what\r\n+exported files will look like.\r\n+\r\n+When optional argument REFRESH is non-nil, refresh existing\r\n+images between BEG and END.  This will create new image displays\r\n+only if necessary.\r\n+\r\n+BEG and END define the considered part.  They default to the\r\n+buffer boundaries with possible narrowing.\"\r\n+  (interactive \"P\")\r\n+  (when refresh (org-link-preview-clear beg end))\r\n+  (org-with-point-at (or beg (point-min))\r\n+    (let ((case-fold-search t)\r\n+          (preview-queue))\r\n+      ;; Collect links to preview\r\n+      (while (re-search-forward org-link-any-re end t)\r\n+        (when-let* ((link (org-element-lineage\r\n+                           (save-match-data (org-element-context))\r\n+                           'link t))\r\n+                    (linktype (org-element-property :type link))\r\n+                    (preview-func (org-link-get-parameter linktype :preview))\r\n+                    (path (and (or include-linked\r\n+                                   (not (org-element-contents-begin link)))\r\n+                               (org-element-property :path link))))\r\n+          ;; Create an overlay to hold the preview\r\n+          (let ((ov (make-overlay\r\n+                     (org-element-begin link)\r\n+                     (progn\r\n+\t\t       (goto-char\r\n+\t\t\t(org-element-end link))\r\n+\t\t       (unless (eolp) (skip-chars-backward \" \\t\"))\r\n+\t\t       (point)))))\r\n+            (overlay-put ov 'org-image-overlay t)\r\n+            (overlay-put ov 'modification-hooks\r\n+                         (list 'org-link-preview--remove-overlay))\r\n+            (push ov org-link-preview-overlays)\r\n+            (push (list preview-func ov path link) preview-queue))))\r\n+      ;; Collect previews in buffer-local preview queue\r\n+      (setq org-link-preview--queue\r\n+            (nconc org-link-preview--queue (nreverse preview-queue)))\r\n+      ;; Run preview possibly asynchronously\r\n+      (when org-link-preview--queue\r\n+        (org-link-preview--process-queue (current-buffer))))))\r\n+\r\n+(defun org-link-preview--process-queue (org-buffer)\r\n+  \"Preview pending Org link previews in ORG-BUFFER.\r\n+\r\n+Previews are generated from the specs in\r\n+`org-link-preview--queue', which see.\"\r\n+  (with-current-buffer org-buffer\r\n+    (cl-loop\r\n+     for spec in org-link-preview--queue\r\n+     for ov = (cadr spec)               ;SPEC is (preview-func ov path link)\r\n+     for count from org-link-preview-batch-size above 0\r\n+     do (pop org-link-preview--queue)\r\n+     if (overlay-buffer ov) do\r\n+     (unless (apply spec)\r\n+       ;; Preview was unsuccessful, delete overlay\r\n+       (delete-overlay ov)\r\n+       (setq org-link-preview-overlays\r\n+             (delq ov org-link-preview-overlays)))\r\n+     else do (cl-incf count) end\r\n+     finally do\r\n+     (setq org-link-preview--timer\r\n+           (and org-link-preview--queue\r\n+                (run-with-idle-timer\r\n+                 (time-add (or (current-idle-time) 0)\r\n+                           org-link-preview-delay)\r\n+                 nil #'org-link-preview--process-queue org-buffer))))))\r\n+\r\n+(defun org-link-preview-clear (&optional beg end)\r\n+  \"Clear link previews in region BEG to END.\"\r\n+  (interactive (and (use-region-p) (list (region-beginning) (region-end))))\r\n+  (let* ((beg (or beg (point-min)))\r\n+         (end (or end (point-max)))\r\n+         (overlays (overlays-in beg end)))\r\n+    (dolist (ov overlays)\r\n+      (when (memq ov org-link-preview-overlays)\r\n+        ;; Remove pending preview tasks between BEG and END\r\n+        (when-let ((spec (cl-find ov org-link-preview--queue\r\n+                                  :key #'cadr)))\r\n+          (setq org-link-preview--queue (delq spec org-link-preview--queue)))\r\n+        ;; Remove placed overlays between BEG and END\r\n+        (when-let ((image (overlay-get ov 'display))\r\n+                   ((imagep image)))\r\n+          (image-flush image))\r\n+        (setq org-link-preview-overlays (delq ov org-link-preview-overlays))\r\n+        (delete-overlay ov)))\r\n+    ;; Clear removed overlays.\r\n+    (dolist (ov org-link-preview-overlays)\r\n+      (unless (overlay-buffer ov)\r\n+        (setq org-link-preview-overlays (delq ov org-link-preview-overlays))))))\r\n+\r\n \f\r\n ;;; Built-in link types\r\n \r\n@@ -1595,7 +2146,48 @@ (defun org-link--open-elisp (path _)\r\n (org-link-set-parameters \"elisp\" :follow #'org-link--open-elisp)\r\n \r\n ;;;; \"file\" link type\r\n-(org-link-set-parameters \"file\" :complete #'org-link-complete-file)\r\n+(org-link-set-parameters \"file\"\r\n+                         :complete #'org-link-complete-file\r\n+                         :preview #'org-link-preview-file)\r\n+\r\n+(defun org-link-preview-file (ov path link)\r\n+  \"Display image file PATH in overlay OV for LINK.\r\n+\r\n+LINK is the Org element being previewed.\r\n+\r\n+Equip each image with the keymap `image-map'.\r\n+\r\n+This is intended to be used as the `:preview' link property of\r\n+file links, see `org-link-parameters'.\"\r\n+  (if (not (display-graphic-p))\r\n+      (prog1 nil\r\n+        (message \"Your Emacs does not support displaying images!\"))\r\n+    (require 'image)\r\n+    (when-let* ((file-full (expand-file-name path))\r\n+                (file (substitute-in-file-name file-full))\r\n+                ((string-match-p (image-file-name-regexp) file))\r\n+                ((file-exists-p file)))\r\n+      (let* ((width (org-display-inline-image--width link))\r\n+\t     (align (org-image--align link))\r\n+             (image (org--create-inline-image file width)))\r\n+        (when image            ; Add image to overlay\r\n+\t  ;; See bug#59902.  We cannot rely\r\n+          ;; on Emacs to update image if the file\r\n+          ;; has changed.\r\n+          (image-flush image)\r\n+\t  (overlay-put ov 'display image)\r\n+\t  (overlay-put ov 'face 'default)\r\n+\t  (overlay-put ov 'keymap image-map)\r\n+          (when align\r\n+            (overlay-put\r\n+             ov 'before-string\r\n+             (propertize\r\n+              \" \" 'face 'default\r\n+              'display\r\n+              (pcase align\r\n+                (\"center\" `(space :align-to (- center (0.5 . ,image))))\r\n+                (\"right\"  `(space :align-to (- right ,image)))))))\r\n+          t)))))\r\n \r\n ;;;; \"help\" link type\r\n (defun org-link--open-help (path _)\r\ndiff --git a\/lisp\/org-attach.el b\/lisp\/org-attach.el\r\nindex 7a03d170e..3c4e1bfb6 100644\r\n--- a\/lisp\/org-attach.el\r\n+++ b\/lisp\/org-attach.el\r\n@@ -797,9 +797,18 @@ (defun org-attach-follow (file arg)\r\n See `org-open-file' for details about ARG.\"\r\n   (org-link-open-as-file (org-attach-expand file) arg))\r\n \r\n+(defun org-attach-preview-file (ov path link)\r\n+  \"Preview attachment with PATH in overlay OV.\r\n+\r\n+LINK is the Org link element being previewed.\"\r\n+  (org-with-point-at (org-element-begin link)\r\n+    (org-link-preview-file\r\n+     ov (org-attach-expand path) link)))\r\n+\r\n (org-link-set-parameters \"attachment\"\r\n \t\t\t :follow #'org-attach-follow\r\n-                         :complete #'org-attach-complete-link)\r\n+                         :complete #'org-attach-complete-link\r\n+                         :preview #'org-attach-preview-file)\r\n \r\n (defun org-attach-complete-link ()\r\n   \"Advise the user with the available files in the attachment directory.\"\r\ndiff --git a\/lisp\/org-compat.el b\/lisp\/org-compat.el\r\nindex d843216f3..242b46a86 100644\r\n--- a\/lisp\/org-compat.el\r\n+++ b\/lisp\/org-compat.el\r\n@@ -783,6 +783,195 @@ (defun org-add-link-type (type &optional follow export)\r\n \r\n (make-obsolete 'org-add-link-type \"use `org-link-set-parameters' instead.\" \"9.0\")\r\n \r\n+(declare-function org-link-preview--remove-overlay \"ol\")\r\n+(declare-function org-link-preview--get-overlays \"ol\")\r\n+(declare-function org-link-preview-clear \"ol\")\r\n+(declare-function org-link-preview--remove-overlay \"ol\")\r\n+\r\n+(define-obsolete-function-alias 'org-display-inline-remove-overlay\r\n+  'org-link-preview--remove-overlay \"9.8\")\r\n+(define-obsolete-function-alias 'org--inline-image-overlays\r\n+  'org-link-preview--get-overlays \"9.8\")\r\n+(define-obsolete-function-alias 'org-remove-inline-images\r\n+  'org-link-preview-clear \"9.8\")\r\n+(define-obsolete-variable-alias 'org-inline-image-overlays\r\n+  'org-link-preview-overlays \"9.8\")\r\n+(defvar org-link-preview-overlays)\r\n+(defvar org-link-abbrev-alist-local)\r\n+(defvar org-link-abbrev-alist)\r\n+(defvar org-link-angle-re)\r\n+(defvar org-link-plain-re)\r\n+(declare-function org-attach-expand \"org-attach\")\r\n+(declare-function org-display-inline-image--width \"org\")\r\n+(declare-function org-image--align \"org\")\r\n+(declare-function org--create-inline-image \"org\")\r\n+\r\n+(make-obsolete 'org-display-inline-images\r\n+               'org-link-preview-region \"9.8\")\r\n+;; FIXME: Unused; obsoleted; to be removed\r\n+(defun org-display-inline-images (&optional include-linked refresh beg end)\r\n+  \"Display inline images.\r\n+\r\n+An inline image is a link which follows either of these\r\n+conventions:\r\n+\r\n+  1. Its path is a file with an extension matching return value\r\n+     from `image-file-name-regexp' and it has no contents.\r\n+\r\n+  2. Its description consists in a single link of the previous\r\n+     type.  In this case, that link must be a well-formed plain\r\n+     or angle link, i.e., it must have an explicit \\\"file\\\" or\r\n+     \\\"attachment\\\" type.\r\n+\r\n+Equip each image with the key-map `image-map'.\r\n+\r\n+When optional argument INCLUDE-LINKED is non-nil, also links with\r\n+a text description part will be inlined.  This can be nice for\r\n+a quick look at those images, but it does not reflect what\r\n+exported files will look like.\r\n+\r\n+When optional argument REFRESH is non-nil, refresh existing\r\n+images between BEG and END.  This will create new image displays\r\n+only if necessary.\r\n+\r\n+BEG and END define the considered part.  They default to the\r\n+buffer boundaries with possible narrowing.\"\r\n+  (interactive \"P\")\r\n+  (when (display-graphic-p)\r\n+    (when refresh\r\n+      (org-link-preview-clear beg end)\r\n+      (when (fboundp 'clear-image-cache) (clear-image-cache)))\r\n+    (let ((end (or end (point-max))))\r\n+      (org-with-point-at (or beg (point-min))\r\n+\t(let* ((case-fold-search t)\r\n+\t       (file-extension-re (image-file-name-regexp))\r\n+\t       (link-abbrevs (mapcar #'car\r\n+\t\t\t\t     (append org-link-abbrev-alist-local\r\n+\t\t\t\t\t     org-link-abbrev-alist)))\r\n+\t       ;; Check absolute, relative file names and explicit\r\n+\t       ;; \"file:\" links.  Also check link abbreviations since\r\n+\t       ;; some might expand to \"file\" links.\r\n+\t       (file-types-re\r\n+\t\t(format \"\\\\[\\\\[\\\\(?:file%s:\\\\|attachment:\\\\|[.\/~]\\\\)\\\\|\\\\]\\\\[\\\\(<?\\\\(?:file\\\\|attachment\\\\):\\\\)\"\r\n+\t\t\t(if (not link-abbrevs) \"\"\r\n+\t\t\t  (concat \"\\\\|\" (regexp-opt link-abbrevs))))))\r\n+\t  (while (re-search-forward file-types-re end t)\r\n+\t    (let* ((link (org-element-lineage\r\n+\t\t\t  (save-match-data (org-element-context))\r\n+\t\t\t  'link t))\r\n+                   (linktype (org-element-property :type link))\r\n+\t\t   (inner-start (match-beginning 1))\r\n+\t\t   (path\r\n+\t\t    (cond\r\n+\t\t     ;; No link at point; no inline image.\r\n+\t\t     ((not link) nil)\r\n+\t\t     ;; File link without a description.  Also handle\r\n+\t\t     ;; INCLUDE-LINKED here since it should have\r\n+\t\t     ;; precedence over the next case.  I.e., if link\r\n+\t\t     ;; contains filenames in both the path and the\r\n+\t\t     ;; description, prioritize the path only when\r\n+\t\t     ;; INCLUDE-LINKED is non-nil.\r\n+\t\t     ((or (not (org-element-contents-begin link))\r\n+\t\t\t  include-linked)\r\n+\t\t      (and (or (equal \"file\" linktype)\r\n+                               (equal \"attachment\" linktype))\r\n+\t\t\t   (org-element-property :path link)))\r\n+\t\t     ;; Link with a description.  Check if description\r\n+\t\t     ;; is a filename.  Even if Org doesn't have syntax\r\n+\t\t     ;; for those -- clickable image -- constructs, fake\r\n+\t\t     ;; them, as in `org-export-insert-image-links'.\r\n+\t\t     ((not inner-start) nil)\r\n+\t\t     (t\r\n+\t\t      (org-with-point-at inner-start\r\n+\t\t\t(and (looking-at\r\n+\t\t\t      (if (char-equal ?< (char-after inner-start))\r\n+\t\t\t\t  org-link-angle-re\r\n+\t\t\t\torg-link-plain-re))\r\n+\t\t\t     ;; File name must fill the whole\r\n+\t\t\t     ;; description.\r\n+\t\t\t     (= (org-element-contents-end link)\r\n+\t\t\t\t(match-end 0))\r\n+\t\t\t     (progn\r\n+                               (setq linktype (match-string 1))\r\n+                               (match-string 2))))))))\r\n+\t      (when (and path (string-match-p file-extension-re path))\r\n+\t\t(let ((file (if (equal \"attachment\" linktype)\r\n+\t\t\t\t(progn\r\n+                                  (require 'org-attach)\r\n+\t\t\t\t  (ignore-errors (org-attach-expand path)))\r\n+                              (expand-file-name path))))\r\n+                  ;; Expand environment variables.\r\n+                  (when file (setq file (substitute-in-file-name file)))\r\n+\t\t  (when (and file (file-exists-p file))\r\n+\t\t    (let ((width (org-display-inline-image--width link))\r\n+\t\t\t  (align (org-image--align link))\r\n+                          (old (get-char-property-and-overlay\r\n+\t\t\t\t(org-element-begin link)\r\n+\t\t\t\t'org-image-overlay)))\r\n+\t\t      (if (and (car-safe old) refresh)\r\n+                          (image-flush (overlay-get (cdr old) 'display))\r\n+\t\t\t(let ((image (org--create-inline-image file width)))\r\n+\t\t\t  (when image\r\n+\t\t\t    (let ((ov (make-overlay\r\n+\t\t\t\t       (org-element-begin link)\r\n+\t\t\t\t       (progn\r\n+\t\t\t\t\t (goto-char\r\n+\t\t\t\t\t  (org-element-end link))\r\n+\t\t\t\t\t (unless (eolp) (skip-chars-backward \" \\t\"))\r\n+\t\t\t\t\t (point)))))\r\n+                              ;; See bug#59902.  We cannot rely\r\n+                              ;; on Emacs to update image if the file\r\n+                              ;; has changed.\r\n+                              (image-flush image)\r\n+\t\t\t      (overlay-put ov 'display image)\r\n+\t\t\t      (overlay-put ov 'face 'default)\r\n+\t\t\t      (overlay-put ov 'org-image-overlay t)\r\n+\t\t\t      (overlay-put\r\n+\t\t\t       ov 'modification-hooks\r\n+\t\t\t       (list 'org-link-preview--remove-overlay))\r\n+\t\t\t      (when (boundp 'image-map)\r\n+\t\t\t\t(overlay-put ov 'keymap image-map))\r\n+                              (when align\r\n+                                (overlay-put\r\n+                                 ov 'before-string\r\n+                                 (propertize\r\n+                                  \" \" 'face 'default\r\n+                                  'display\r\n+                                  (pcase align\r\n+                                    (\"center\" `(space :align-to (- center (0.5 . ,image))))\r\n+                                    (\"right\"  `(space :align-to (- right ,image)))))))\r\n+\t\t\t      (push ov org-inline-image-overlays))))))))))))))))\r\n+\r\n+(make-obsolete 'org-toggle-inline-images\r\n+               'org-link-preview \"9.8\")\r\n+;; FIXME: Unused; obsoleted; to be removed\r\n+(defun org-toggle-inline-images (&optional include-linked beg end)\r\n+  \"Toggle the display of inline images.\r\n+INCLUDE-LINKED is passed to `org-display-inline-images'.\"\r\n+  (interactive \"P\")\r\n+  (if (org-link-preview--get-overlays beg end)\r\n+      (progn\r\n+        (org-link-preview-clear beg end)\r\n+        (when (called-interactively-p 'interactive)\r\n+\t  (message \"Inline image display turned off\")))\r\n+    (org-display-inline-images include-linked nil beg end)\r\n+    (when (called-interactively-p 'interactive)\r\n+      (let ((new (org-link-preview--get-overlays beg end)))\r\n+        (message (if new\r\n+\t\t     (format \"%d images displayed inline\"\r\n+\t\t\t     (length new))\r\n+\t\t   \"No images to display inline\"))))))\r\n+\r\n+(make-obsolete 'org-redisplay-inline-images\r\n+               'org-link-preview \"9.8\")\r\n+;; FIXME: Unused; obsoleted; to be removed\r\n+(defun org-redisplay-inline-images ()\r\n+  \"Assure display of inline images and refresh them.\"\r\n+  (interactive)\r\n+  (org-toggle-inline-images)\r\n+  (unless org-link-preview-overlays\r\n+    (org-toggle-inline-images)))\r\n+\r\n ;;;; Functions unused in Org core.\r\n (defun org-table-recognize-table.el ()\r\n   \"If there is a table.el table nearby, recognize it and move into it.\"\r\ndiff --git a\/lisp\/org-cycle.el b\/lisp\/org-cycle.el\r\nindex 8a39bdb8c..1a1c916bd 100644\r\n--- a\/lisp\/org-cycle.el\r\n+++ b\/lisp\/org-cycle.el\r\n@@ -40,14 +40,14 @@ (declare-function org-element-property \"org-element-ast\" (property node))\r\n (declare-function org-element-post-affiliated \"org-element\" (node))\r\n (declare-function org-element-lineage \"org-element-ast\" (datum &optional types with-self))\r\n (declare-function org-element-at-point \"org-element\" (&optional pom cached-only))\r\n-(declare-function org-display-inline-images \"org\" (&optional include-linked refresh beg end))\r\n+(declare-function org-link-preview-region \"ol\" (&optional include-linked refresh beg end))\r\n (declare-function org-get-tags \"org\" (&optional pos local fontify))\r\n (declare-function org-subtree-end-visible-p \"org\" ())\r\n (declare-function org-narrow-to-subtree \"org\" (&optional element))\r\n (declare-function org-next-visible-heading \"org\" (arg))\r\n (declare-function org-at-property-p \"org\" ())\r\n (declare-function org-re-property \"org\" (property &optional literal allow-null value))\r\n-(declare-function org-remove-inline-images \"org\" (&optional beg end))\r\n+(declare-function org-link-preview-clear \"ol\" (&optional beg end))\r\n (declare-function org-item-beginning-re \"org\" ())\r\n (declare-function org-at-heading-p \"org\" (&optional invisible-not-ok))\r\n (declare-function org-at-item-p \"org\" ())\r\n@@ -817,19 +817,19 @@ (defun org-cycle-display-inline-images (state)\r\n         ;; If has nested headlines, beg,end only from parent headline\r\n         ;; to first child headline which reference to upper\r\n         ;; let-binding `org-next-visible-heading'.\r\n-        (org-display-inline-images\r\n+        (org-link-preview-region\r\n          nil nil\r\n          (point-min) (progn (org-next-visible-heading 1) (point)))))\r\n       ('subtree\r\n        (org-with-wide-buffer\r\n         (org-narrow-to-subtree)\r\n         ;; If has nested headlines, also inline display images under all sub-headlines.\r\n-        (org-display-inline-images nil nil (point-min) (point-max))))\r\n+        (org-link-preview-region nil nil (point-min) (point-max))))\r\n       ('folded\r\n        (org-with-wide-buffer\r\n         (org-narrow-to-subtree)\r\n         (if (numberp (point-max))\r\n-            (org-remove-inline-images (point-min) (point-max))\r\n+            (org-link-preview-clear (point-min) (point-max))\r\n           (ignore)))))))\r\n \r\n (provide 'org-cycle)\r\ndiff --git a\/lisp\/org-keys.el b\/lisp\/org-keys.el\r\nindex 1daedaae8..77cbe5c0f 100644\r\n--- a\/lisp\/org-keys.el\r\n+++ b\/lisp\/org-keys.el\r\n@@ -218,7 +218,7 @@ (declare-function org-toggle-checkbox \"org\" (&optional toggle-presence))\r\n (declare-function org-toggle-radio-button \"org\" (&optional arg))\r\n (declare-function org-toggle-comment \"org\" ())\r\n (declare-function org-toggle-fixed-width \"org\" ())\r\n-(declare-function org-toggle-inline-images-command \"org\" (&optional arg beg end))\r\n+(declare-function org-link-preview \"ol\" (&optional arg beg end))\r\n (declare-function org-latex-preview \"org\" (&optional arg))\r\n (declare-function org-toggle-narrow-to-subtree \"org\" ())\r\n (declare-function org-toggle-ordered-property \"org\" ())\r\n@@ -618,7 +618,7 @@ (org-defkey org-mode-map (kbd \"C-c C-x C-d\") #'org-clock-display)\r\n (org-defkey org-mode-map (kbd \"C-c C-x x\") #'org-dynamic-block-insert-dblock)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-u\") #'org-dblock-update)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-l\") #'org-latex-preview)\r\n-(org-defkey org-mode-map (kbd \"C-c C-x C-v\") #'org-toggle-inline-images-command)\r\n+(org-defkey org-mode-map (kbd \"C-c C-x C-v\") #'org-link-preview)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-M-v\") #'org-redisplay-inline-images)\r\n (org-defkey org-mode-map (kbd \"C-c C-x \\\\\") #'org-toggle-pretty-entities)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-b\") #'org-toggle-checkbox)\r\ndiff --git a\/lisp\/org-plot.el b\/lisp\/org-plot.el\r\nindex b045344f0..836cfaffc 100644\r\n--- a\/lisp\/org-plot.el\r\n+++ b\/lisp\/org-plot.el\r\n@@ -633,7 +633,7 @@ (defun org-plot\/gnuplot-script (table data-file num-cols params &optional prefac\r\n \r\n (defun org-plot\/redisplay-img-in-buffer (img-file)\r\n   \"Find any overlays for IMG-FILE in the current Org buffer, and refresh them.\"\r\n-  (dolist (img-overlay org-inline-image-overlays)\r\n+  (dolist (img-overlay org-link-preview-overlays)\r\n     (when (string= img-file (plist-get (cdr (overlay-get img-overlay 'display)) :file))\r\n       (when (and (file-exists-p img-file)\r\n                  (fboundp 'image-flush))\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex d5c1dcb35..e5cc9308f 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -5079,7 +5079,7 @@ (define-derived-mode org-mode outline-mode \"Org\"\r\n     ;; modifications to make cache updates work reliably.\r\n     (org-unmodified\r\n      (when org-startup-with-beamer-mode (org-beamer-mode))\r\n-     (when org-startup-with-inline-images (org-display-inline-images))\r\n+     (when org-startup-with-inline-images (org-link-preview '(16)))\r\n      (when org-startup-with-latex-preview (org-latex-preview '(16)))\r\n      (unless org-inhibit-startup-visibility-stuff (org-cycle-set-startup-visibility))\r\n      (when org-startup-truncated (setq truncate-lines t))\r\n@@ -15583,26 +15583,6 @@ (defcustom org-image-actual-width t\r\n \t  (list :tag \"Use #+ATTR* or a number of pixels\" (integer))\r\n \t  (const :tag \"Use #+ATTR* or don't resize\" nil)))\r\n \r\n-(defcustom org-image-max-width 'fill-column\r\n-  \"When non-nil, limit the displayed image width.\r\n-This setting only takes effect when `org-image-actual-width' is set to\r\n-t or when #+ATTR* is set to t.\r\n-\r\n-Possible values:\r\n-- `fill-column' :: limit width to `fill-column'\r\n-- `window'      :: limit width to window width\r\n-- integer       :: limit width to number in pixels\r\n-- float         :: limit width to that fraction of window width\r\n-- nil             :: do not limit image width\"\r\n-  :group 'org-appearance\r\n-  :package-version '(Org . \"9.7\")\r\n-  :type '(choice\r\n-          (const :tag \"Do not limit image width\" nil)\r\n-          (const :tag \"Limit to `fill-column'\" fill-column)\r\n-          (const :tag \"Limit to window width\" window)\r\n-          (integer :tag \"Limit to a number of pixels\")\r\n-          (float :tag \"Limit to a fraction of window width\")))\r\n-\r\n (defcustom org-agenda-inhibit-startup nil\r\n   \"Inhibit startup when preparing agenda buffers.\r\n When this variable is t, the initialization of the Org agenda\r\n@@ -16649,518 +16629,6 @@ (defun org-normalize-color (value)\r\n   (format \"%g\" (\/ value 65535.0)))\r\n \r\n \f\r\n-;; Image display\r\n-\r\n-(defvar-local org-inline-image-overlays nil)\r\n-;; Preserve when switching modes or when restarting Org.\r\n-;; If we clear the overlay list and later enable Or mode, the existing\r\n-;; image overlays will never be cleared by `org-toggle-inline-images'\r\n-;; and `org-toggle-inline-images-command'.\r\n-(put 'org-inline-image-overlays 'permanent-local t)\r\n-\r\n-(defun org--inline-image-overlays (&optional beg end)\r\n-  \"Return image overlays between BEG and END.\"\r\n-  (let* ((beg (or beg (point-min)))\r\n-         (end (or end (point-max)))\r\n-         (overlays (overlays-in beg end))\r\n-         result)\r\n-    (dolist (ov overlays result)\r\n-      (when (memq ov org-inline-image-overlays)\r\n-        (push ov result)))))\r\n-\r\n-(defun org-toggle-inline-images-command (&optional arg beg end)\r\n-  \"Toggle display of inline images without description at point.\r\n-\r\n-When point is at an image link, toggle displaying that image.\r\n-Otherwise, toggle displaying images in current entry.\r\n-\r\n-When region BEG..END is active, toggle displaying images in the\r\n-region.\r\n-\r\n-With numeric prefix ARG 1, display images with description as well.\r\n-\r\n-With prefix ARG `\\\\[universal-argument]', toggle displaying images in\r\n-the accessible portion of the buffer.  With numeric prefix ARG 11, do\r\n-the same, but include images with description.\r\n-\r\n-With prefix ARG `\\\\[universal-argument] \\\\[universal-argument]', hide\r\n-all the images in accessible portion of the buffer.\r\n-\r\n-This command is designed for interactive use.  From Elisp, you can\r\n-also use `org-toggle-inline-images'.\"\r\n-  (interactive (cons current-prefix-arg\r\n-                     (when (use-region-p)\r\n-                       (list (region-beginning) (region-end)))))\r\n-  (let* ((include-linked\r\n-          (cond\r\n-           ((member arg '(nil (4) (16)) ) nil)\r\n-           ((member arg '(1 11)) 'include-linked)\r\n-           (t 'include-linked)))\r\n-         (interactive? (called-interactively-p 'any))\r\n-         (toggle-images\r\n-          (lambda (&optional beg end scope force-remove)\r\n-            (let* ((beg (or beg (point-min)))\r\n-                   (end (or end (point-max)))\r\n-                   (old (org--inline-image-overlays beg end))\r\n-                   (scope (or scope (format \"%d:%d\" beg end))))\r\n-              (if (or old force-remove)\r\n-                  (progn\r\n-                    (org-remove-inline-images beg end)\r\n-                    (when interactive?\r\n-                      (message\r\n-                       \"[%s] Inline image display turned off (removed %d images)\"\r\n-                       scope (length old))))\r\n-\t        (org-display-inline-images include-linked t beg end)\r\n-                (when interactive?\r\n-                  (let ((new (org--inline-image-overlays beg end)))\r\n-                    (message\r\n-                     (if new\r\n-\t\t         (format \"[%s] %d images displayed inline %s\"\r\n-\t\t\t         scope (length new)\r\n-                                 (if include-linked \"(including images with description)\"\r\n-                                   \"\"))\r\n-\t\t       (format \"[%s] No images to display inline\" scope))))))))))\r\n-    (cond\r\n-     ((not (display-graphic-p))\r\n-      (message \"Your Emacs does not support displaying images!\"))\r\n-     ;; Region selected :: toggle images in region.\r\n-     ((and beg end) (funcall toggle-images beg end \"region\"))\r\n-     ;; C-u or C-11 argument :: toggle images in the whole buffer.\r\n-     ((member arg '(11 (4))) (funcall toggle-images nil nil \"buffer\"))\r\n-     ;; C-u C-u argument :: unconditionally hide images in the buffer.\r\n-     ((equal arg '(16)) (funcall toggle-images nil nil \"buffer\" 'remove))\r\n-     ;; Argument nil or 1, no region selected :: toggle (display or hide\r\n-     ;; dwim) images in current section or image link at point.\r\n-     ((and (member arg '(nil 1)) (null beg) (null end))\r\n-      (let ((context (org-element-context)))\r\n-        ;; toggle display of inline image link at point.\r\n-        (if (org-element-type-p context 'link)\r\n-            (funcall toggle-images\r\n-                     (org-element-begin context)\r\n-                     (org-element-end context)\r\n-                     \"image at point\")\r\n-          (let ((beg (if (org-before-first-heading-p) (point-min)\r\n-\t               (save-excursion\r\n-\t                 (org-with-limited-levels (org-back-to-heading t) (point)))))\r\n-                (end (org-with-limited-levels (org-entry-end-position))))\r\n-            (funcall toggle-images beg end \"current section\")))))\r\n-     ;; Any other non-nil argument.\r\n-     ((not (null arg)) (funcall toggle-images beg end \"region\")))))\r\n-\r\n-(defun org-toggle-inline-images (&optional include-linked beg end)\r\n-  \"Toggle the display of inline images.\r\n-INCLUDE-LINKED is passed to `org-display-inline-images'.\"\r\n-  (interactive \"P\")\r\n-  (if (org--inline-image-overlays beg end)\r\n-      (progn\r\n-        (org-remove-inline-images beg end)\r\n-        (when (called-interactively-p 'interactive)\r\n-\t  (message \"Inline image display turned off\")))\r\n-    (org-display-inline-images include-linked nil beg end)\r\n-    (when (called-interactively-p 'interactive)\r\n-      (let ((new (org--inline-image-overlays beg end)))\r\n-        (message (if new\r\n-\t\t     (format \"%d images displayed inline\"\r\n-\t\t\t     (length new))\r\n-\t\t   \"No images to display inline\"))))))\r\n-\r\n-(defun org-redisplay-inline-images ()\r\n-  \"Assure display of inline images and refresh them.\"\r\n-  (interactive)\r\n-  (org-toggle-inline-images)\r\n-  (unless org-inline-image-overlays\r\n-    (org-toggle-inline-images)))\r\n-\r\n-;; For without-x builds.\r\n-(declare-function image-flush \"image\" (spec &optional frame))\r\n-\r\n-(defcustom org-display-remote-inline-images 'skip\r\n-  \"How to display remote inline images.\r\n-Possible values of this option are:\r\n-\r\n-skip        Don't display remote images.\r\n-download    Always download and display remote images.\r\n-t\r\n-cache       Display remote images, and open them in separate buffers\r\n-            for caching.  Silently update the image buffer when a file\r\n-            change is detected.\"\r\n-  :group 'org-appearance\r\n-  :package-version '(Org . \"9.7\")\r\n-  :type '(choice\r\n-\t  (const :tag \"Ignore remote images\" skip)\r\n-\t  (const :tag \"Always display remote images\" download)\r\n-\t  (const :tag \"Display and silently update remote images\" cache))\r\n-  :safe #'symbolp)\r\n-\r\n-(defcustom org-image-align 'left\r\n-  \"How to align images previewed using `org-display-inline-images'.\r\n-\r\n-Only stand-alone image links are affected by this setting.  These\r\n-are links without surrounding text.\r\n-\r\n-Possible values of this option are:\r\n-\r\n-left     Insert image at specified position.\r\n-center   Center image previews.\r\n-right    Right-align image previews.\"\r\n-  :group 'org-appearance\r\n-  :package-version '(Org . \"9.7\")\r\n-  :type '(choice\r\n-          (const :tag \"Left align (or don\\\\='t align) image previews\" left)\r\n-\t  (const :tag \"Center image previews\" center)\r\n-\t  (const :tag \"Right align image previews\" right))\r\n-  :safe #'symbolp)\r\n-\r\n-(defun org--create-inline-image (file width)\r\n-  \"Create image located at FILE, or return nil.\r\n-WIDTH is the width of the image.  The image may not be created\r\n-according to the value of `org-display-remote-inline-images'.\"\r\n-  (let* ((remote? (file-remote-p file))\r\n-\t (file-or-data\r\n-\t  (pcase org-display-remote-inline-images\r\n-\t    ((guard (not remote?)) file)\r\n-\t    (`download (with-temp-buffer\r\n-\t\t\t (set-buffer-multibyte nil)\r\n-\t\t\t (insert-file-contents-literally file)\r\n-\t\t\t (buffer-string)))\r\n-\t    ((or `cache `t)\r\n-             (let ((revert-without-query '(\".\")))\r\n-\t       (with-current-buffer (find-file-noselect file)\r\n-\t\t (buffer-string))))\r\n-\t    (`skip nil)\r\n-\t    (other\r\n-\t     (message \"Invalid value of `org-display-remote-inline-images': %S\"\r\n-\t\t      other)\r\n-\t     nil))))\r\n-    (when file-or-data\r\n-      (create-image file-or-data\r\n-\t\t    (and (image-type-available-p 'imagemagick)\r\n-\t\t\t width\r\n-\t\t\t 'imagemagick)\r\n-\t\t    remote?\r\n-\t\t    :width width\r\n-                    :max-width\r\n-                    (pcase org-image-max-width\r\n-                      (`fill-column (* fill-column (frame-char-width (selected-frame))))\r\n-                      (`window (window-width nil t))\r\n-                      ((pred integerp) org-image-max-width)\r\n-                      ((pred floatp) (floor (* org-image-max-width (window-width nil t))))\r\n-                      (`nil nil)\r\n-                      (_ (error \"Unsupported value of `org-image-max-width': %S\"\r\n-                                org-image-max-width)))\r\n-                    :scale 1))))\r\n-\r\n-(defun org-display-inline-images (&optional include-linked refresh beg end)\r\n-  \"Display inline images.\r\n-\r\n-An inline image is a link which follows either of these\r\n-conventions:\r\n-\r\n-  1. Its path is a file with an extension matching return value\r\n-     from `image-file-name-regexp' and it has no contents.\r\n-\r\n-  2. Its description consists in a single link of the previous\r\n-     type.  In this case, that link must be a well-formed plain\r\n-     or angle link, i.e., it must have an explicit \\\"file\\\" or\r\n-     \\\"attachment\\\" type.\r\n-\r\n-Equip each image with the key-map `image-map'.\r\n-\r\n-When optional argument INCLUDE-LINKED is non-nil, also links with\r\n-a text description part will be inlined.  This can be nice for\r\n-a quick look at those images, but it does not reflect what\r\n-exported files will look like.\r\n-\r\n-When optional argument REFRESH is non-nil, refresh existing\r\n-images between BEG and END.  This will create new image displays\r\n-only if necessary.\r\n-\r\n-BEG and END define the considered part.  They default to the\r\n-buffer boundaries with possible narrowing.\"\r\n-  (interactive \"P\")\r\n-  (when (display-graphic-p)\r\n-    (when refresh\r\n-      (org-remove-inline-images beg end)\r\n-      (when (fboundp 'clear-image-cache) (clear-image-cache)))\r\n-    (let ((end (or end (point-max))))\r\n-      (org-with-point-at (or beg (point-min))\r\n-\t(let* ((case-fold-search t)\r\n-\t       (file-extension-re (image-file-name-regexp))\r\n-\t       (link-abbrevs (mapcar #'car\r\n-\t\t\t\t     (append org-link-abbrev-alist-local\r\n-\t\t\t\t\t     org-link-abbrev-alist)))\r\n-\t       ;; Check absolute, relative file names and explicit\r\n-\t       ;; \"file:\" links.  Also check link abbreviations since\r\n-\t       ;; some might expand to \"file\" links.\r\n-\t       (file-types-re\r\n-\t\t(format \"\\\\[\\\\[\\\\(?:file%s:\\\\|attachment:\\\\|[.\/~]\\\\)\\\\|\\\\]\\\\[\\\\(<?\\\\(?:file\\\\|attachment\\\\):\\\\)\"\r\n-\t\t\t(if (not link-abbrevs) \"\"\r\n-\t\t\t  (concat \"\\\\|\" (regexp-opt link-abbrevs))))))\r\n-\t  (while (re-search-forward file-types-re end t)\r\n-\t    (let* ((link (org-element-lineage\r\n-\t\t\t  (save-match-data (org-element-context))\r\n-\t\t\t  'link t))\r\n-                   (linktype (org-element-property :type link))\r\n-\t\t   (inner-start (match-beginning 1))\r\n-\t\t   (path\r\n-\t\t    (cond\r\n-\t\t     ;; No link at point; no inline image.\r\n-\t\t     ((not link) nil)\r\n-\t\t     ;; File link without a description.  Also handle\r\n-\t\t     ;; INCLUDE-LINKED here since it should have\r\n-\t\t     ;; precedence over the next case.  I.e., if link\r\n-\t\t     ;; contains filenames in both the path and the\r\n-\t\t     ;; description, prioritize the path only when\r\n-\t\t     ;; INCLUDE-LINKED is non-nil.\r\n-\t\t     ((or (not (org-element-contents-begin link))\r\n-\t\t\t  include-linked)\r\n-\t\t      (and (or (equal \"file\" linktype)\r\n-                               (equal \"attachment\" linktype))\r\n-\t\t\t   (org-element-property :path link)))\r\n-\t\t     ;; Link with a description.  Check if description\r\n-\t\t     ;; is a filename.  Even if Org doesn't have syntax\r\n-\t\t     ;; for those -- clickable image -- constructs, fake\r\n-\t\t     ;; them, as in `org-export-insert-image-links'.\r\n-\t\t     ((not inner-start) nil)\r\n-\t\t     (t\r\n-\t\t      (org-with-point-at inner-start\r\n-\t\t\t(and (looking-at\r\n-\t\t\t      (if (char-equal ?< (char-after inner-start))\r\n-\t\t\t\t  org-link-angle-re\r\n-\t\t\t\torg-link-plain-re))\r\n-\t\t\t     ;; File name must fill the whole\r\n-\t\t\t     ;; description.\r\n-\t\t\t     (= (org-element-contents-end link)\r\n-\t\t\t\t(match-end 0))\r\n-\t\t\t     (progn\r\n-                               (setq linktype (match-string 1))\r\n-                               (match-string 2))))))))\r\n-\t      (when (and path (string-match-p file-extension-re path))\r\n-\t\t(let ((file (if (equal \"attachment\" linktype)\r\n-\t\t\t\t(progn\r\n-                                  (require 'org-attach)\r\n-\t\t\t\t  (ignore-errors (org-attach-expand path)))\r\n-                              (expand-file-name path))))\r\n-                  ;; Expand environment variables.\r\n-                  (when file (setq file (substitute-in-file-name file)))\r\n-\t\t  (when (and file (file-exists-p file))\r\n-\t\t    (let ((width (org-display-inline-image--width link))\r\n-\t\t\t  (align (org-image--align link))\r\n-                          (old (get-char-property-and-overlay\r\n-\t\t\t\t(org-element-begin link)\r\n-\t\t\t\t'org-image-overlay)))\r\n-\t\t      (if (and (car-safe old) refresh)\r\n-                          (image-flush (overlay-get (cdr old) 'display))\r\n-\t\t\t(let ((image (org--create-inline-image file width)))\r\n-\t\t\t  (when image\r\n-\t\t\t    (let ((ov (make-overlay\r\n-\t\t\t\t       (org-element-begin link)\r\n-\t\t\t\t       (progn\r\n-\t\t\t\t\t (goto-char\r\n-\t\t\t\t\t  (org-element-end link))\r\n-\t\t\t\t\t (unless (eolp) (skip-chars-backward \" \\t\"))\r\n-\t\t\t\t\t (point)))))\r\n-                              ;; See bug#59902.  We cannot rely\r\n-                              ;; on Emacs to update image if the file\r\n-                              ;; has changed.\r\n-                              (image-flush image)\r\n-\t\t\t      (overlay-put ov 'display image)\r\n-\t\t\t      (overlay-put ov 'face 'default)\r\n-\t\t\t      (overlay-put ov 'org-image-overlay t)\r\n-\t\t\t      (overlay-put\r\n-\t\t\t       ov 'modification-hooks\r\n-\t\t\t       (list 'org-display-inline-remove-overlay))\r\n-\t\t\t      (when (boundp 'image-map)\r\n-\t\t\t\t(overlay-put ov 'keymap image-map))\r\n-                              (when align\r\n-                                (overlay-put\r\n-                                 ov 'before-string\r\n-                                 (propertize\r\n-                                  \" \" 'face 'default\r\n-                                  'display\r\n-                                  (pcase align\r\n-                                    (\"center\" `(space :align-to (- center (0.5 . ,image))))\r\n-                                    (\"right\"  `(space :align-to (- right ,image)))))))\r\n-\t\t\t      (push ov org-inline-image-overlays))))))))))))))))\r\n-\r\n-(declare-function org-export-read-attribute \"ox\"\r\n-                  (attribute element &optional property))\r\n-(defvar visual-fill-column-width) ; Silence compiler warning\r\n-(defun org-display-inline-image--width (link)\r\n-  \"Determine the display width of the image LINK, in pixels.\r\n-- When `org-image-actual-width' is t, the image's pixel width is used.\r\n-- When `org-image-actual-width' is a number, that value will is used.\r\n-- When `org-image-actual-width' is nil or a list, :width attribute of\r\n-  #+attr_org or the first #+attr_...  (if it exists) is used to set the\r\n-  image width.  A width of X% is divided by 100.  If the value is a\r\n-  float between 0 and 2, it interpreted as that proportion of the text\r\n-  width in the buffer.\r\n-\r\n-  If no :width attribute is given and `org-image-actual-width' is a\r\n-  list with a number as the car, then that number is used as the\r\n-  default value.\"\r\n-  ;; Apply `org-image-actual-width' specifications.\r\n-  ;; Support subtree-level property \"ORG-IMAGE-ACTUAL-WIDTH\" specified\r\n-  ;; width.\r\n-  (let ((org-image-actual-width (org-property-or-variable-value 'org-image-actual-width)))\r\n-    (cond\r\n-     ((eq org-image-actual-width t) nil)\r\n-     ((listp org-image-actual-width)\r\n-      (require 'ox)\r\n-      (let* ((par (org-element-lineage link 'paragraph))\r\n-             ;; Try to find an attribute providing a :width.\r\n-             ;; #+ATTR_ORG: :width ...\r\n-             (attr-width (org-export-read-attribute :attr_org par :width))\r\n-             (width-unreadable?\r\n-              (lambda (value)\r\n-                (or (not (stringp value))\r\n-                    (unless (string= value \"t\")\r\n-                      (or (not (string-match\r\n-                              (rx bos (opt \"+\")\r\n-                                  (or\r\n-                                   ;; Number of pixels\r\n-                                   ;; must be a lone number, not\r\n-                                   ;; things like 4in\r\n-                                   (seq (1+ (in \"0-9\")) eos)\r\n-                                   ;; Numbers ending with %\r\n-                                   (seq (1+ (in \"0-9.\")) (group-n 1 \"%\"))\r\n-                                   ;; Fractions\r\n-                                   (seq (0+ (in \"0-9\")) \".\" (1+ (in \"0-9\")))))\r\n-                              value))\r\n-                          (let ((number (string-to-number value)))\r\n-                            (and (floatp number)\r\n-                                 (not (match-string 1 value)) ; X%\r\n-                                 (not (<= 0.0 number 2.0)))))))))\r\n-             ;; #+ATTR_BACKEND: :width ...\r\n-             (attr-other\r\n-              (catch :found\r\n-                (org-element-properties-map\r\n-                 (lambda (prop _)\r\n-                   (when (and\r\n-                          (not (eq prop :attr_org))\r\n-                          (string-match-p \"^:attr_\" (symbol-name prop))\r\n-                          (not (funcall width-unreadable? (org-export-read-attribute prop par :width))))\r\n-                     (throw :found prop)))\r\n-                 par)))\r\n-             (attr-width\r\n-              (if (not (funcall width-unreadable? attr-width))\r\n-                  attr-width\r\n-                ;; When #+attr_org: does not have readable :width\r\n-                (and attr-other\r\n-                     (org-export-read-attribute attr-other par :width))))\r\n-             (width\r\n-              (cond\r\n-               ;; Treat :width t as if `org-image-actual-width' were t.\r\n-               ((string= attr-width \"t\") nil)\r\n-               ;; Fallback to `org-image-actual-width' if no interprable width is given.\r\n-               ((funcall width-unreadable? attr-width)\r\n-                (car org-image-actual-width))\r\n-               ;; Convert numeric widths to numbers, converting percentages.\r\n-               ((string-match-p \"\\\\`[[+]?[0-9.]+%\" attr-width)\r\n-                (\/ (string-to-number attr-width) 100.0))\r\n-               (t (string-to-number attr-width)))))\r\n-        (if (and (floatp width) (<= 0.0 width 2.0))\r\n-            ;; A float in [0,2] should be interpereted as this portion of\r\n-            ;; the text width in the window.  This works well with cases like\r\n-            ;; #+attr_latex: :width 0.X\\{line,page,column,etc.}width,\r\n-            ;; as the \"0.X\" is pulled out as a float.  We use 2 as the upper\r\n-            ;; bound as cases such as 1.2\\linewidth are feasible.\r\n-            (round (* width\r\n-                      (window-pixel-width)\r\n-                      (\/ (or (and (bound-and-true-p visual-fill-column-mode)\r\n-                                  (or visual-fill-column-width auto-fill-function))\r\n-                             (when auto-fill-function fill-column)\r\n-                             (- (window-text-width) (line-number-display-width)))\r\n-                         (float (window-total-width)))))\r\n-          width)))\r\n-     ((numberp org-image-actual-width)\r\n-      org-image-actual-width)\r\n-     (t nil))))\r\n-\r\n-(defun org-image--align (link)\r\n-  \"Determine the alignment of the image LINK.\r\n-LINK is a link object.\r\n-\r\n-In decreasing order of priority, this is controlled:\r\n-- Per image by the value of `:center' or `:align' in the\r\n-affiliated keyword `#+attr_org'.\r\n-- By the `#+attr_html' or `#+attr_latex` keywords with valid\r\n-  `:center' or `:align' values.\r\n-- Globally by the user option `org-image-align'.\r\n-\r\n-The result is either nil or one of the strings \\\"left\\\",\r\n-\\\"center\\\" or \\\"right\\\".\r\n-\r\n-\\\"center\\\" will cause the image preview to be centered, \\\"right\\\"\r\n-will cause it to be right-aligned.  A value of \\\"left\\\" or nil\r\n-implies no special alignment.\"\r\n-  (let ((par (org-element-lineage link 'paragraph)))\r\n-    ;; Only align when image is not surrounded by paragraph text:\r\n-    (when (and par ; when image is not in paragraph, but in table\/headline\/etc, do not align\r\n-               (= (org-element-begin link)\r\n-                  (save-excursion\r\n-                    (goto-char (org-element-contents-begin par))\r\n-                    (skip-chars-forward \"\\t \")\r\n-                    (point)))           ;account for leading space\r\n-                                        ;before link\r\n-               (<= (- (org-element-contents-end par)\r\n-                     (org-element-end link))\r\n-                  1))                  ;account for trailing newline\r\n-                                        ;at end of paragraph\r\n-      (save-match-data\r\n-        ;; Look for a valid \":center t\" or \":align left|center|right\"\r\n-        ;; attribute.\r\n-        ;;\r\n-        ;; An attr_org keyword has the highest priority, with\r\n-        ;; any attr.* next.  Choosing between these is\r\n-        ;; unspecified.\r\n-        (let ((center-re \":\\\\(center\\\\)[[:space:]]+t\\\\b\")\r\n-              (align-re \":align[[:space:]]+\\\\(left\\\\|center\\\\|right\\\\)\\\\b\")\r\n-              attr-align)\r\n-          (catch 'exit\r\n-            (org-element-properties-mapc\r\n-             (lambda (propname propval)\r\n-               (when (and propval\r\n-                          (string-match-p \":attr.*\" (symbol-name propname)))\r\n-                 (setq propval (car-safe propval))\r\n-                 (when (or (string-match center-re propval)\r\n-                           (string-match align-re propval))\r\n-                   (setq attr-align (match-string 1 propval))\r\n-                   (when (eq propname :attr_org)\r\n-                     (throw 'exit t)))))\r\n-             par))\r\n-          (if attr-align\r\n-              (when (member attr-align '(\"center\" \"right\")) attr-align)\r\n-            ;; No image-specific keyword, check global alignment property\r\n-            (when (memq org-image-align '(center right))\r\n-              (symbol-name org-image-align))))))))\r\n-\r\n-\r\n-(defun org-display-inline-remove-overlay (ov after _beg _end &optional _len)\r\n-  \"Remove inline-display overlay if a corresponding region is modified.\"\r\n-  (when (and ov after)\r\n-    (setq org-inline-image-overlays (delete ov org-inline-image-overlays))\r\n-    ;; Clear image from cache to avoid image not updating upon\r\n-    ;; changing on disk.  See Emacs bug#59902.\r\n-    (when (overlay-get ov 'org-image-overlay)\r\n-      (image-flush (overlay-get ov 'display)))\r\n-    (delete-overlay ov)))\r\n-\r\n-(defun org-remove-inline-images (&optional beg end)\r\n-  \"Remove inline display of images.\"\r\n-  (interactive)\r\n-  (let* ((beg (or beg (point-min)))\r\n-         (end (or end (point-max)))\r\n-         (overlays (overlays-in beg end)))\r\n-    (dolist (ov overlays)\r\n-      (when (memq ov org-inline-image-overlays)\r\n-        (setq org-inline-image-overlays (delq ov org-inline-image-overlays))\r\n-        (delete-overlay ov)))\r\n-    ;; Clear removed overlays.\r\n-    (dolist (ov org-inline-image-overlays)\r\n-      (unless (overlay-buffer ov)\r\n-        (setq org-inline-image-overlays (delq ov org-inline-image-overlays))))))\r\n-\r\n (defvar org-self-insert-command-undo-counter 0)\r\n (defvar org-speed-command nil)\r\n \r\ndiff --git a\/testing\/lisp\/test-org-fold.el b\/testing\/lisp\/test-org-fold.el\r\nindex f58642be6..809738f6c 100644\r\n--- a\/testing\/lisp\/test-org-fold.el\r\n+++ b\/testing\/lisp\/test-org-fold.el\r\n@@ -716,14 +716,14 @@ (ert-deftest test-org-fold\/org-fold-display-inline-images ()\r\n       (org-show-subtree)\r\n       (org-fold-subtree t)\r\n       (run-hook-with-args 'org-cycle-hook 'folded)\r\n-      (should-not org-inline-image-overlays)\r\n+      (should-not org-link-preview-overlays)\r\n       (should-not\r\n        (cl-every\r\n         (lambda (ov) (overlay-get ov 'org-image-overlay))\r\n         (overlays-in (point-min) (point-max))))\r\n       (org-show-subtree)\r\n       (run-hook-with-args 'org-cycle-hook 'subtree)\r\n-      (should org-inline-image-overlays)\r\n+      (should org-link-preview-overlays)\r\n       (should\r\n        (cl-every\r\n         (lambda (ov) (overlay-get ov 'org-image-overlay))\r\n-- \r\n2.44.1\r\n\r\n","subject":"Re: [PATCH v5] Inline image display as part of a new org-link-preview system"},{"date":"2024-09-17T11:17:21.666Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ikuuwmz4.fsf@gmail.com","message-id":"87ikuuwmz4.fsf@gmail.com","config":false,"refs-count":6,"username":"Visuwesh","related-refs":["87ikuuwmz4.fsf@gmail.com","877cb4f41u.fsf@gmail.com"],"from":"visuweshm@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-id-find might change the major-mode of a buffer [9.8-pre (release_9.7.8-713-g62cbac @ \/home\/viz\/lib\/emacs\/straight\/build\/org\/)]"},{"date":"2024-09-16T04:59:11.591Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/a7d4e731-1af6-4ce9-9f4d-d49ddcf5750d@cas.cat","message-id":"a7d4e731-1af6-4ce9-9f4d-d49ddcf5750d@cas.cat","config":false,"refs-count":13,"username":"pinmacs","related-refs":["87frk2tvvm.fsf@gmail.com","a7d4e731-1af6-4ce9-9f4d-d49ddcf5750d@cas.cat"],"from":"pinmacs@cas.cat","source-id":"emacs-orgmode@gnu.org","subject":"[FR] yank media: allow customization of absolute path a filter for type candidates"},{"date":"2024-09-15T21:59:48.140Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8734m060ma.fsf@gmail.com","message-id":"8734m060ma.fsf@gmail.com","config":false,"refs-count":21,"username":"Karthik Chikmagalur","references":["878qwb8qw1.fsf@localhost","CAL1eYuK5Nc0br3bX0fHU4e=wGd=MmmDPzKYC6VZMUoM6soqQ4Q@mail.gmail.com","875xrqg6cb.fsf@gmail.com","87h6b09v4o.fsf@gmail.com","66a8b73b.170a0220.383476.996e@mx.google.com","87r0ajawgj.fsf@localhost","87cym38aj8.fsf@gmail.com","87o74ypp3b.fsf@localhost","874j70n559.fsf@localhost","87v7zyyvm3.fsf@localhost","87h6ah72ui.fsf@localhost","87frr07xz8.fsf@gmail.com","871q3logb9.fsf@localhost","87msksabld.fsf@gmail.com","87r09rxpjg.fsf@gmail.com","87jzfwljkq.fsf@localhost","87msl4wv8d.fsf@localhost","87a5h77zb1.fsf@gmail.com","878qw9ak6a.fsf@gmail.com","6461a84b.a70a0220.b6d36.5d00@mx.google.com","87o75yhwnu.fsf@localhost"],"related-refs":["87tte7wdpj.fsf@gmail.com","87h68weovw.fsf@gmail.com","87h6b09v4o.fsf@gmail.com","8734lx4twk.fsf@gmail.com","87msimtz88.fsf@gmail.com","87a5enevy5.fsf@gmail.com","87cykbfodz.fsf@gmail.com","8734m060ma.fsf@gmail.com"],"from":"karthikchikmagalur@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/8734m060ma.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From b70a4849b9c4ef2dca0d834ab60b2ab173e8b38b Mon Sep 17 00:00:00 2001\r\nFrom: Karthik Chikmagalur <karthikchikmagalur@gmail.com>\r\nDate: Fri, 23 Aug 2024 15:46:53 -0700\r\nSubject: [PATCH] org-link: Customizable preview API for arbitrary link types\r\n\r\nAdd a customizable preview API for arbitrary link types.  Make\r\ninline image previews a part of the more universal org-link\r\npreview feature.  Each link type can now be previewed differently\r\nbased on a new link parameter.\r\n\r\n* lisp\/ol.el (org-link-parameters, org-link-preview-batch-size,\r\norg-link-preview-delay, org-link-preview-overlays,\r\norg-link-preview--get-overlays, org-link-preview--remove-overlay,\r\norg-link-previeworg-link-preview-region, org-link-preview-clear,\r\norg-link-preview-file, org-display-remote-inline-images,\r\norg-image-align, org--create-inline-image,\r\norg-display-inline-image--width, org-image--align): Add new\r\ncommands `org-link-preview', `org-link-preview-region' and\r\n`org-link-preview-clear' for creating link previews for any kind\r\nof link.  Add new org-link parameter `:preview' for specifying how\r\na link type should be previewed.  This link parameter is a\r\nfunction called asynchronously to place previes.  File links and\r\nattachments are previewed using inline image previews as before.\r\nMove image handling utilities from lisp\/org.el to lisp\/ol.el.\r\n\r\n* testing\/lisp\/test-org-fold.el: Use `org-link-preview'.\r\n\r\n* lisp\/org.el (org-toggle-inline-images,\r\norg-toggle-inline-images-command, org-display-inline-images,\r\norg--inline-image-overlays, org-inline-image-overlays,\r\norg-redisplay-inline-images, org-image-align,\r\norg-display-inline-remove-overlay, org-remove-inline-images):\r\nObsolete and move `org-toggle-inline-images',\r\n`org-display-inline-images' and `org-redisplay-inline-images' to\r\norg-compat.  These are obsoleted by `org-link-preview' and\r\n`org-link-preview-region'.  Remove\r\n`org-toggle-inline-images-command'.  Move the other internal\r\nfunctions to org-link.\r\n\r\n* lisp\/org-plot.el (org-plot\/redisplay-img-in-buffer): Modify to\r\nuse `org-link-preview'.\r\n\r\n* lisp\/org-keys.el: Bind `C-c C-x C-v' to new command\r\n`org-link-preview', which has the same prefix arg behaviors as\r\n`org-latex-preview'.  In addition to these, it supports numeric\r\nprefix args 1 and 11 to preview links with descriptions at\r\npoint\/region (with 1) and across the buffer (with 11).\r\n\r\n* lisp\/org-cycle.el (org-cycle-display-inline-images): Use\r\n`org-link-preview'.\r\n\r\n* lisp\/org-compat.el (org-display-inline-remove-overlay,\r\norg--inline-image-overlays, org-remove-inline-images,\r\norg-inline-image-overlays, org-display-inline-images,\r\norg-toggle-inline-images):\r\n\r\n* lisp\/org-attach.el (org-attach-preview-file): Add new `:preview'\r\nlink parameter for links of type \"attachment\", set to the new\r\nfunction `org-attach-preview-file'.\r\n---\r\n lisp\/ol.el                    | 567 +++++++++++++++++++++++++++++++++-\r\n lisp\/org-attach.el            |  11 +-\r\n lisp\/org-compat.el            | 189 ++++++++++++\r\n lisp\/org-cycle.el             |  10 +-\r\n lisp\/org-keys.el              |   4 +-\r\n lisp\/org-plot.el              |   2 +-\r\n lisp\/org.el                   | 534 +-------------------------------\r\n testing\/lisp\/test-org-fold.el |   4 +-\r\n 8 files changed, 776 insertions(+), 545 deletions(-)\r\n\r\ndiff --git a\/lisp\/ol.el b\/lisp\/ol.el\r\nindex 52ea62d69..9e1fee980 100644\r\n--- a\/lisp\/ol.el\r\n+++ b\/lisp\/ol.el\r\n@@ -82,6 +82,11 @@ (declare-function org-src-source-buffer \"org-src\" ())\r\n (declare-function org-src-source-type \"org-src\" ())\r\n (declare-function org-time-stamp-format \"org\" (&optional long inactive))\r\n (declare-function outline-next-heading \"outline\" ())\r\n+(declare-function image-flush \"image\" (spec &optional frame))\r\n+(declare-function org-entry-end-position \"org\" ())\r\n+(declare-function org-element-contents-begin \"org-element\" (node))\r\n+(declare-function org-element-contents-end \"org-element\" (node))\r\n+(declare-function org-property-or-variable-value \"org\" (var &optional inherit))\r\n \r\n \f\r\n ;;; Customization\r\n@@ -171,6 +176,16 @@ (defcustom org-link-parameters nil\r\n \r\n   The default face is `org-link'.\r\n \r\n+`:preview'\r\n+\r\n+  Function to run to generate an in-buffer preview for the link.  It\r\n+  must accept three arguments:\r\n+  - an overlay placed from the start to the end of the link.\r\n+  - the link path, as a string.\r\n+  - the link element\r\n+\r\n+  This function must return a non-nil value to indicate success.\r\n+\r\n `:help-echo'\r\n \r\n   String or function used as a value for the `help-echo' text\r\n@@ -521,6 +536,80 @@ (defcustom org-link-keep-stored-after-insertion nil\r\n   :type 'boolean\r\n   :safe #'booleanp)\r\n \r\n+(defcustom org-link-preview-delay 0.05\r\n+  \"Idle delay in seconds between link previews when using\r\n+`org-link-preview'.  Links are previewed in batches (see\r\n+`org-link-preview-batch-size') spaced out by this delay.  Set\r\n+this to a small number for more immediate previews, but at the\r\n+expense of higher lag.\"\r\n+  :group 'org-link\r\n+  :type 'number)\r\n+\r\n+(defcustom org-link-preview-batch-size 6\r\n+  \"Number of links that are previewed at once with\r\n+`org-link-preview'.  Links are previewed in batches spaced out in\r\n+time (see `org-link-preview-delay').  Set this to a large integer\r\n+for more immediate previews, but at the expense of higher lag.\"\r\n+  :group 'org-link\r\n+  :type 'natnum)\r\n+\r\n+(defcustom org-display-remote-inline-images 'skip\r\n+  \"How to display remote inline images.\r\n+Possible values of this option are:\r\n+\r\n+skip        Don't display remote images.\r\n+download    Always download and display remote images.\r\n+t\r\n+cache       Display remote images, and open them in separate buffers\r\n+            for caching.  Silently update the image buffer when a file\r\n+            change is detected.\"\r\n+  :group 'org-appearance\r\n+  :package-version '(Org . \"9.7\")\r\n+  :type '(choice\r\n+\t  (const :tag \"Ignore remote images\" skip)\r\n+\t  (const :tag \"Always display remote images\" download)\r\n+\t  (const :tag \"Display and silently update remote images\" cache))\r\n+  :safe #'symbolp)\r\n+\r\n+(defcustom org-image-max-width 'fill-column\r\n+  \"When non-nil, limit the displayed image width.\r\n+This setting only takes effect when `org-image-actual-width' is set to\r\n+t or when #+ATTR* is set to t.\r\n+\r\n+Possible values:\r\n+- `fill-column' :: limit width to `fill-column'\r\n+- `window'      :: limit width to window width\r\n+- integer       :: limit width to number in pixels\r\n+- float         :: limit width to that fraction of window width\r\n+- nil             :: do not limit image width\"\r\n+  :group 'org-appearance\r\n+  :package-version '(Org . \"9.7\")\r\n+  :type '(choice\r\n+          (const :tag \"Do not limit image width\" nil)\r\n+          (const :tag \"Limit to `fill-column'\" fill-column)\r\n+          (const :tag \"Limit to window width\" window)\r\n+          (integer :tag \"Limit to a number of pixels\")\r\n+          (float :tag \"Limit to a fraction of window width\")))\r\n+\r\n+(defcustom org-image-align 'left\r\n+  \"How to align images previewed using `org-link-preview-region'.\r\n+\r\n+Only stand-alone image links are affected by this setting.  These\r\n+are links without surrounding text.\r\n+\r\n+Possible values of this option are:\r\n+\r\n+left     Insert image at specified position.\r\n+center   Center image previews.\r\n+right    Right-align image previews.\"\r\n+  :group 'org-appearance\r\n+  :package-version '(Org . \"9.7\")\r\n+  :type '(choice\r\n+          (const :tag \"Left align (or don\\\\='t align) image previews\" left)\r\n+\t  (const :tag \"Center image previews\" center)\r\n+\t  (const :tag \"Right align image previews\" right))\r\n+  :safe #'symbolp)\r\n+\r\n ;;; Public variables\r\n \r\n (defconst org-target-regexp (let ((border \"[^<>\\n\\r \\t]\"))\r\n@@ -649,6 +738,13 @@ (defvar org-link--insert-history nil\r\n (defvar org-link--search-failed nil\r\n   \"Non-nil when last link search failed.\")\r\n \r\n+(defvar-local org-link-preview-overlays nil)\r\n+;; Preserve when switching modes or when restarting Org.\r\n+;; If we clear the overlay list and later enable Or mode, the existing\r\n+;; image overlays will never be cleared by `org-link-preview'\r\n+;; and `org-link-preview-clear'.\r\n+(put 'org-link-preview-overlays 'permanent-local t)\r\n+\r\n \f\r\n ;;; Internal Functions\r\n \r\n@@ -881,7 +977,228 @@ (defun org-link--file-link-to-here ()\r\n          (setq desc search-desc))))\r\n     (cons link desc)))\r\n \r\n+(defun org-link-preview--get-overlays (&optional beg end)\r\n+  \"Return link preview overlays between BEG and END.\"\r\n+  (let* ((beg (or beg (point-min)))\r\n+         (end (or end (point-max)))\r\n+         (overlays (overlays-in beg end))\r\n+         result)\r\n+    (dolist (ov overlays result)\r\n+      (when (memq ov org-link-preview-overlays)\r\n+        (push ov result)))))\r\n+\r\n+(defun org-link-preview--remove-overlay (ov after _beg _end &optional _len)\r\n+  \"Remove link-preview overlay OV if a corresponding region is modified.\r\n+\r\n+AFTER is true when this function is called post-change.\"\r\n+  (when (and ov after)\r\n+    (setq org-link-preview-overlays (delq ov org-link-preview-overlays))\r\n+    ;; Clear image from cache to avoid image not updating upon\r\n+    ;; changing on disk.  See Emacs bug#59902.\r\n+    (when-let* (((overlay-get ov 'org-image-overlay))\r\n+                (disp (overlay-get ov 'display))\r\n+                ((imagep disp)))\r\n+      (image-flush disp))\r\n+    (delete-overlay ov)))\r\n+\r\n \f\r\n+\r\n+;;;; Utilities for image preview display\r\n+\r\n+;; For without-x builds.\r\n+(declare-function image-flush \"image\" (spec &optional frame))\r\n+\r\n+(defun org--create-inline-image (file width)\r\n+  \"Create image located at FILE, or return nil.\r\n+WIDTH is the width of the image.  The image may not be created\r\n+according to the value of `org-display-remote-inline-images'.\"\r\n+  (let* ((remote? (file-remote-p file))\r\n+\t (file-or-data\r\n+\t  (pcase org-display-remote-inline-images\r\n+\t    ((guard (not remote?)) file)\r\n+\t    (`download (with-temp-buffer\r\n+\t\t\t (set-buffer-multibyte nil)\r\n+\t\t\t (insert-file-contents-literally file)\r\n+\t\t\t (buffer-string)))\r\n+\t    ((or `cache `t)\r\n+             (let ((revert-without-query '(\".\")))\r\n+\t       (with-current-buffer (find-file-noselect file)\r\n+\t\t (buffer-string))))\r\n+\t    (`skip nil)\r\n+\t    (other\r\n+\t     (message \"Invalid value of `org-display-remote-inline-images': %S\"\r\n+\t\t      other)\r\n+\t     nil))))\r\n+    (when file-or-data\r\n+      (create-image file-or-data\r\n+\t\t    (and (image-type-available-p 'imagemagick)\r\n+\t\t\t width\r\n+\t\t\t 'imagemagick)\r\n+\t\t    remote?\r\n+\t\t    :width width\r\n+                    :max-width\r\n+                    (pcase org-image-max-width\r\n+                      (`fill-column (* fill-column (frame-char-width (selected-frame))))\r\n+                      (`window (window-width nil t))\r\n+                      ((pred integerp) org-image-max-width)\r\n+                      ((pred floatp) (floor (* org-image-max-width (window-width nil t))))\r\n+                      (`nil nil)\r\n+                      (_ (error \"Unsupported value of `org-image-max-width': %S\"\r\n+                                org-image-max-width)))\r\n+                    :scale 1))))\r\n+\r\n+(declare-function org-export-read-attribute \"ox\"\r\n+                  (attribute element &optional property))\r\n+(defvar visual-fill-column-width) ; Silence compiler warning\r\n+(defun org-display-inline-image--width (link)\r\n+  \"Determine the display width of the image LINK, in pixels.\r\n+- When `org-image-actual-width' is t, the image's pixel width is used.\r\n+- When `org-image-actual-width' is a number, that value will is used.\r\n+- When `org-image-actual-width' is nil or a list, :width attribute of\r\n+  #+attr_org or the first #+attr_...  (if it exists) is used to set the\r\n+  image width.  A width of X% is divided by 100.  If the value is a\r\n+  float between 0 and 2, it interpreted as that proportion of the text\r\n+  width in the buffer.\r\n+\r\n+  If no :width attribute is given and `org-image-actual-width' is a\r\n+  list with a number as the car, then that number is used as the\r\n+  default value.\"\r\n+  ;; Apply `org-image-actual-width' specifications.\r\n+  ;; Support subtree-level property \"ORG-IMAGE-ACTUAL-WIDTH\" specified\r\n+  ;; width.\r\n+  (let ((org-image-actual-width (org-property-or-variable-value 'org-image-actual-width)))\r\n+    (cond\r\n+     ((eq org-image-actual-width t) nil)\r\n+     ((listp org-image-actual-width)\r\n+      (require 'ox)\r\n+      (let* ((par (org-element-lineage link 'paragraph))\r\n+             ;; Try to find an attribute providing a :width.\r\n+             ;; #+ATTR_ORG: :width ...\r\n+             (attr-width (org-export-read-attribute :attr_org par :width))\r\n+             (width-unreadable?\r\n+              (lambda (value)\r\n+                (or (not (stringp value))\r\n+                    (unless (string= value \"t\")\r\n+                      (or (not (string-match\r\n+                              (rx bos (opt \"+\")\r\n+                                  (or\r\n+                                   ;; Number of pixels\r\n+                                   ;; must be a lone number, not\r\n+                                   ;; things like 4in\r\n+                                   (seq (1+ (in \"0-9\")) eos)\r\n+                                   ;; Numbers ending with %\r\n+                                   (seq (1+ (in \"0-9.\")) (group-n 1 \"%\"))\r\n+                                   ;; Fractions\r\n+                                   (seq (0+ (in \"0-9\")) \".\" (1+ (in \"0-9\")))))\r\n+                              value))\r\n+                          (let ((number (string-to-number value)))\r\n+                            (and (floatp number)\r\n+                                 (not (match-string 1 value)) ; X%\r\n+                                 (not (<= 0.0 number 2.0)))))))))\r\n+             ;; #+ATTR_BACKEND: :width ...\r\n+             (attr-other\r\n+              (catch :found\r\n+                (org-element-properties-map\r\n+                 (lambda (prop _)\r\n+                   (when (and\r\n+                          (not (eq prop :attr_org))\r\n+                          (string-match-p \"^:attr_\" (symbol-name prop))\r\n+                          (not (funcall width-unreadable? (org-export-read-attribute prop par :width))))\r\n+                     (throw :found prop)))\r\n+                 par)))\r\n+             (attr-width\r\n+              (if (not (funcall width-unreadable? attr-width))\r\n+                  attr-width\r\n+                ;; When #+attr_org: does not have readable :width\r\n+                (and attr-other\r\n+                     (org-export-read-attribute attr-other par :width))))\r\n+             (width\r\n+              (cond\r\n+               ;; Treat :width t as if `org-image-actual-width' were t.\r\n+               ((string= attr-width \"t\") nil)\r\n+               ;; Fallback to `org-image-actual-width' if no interprable width is given.\r\n+               ((funcall width-unreadable? attr-width)\r\n+                (car org-image-actual-width))\r\n+               ;; Convert numeric widths to numbers, converting percentages.\r\n+               ((string-match-p \"\\\\`[[+]?[0-9.]+%\" attr-width)\r\n+                (\/ (string-to-number attr-width) 100.0))\r\n+               (t (string-to-number attr-width)))))\r\n+        (if (and (floatp width) (<= 0.0 width 2.0))\r\n+            ;; A float in [0,2] should be interpereted as this portion of\r\n+            ;; the text width in the window.  This works well with cases like\r\n+            ;; #+attr_latex: :width 0.X\\{line,page,column,etc.}width,\r\n+            ;; as the \"0.X\" is pulled out as a float.  We use 2 as the upper\r\n+            ;; bound as cases such as 1.2\\linewidth are feasible.\r\n+            (round (* width\r\n+                      (window-pixel-width)\r\n+                      (\/ (or (and (bound-and-true-p visual-fill-column-mode)\r\n+                                  (or visual-fill-column-width auto-fill-function))\r\n+                             (when auto-fill-function fill-column)\r\n+                             (- (window-text-width) (line-number-display-width)))\r\n+                         (float (window-total-width)))))\r\n+          width)))\r\n+     ((numberp org-image-actual-width)\r\n+      org-image-actual-width)\r\n+     (t nil))))\r\n+\r\n+(defun org-image--align (link)\r\n+  \"Determine the alignment of the image LINK.\r\n+LINK is a link object.\r\n+\r\n+In decreasing order of priority, this is controlled:\r\n+- Per image by the value of `:center' or `:align' in the\r\n+affiliated keyword `#+attr_org'.\r\n+- By the `#+attr_html' or `#+attr_latex` keywords with valid\r\n+  `:center' or `:align' values.\r\n+- Globally by the user option `org-image-align'.\r\n+\r\n+The result is either nil or one of the strings \\\"left\\\",\r\n+\\\"center\\\" or \\\"right\\\".\r\n+\r\n+\\\"center\\\" will cause the image preview to be centered, \\\"right\\\"\r\n+will cause it to be right-aligned.  A value of \\\"left\\\" or nil\r\n+implies no special alignment.\"\r\n+  (let ((par (org-element-lineage link 'paragraph)))\r\n+    ;; Only align when image is not surrounded by paragraph text:\r\n+    (when (and par ; when image is not in paragraph, but in table\/headline\/etc, do not align\r\n+               (= (org-element-begin link)\r\n+                  (save-excursion\r\n+                    (goto-char (org-element-contents-begin par))\r\n+                    (skip-chars-forward \"\\t \")\r\n+                    (point)))           ;account for leading space\r\n+                                        ;before link\r\n+               (<= (- (org-element-contents-end par)\r\n+                     (org-element-end link))\r\n+                  1))                  ;account for trailing newline\r\n+                                        ;at end of paragraph\r\n+      (save-match-data\r\n+        ;; Look for a valid \":center t\" or \":align left|center|right\"\r\n+        ;; attribute.\r\n+        ;;\r\n+        ;; An attr_org keyword has the highest priority, with\r\n+        ;; any attr.* next.  Choosing between these is\r\n+        ;; unspecified.\r\n+        (let ((center-re \":\\\\(center\\\\)[[:space:]]+t\\\\b\")\r\n+              (align-re \":align[[:space:]]+\\\\(left\\\\|center\\\\|right\\\\)\\\\b\")\r\n+              attr-align)\r\n+          (catch 'exit\r\n+            (org-element-properties-mapc\r\n+             (lambda (propname propval)\r\n+               (when (and propval\r\n+                          (string-match-p \":attr.*\" (symbol-name propname)))\r\n+                 (setq propval (car-safe propval))\r\n+                 (when (or (string-match center-re propval)\r\n+                           (string-match align-re propval))\r\n+                   (setq attr-align (match-string 1 propval))\r\n+                   (when (eq propname :attr_org)\r\n+                     (throw 'exit t)))))\r\n+             par))\r\n+          (if attr-align\r\n+              (when (member attr-align '(\"center\" \"right\")) attr-align)\r\n+            ;; No image-specific keyword, check global alignment property\r\n+            (when (memq org-image-align '(center right))\r\n+              (symbol-name org-image-align))))))))\r\n+\r\n ;;; Public API\r\n \r\n (defun org-link-types ()\r\n@@ -1573,6 +1890,213 @@ (defun org-link-add-angle-brackets (s)\r\n   (unless (equal (substring s -1) \">\") (setq s (concat s \">\")))\r\n   s)\r\n \r\n+;;;###autoload\r\n+(defun org-link-preview (&optional arg beg end)\r\n+  \"Toggle display of link previews in the buffer.\r\n+\r\n+When region BEG..END is active, preview links in the\r\n+region.\r\n+\r\n+When point is at a link, display a preview for that link only.\r\n+Otherwise, display previews for links in current entry.\r\n+\r\n+With numeric prefix ARG 1, preview links with description as\r\n+well.\r\n+\r\n+With prefix ARG `\\\\[universal-argument]', clear link previews at\r\n+point or in the current entry.\r\n+\r\n+With prefix ARG `\\\\[universal-argument] \\\\[universal-argument]',\r\n+ display link previews in the accessible portion of the\r\n+ buffer.  With numeric prefix ARG 11, do the same, but include\r\n+ links with descriptions.\r\n+\r\n+With prefix ARG `\\\\[universal-argument] \\\\[universal-argument] \\\\[universal-argument]',\r\n+hide all link previews in the accessible portion of the buffer.\r\n+\r\n+This command is designed for interactive use.  From Elisp, you can\r\n+also use `org-link-preview-region'.\"\r\n+  (interactive (cons current-prefix-arg\r\n+                     (when (use-region-p)\r\n+                       (list (region-beginning) (region-end)))))\r\n+  (let* ((include-linked\r\n+          (cond\r\n+           ((member arg '(nil (4) (16)) ) nil)\r\n+           ((member arg '(1 11)) 'include-linked)\r\n+           (t 'include-linked)))\r\n+         (interactive? (called-interactively-p 'any))\r\n+         (toggle-previews\r\n+          (lambda (&optional beg end scope remove)\r\n+            (let* ((beg (or beg (point-min)))\r\n+                   (end (or end (point-max)))\r\n+                   (old (org-link-preview--get-overlays beg end))\r\n+                   (scope (or scope (format \"%d:%d\" beg end))))\r\n+              (if remove\r\n+                  (progn\r\n+                    (org-link-preview-clear beg end)\r\n+                    (when interactive?\r\n+                      (message\r\n+                       \"[%s] Inline link previews turned off (removed %d images)\"\r\n+                       scope (length old))))\r\n+\t        (org-link-preview-region include-linked t beg end)\r\n+                (when interactive?\r\n+                  (let ((new (org-link-preview--get-overlays beg end)))\r\n+                    (message\r\n+                     (if new\r\n+\t\t         (format \"[%s] Displaying %d images inline %s\"\r\n+\t\t\t         scope (length new)\r\n+                                 (if include-linked \"(including images with description)\"\r\n+                                   \"\"))\r\n+\t\t       (format \"[%s] No images to display inline\" scope))))))))))\r\n+    (cond\r\n+     ;; Region selected :: display previews in region.\r\n+     ((and beg end)\r\n+      (funcall toggle-previews beg end \"region\"\r\n+               (and (equal arg '(4)) 'remove)))\r\n+     ;; C-u argument: clear image at point or in entry\r\n+     ((equal arg '(4))\r\n+      (if-let ((ov (cdr (get-char-property-and-overlay\r\n+                         (point) 'org-image-overlay))))\r\n+          ;; clear link preview at point\r\n+          (funcall toggle-previews\r\n+                   (overlay-start ov) (overlay-end ov)\r\n+                   \"preview at point\" 'remove)\r\n+        ;; Clear link previews in entry\r\n+        (funcall toggle-previews\r\n+                 (if (org-before-first-heading-p) (point-min)\r\n+                   (save-excursion\r\n+                     (org-with-limited-levels (org-back-to-heading t) (point))))\r\n+                 (org-with-limited-levels (org-entry-end-position))\r\n+                 \"current section\" 'remove)))\r\n+     ;; C-u C-u or C-11 argument :: display images in the whole buffer.\r\n+     ((member arg '(11 (16))) (funcall toggle-previews nil nil \"buffer\"))\r\n+     ;; C-u C-u C-u argument :: unconditionally hide images in the buffer.\r\n+     ((equal arg '(64)) (funcall toggle-previews nil nil \"buffer\" 'remove))\r\n+     ;; Argument nil or 1, no region selected :: display images in\r\n+     ;; current section or image link at point.\r\n+     ((and (member arg '(nil 1)) (null beg) (null end))\r\n+      (let ((context (org-element-context)))\r\n+        ;; toggle display of inline image link at point.\r\n+        (if (org-element-type-p context 'link)\r\n+            (let* ((ov (cdr-safe (get-char-property-and-overlay\r\n+                                  (point) 'org-image-overlay)))\r\n+                   (remove? (and ov (memq ov org-link-preview-overlays)\r\n+                                 'remove)))\r\n+              (funcall toggle-previews\r\n+                       (org-element-begin context)\r\n+                       (org-element-end context)\r\n+                       \"image at point\" remove?))\r\n+          (let ((beg (if (org-before-first-heading-p) (point-min)\r\n+\t               (save-excursion\r\n+\t                 (org-with-limited-levels (org-back-to-heading t) (point)))))\r\n+                (end (org-with-limited-levels (org-entry-end-position))))\r\n+            (funcall toggle-previews beg end \"current section\")))))\r\n+     ;; Any other non-nil argument.\r\n+     ((not (null arg)) (funcall toggle-previews beg end \"region\")))))\r\n+\r\n+(defun org-link-preview-region (&optional include-linked refresh beg end)\r\n+  \"Display link previews.\r\n+\r\n+A previewable link type is one that has a `:preview' link\r\n+parameter, see `org-link-parameters'.\r\n+\r\n+By default, a file link or attachment is previewable if it\r\n+follows either of these conventions:\r\n+\r\n+  1. Its path is a file with an extension matching return value\r\n+     from `image-file-name-regexp' and it has no contents.\r\n+\r\n+  2. Its description consists in a single link of the previous\r\n+     type.  In this case, that link must be a well-formed plain\r\n+     or angle link, i.e., it must have an explicit \\\"file\\\" or\r\n+     \\\"attachment\\\" type.\r\n+\r\n+File links are equipped with the keymap `image-map'.\r\n+\r\n+When optional argument INCLUDE-LINKED is non-nil, links with a\r\n+text description part will also be inlined.  This can be nice for\r\n+a quick look at those images, but it does not reflect what\r\n+exported files will look like.\r\n+\r\n+When optional argument REFRESH is non-nil, refresh existing\r\n+images between BEG and END.  This will create new image displays\r\n+only if necessary.\r\n+\r\n+BEG and END define the considered part.  They default to the\r\n+buffer boundaries with possible narrowing.\"\r\n+  (interactive \"P\")\r\n+  (when refresh (org-link-preview-clear beg end))\r\n+  (org-with-point-at (or beg (point-min))\r\n+    (let ((case-fold-search t)\r\n+          (preview-queue (list nil)))\r\n+      ;; Collect links to preview\r\n+      (while (re-search-forward org-link-any-re end t)\r\n+        (when-let* ((link (org-element-lineage\r\n+                           (save-match-data (org-element-context))\r\n+                           'link t))\r\n+                    (linktype (org-element-property :type link))\r\n+                    (preview-func (org-link-get-parameter linktype :preview))\r\n+                    (path (and (or include-linked\r\n+                                   (not (org-element-contents-begin link)))\r\n+                               (org-element-property :path link))))\r\n+          ;; Create an overlay to hold the preview\r\n+          (let ((ov (make-overlay\r\n+                     (org-element-begin link)\r\n+                     (progn\r\n+\t\t       (goto-char\r\n+\t\t\t(org-element-end link))\r\n+\t\t       (unless (eolp) (skip-chars-backward \" \\t\"))\r\n+\t\t       (point)))))\r\n+            (overlay-put ov 'org-image-overlay t)\r\n+            (overlay-put ov 'modification-hooks\r\n+                         (list 'org-link-preview--remove-overlay))\r\n+            (push ov org-link-preview-overlays)\r\n+            ;; Collect previews to run asynchronously, in batches\r\n+            (if (>= (length (car-safe preview-queue)) org-link-preview-batch-size)\r\n+                (push (list (list preview-func ov path link)) preview-queue) ;new batch\r\n+              (push (list preview-func ov path link) (car preview-queue))))))\r\n+      (setq preview-queue (nreverse preview-queue))\r\n+      ;; Run preview asynchronously in batches:\r\n+      ;; preview-queue is a list of preview batches, which is a list of specs\r\n+      (letrec ((preview-incremental\r\n+                (lambda ()\r\n+                  (when-let ((batch (car preview-queue)))\r\n+                    ;; spec is (preview-func overlay path link)\r\n+                    (dolist (spec (nreverse batch)) ;Preview batch\r\n+                      (when-let* ((ov (cadr spec))\r\n+                                  (buf (overlay-buffer ov)))\r\n+                        (with-current-buffer buf\r\n+                          (unless (apply spec)\r\n+                            ;; Preview was unsuccessful, delete overlay\r\n+                            (delete-overlay ov)\r\n+                            (setq org-link-preview-overlays\r\n+                                  (delq ov org-link-preview-overlays))))))\r\n+                    ;; Set up next idle timer\r\n+                    (pop preview-queue)\r\n+                    (when (car-safe preview-queue)\r\n+                      (run-with-idle-timer\r\n+                       (time-add (or (current-idle-time) 0) org-link-preview-delay) nil\r\n+                       preview-incremental))))))\r\n+        (funcall preview-incremental)))))\r\n+\r\n+(defun org-link-preview-clear (&optional beg end)\r\n+  \"Clear link previews in region BEG to END.\"\r\n+  (interactive (and (use-region-p) (list (region-beginning) (region-end))))\r\n+  (let* ((beg (or beg (point-min)))\r\n+         (end (or end (point-max)))\r\n+         (overlays (overlays-in beg end)))\r\n+    (dolist (ov overlays)\r\n+      (when (memq ov org-link-preview-overlays)\r\n+        (when-let ((image (overlay-get ov 'display))\r\n+                   ((imagep image)))\r\n+          (image-flush image))\r\n+        (setq org-link-preview-overlays (delq ov org-link-preview-overlays))\r\n+        (delete-overlay ov)))\r\n+    ;; Clear removed overlays.\r\n+    (dolist (ov org-link-preview-overlays)\r\n+      (unless (overlay-buffer ov)\r\n+        (setq org-link-preview-overlays (delq ov org-link-preview-overlays))))))\r\n+\r\n \f\r\n ;;; Built-in link types\r\n \r\n@@ -1595,7 +2119,48 @@ (defun org-link--open-elisp (path _)\r\n (org-link-set-parameters \"elisp\" :follow #'org-link--open-elisp)\r\n \r\n ;;;; \"file\" link type\r\n-(org-link-set-parameters \"file\" :complete #'org-link-complete-file)\r\n+(org-link-set-parameters \"file\"\r\n+                         :complete #'org-link-complete-file\r\n+                         :preview #'org-link-preview-file)\r\n+\r\n+(defun org-link-preview-file (ov path link)\r\n+  \"Display image file PATH in overlay OV for LINK.\r\n+\r\n+LINK is the Org element being previewed.\r\n+\r\n+Equip each image with the keymap `image-map'.\r\n+\r\n+This is intended to be used as the `:preview' link property of\r\n+file links, see `org-link-parameters'.\"\r\n+  (if (not (display-graphic-p))\r\n+      (prog1 nil\r\n+        (message \"Your Emacs does not support displaying images!\"))\r\n+    (require 'image)\r\n+    (when-let* ((file-full (expand-file-name path))\r\n+                (file (substitute-in-file-name file-full))\r\n+                ((string-match-p (image-file-name-regexp) file))\r\n+                ((file-exists-p file)))\r\n+      (let* ((width (org-display-inline-image--width link))\r\n+\t     (align (org-image--align link))\r\n+             (image (org--create-inline-image file width)))\r\n+        (when image            ; Add image to overlay\r\n+\t  ;; See bug#59902.  We cannot rely\r\n+          ;; on Emacs to update image if the file\r\n+          ;; has changed.\r\n+          (image-flush image)\r\n+\t  (overlay-put ov 'display image)\r\n+\t  (overlay-put ov 'face 'default)\r\n+\t  (overlay-put ov 'keymap image-map)\r\n+          (when align\r\n+            (overlay-put\r\n+             ov 'before-string\r\n+             (propertize\r\n+              \" \" 'face 'default\r\n+              'display\r\n+              (pcase align\r\n+                (\"center\" `(space :align-to (- center (0.5 . ,image))))\r\n+                (\"right\"  `(space :align-to (- right ,image)))))))\r\n+          t)))))\r\n \r\n ;;;; \"help\" link type\r\n (defun org-link--open-help (path _)\r\ndiff --git a\/lisp\/org-attach.el b\/lisp\/org-attach.el\r\nindex 7a03d170e..3c4e1bfb6 100644\r\n--- a\/lisp\/org-attach.el\r\n+++ b\/lisp\/org-attach.el\r\n@@ -797,9 +797,18 @@ (defun org-attach-follow (file arg)\r\n See `org-open-file' for details about ARG.\"\r\n   (org-link-open-as-file (org-attach-expand file) arg))\r\n \r\n+(defun org-attach-preview-file (ov path link)\r\n+  \"Preview attachment with PATH in overlay OV.\r\n+\r\n+LINK is the Org link element being previewed.\"\r\n+  (org-with-point-at (org-element-begin link)\r\n+    (org-link-preview-file\r\n+     ov (org-attach-expand path) link)))\r\n+\r\n (org-link-set-parameters \"attachment\"\r\n \t\t\t :follow #'org-attach-follow\r\n-                         :complete #'org-attach-complete-link)\r\n+                         :complete #'org-attach-complete-link\r\n+                         :preview #'org-attach-preview-file)\r\n \r\n (defun org-attach-complete-link ()\r\n   \"Advise the user with the available files in the attachment directory.\"\r\ndiff --git a\/lisp\/org-compat.el b\/lisp\/org-compat.el\r\nindex d843216f3..242b46a86 100644\r\n--- a\/lisp\/org-compat.el\r\n+++ b\/lisp\/org-compat.el\r\n@@ -783,6 +783,195 @@ (defun org-add-link-type (type &optional follow export)\r\n \r\n (make-obsolete 'org-add-link-type \"use `org-link-set-parameters' instead.\" \"9.0\")\r\n \r\n+(declare-function org-link-preview--remove-overlay \"ol\")\r\n+(declare-function org-link-preview--get-overlays \"ol\")\r\n+(declare-function org-link-preview-clear \"ol\")\r\n+(declare-function org-link-preview--remove-overlay \"ol\")\r\n+\r\n+(define-obsolete-function-alias 'org-display-inline-remove-overlay\r\n+  'org-link-preview--remove-overlay \"9.8\")\r\n+(define-obsolete-function-alias 'org--inline-image-overlays\r\n+  'org-link-preview--get-overlays \"9.8\")\r\n+(define-obsolete-function-alias 'org-remove-inline-images\r\n+  'org-link-preview-clear \"9.8\")\r\n+(define-obsolete-variable-alias 'org-inline-image-overlays\r\n+  'org-link-preview-overlays \"9.8\")\r\n+(defvar org-link-preview-overlays)\r\n+(defvar org-link-abbrev-alist-local)\r\n+(defvar org-link-abbrev-alist)\r\n+(defvar org-link-angle-re)\r\n+(defvar org-link-plain-re)\r\n+(declare-function org-attach-expand \"org-attach\")\r\n+(declare-function org-display-inline-image--width \"org\")\r\n+(declare-function org-image--align \"org\")\r\n+(declare-function org--create-inline-image \"org\")\r\n+\r\n+(make-obsolete 'org-display-inline-images\r\n+               'org-link-preview-region \"9.8\")\r\n+;; FIXME: Unused; obsoleted; to be removed\r\n+(defun org-display-inline-images (&optional include-linked refresh beg end)\r\n+  \"Display inline images.\r\n+\r\n+An inline image is a link which follows either of these\r\n+conventions:\r\n+\r\n+  1. Its path is a file with an extension matching return value\r\n+     from `image-file-name-regexp' and it has no contents.\r\n+\r\n+  2. Its description consists in a single link of the previous\r\n+     type.  In this case, that link must be a well-formed plain\r\n+     or angle link, i.e., it must have an explicit \\\"file\\\" or\r\n+     \\\"attachment\\\" type.\r\n+\r\n+Equip each image with the key-map `image-map'.\r\n+\r\n+When optional argument INCLUDE-LINKED is non-nil, also links with\r\n+a text description part will be inlined.  This can be nice for\r\n+a quick look at those images, but it does not reflect what\r\n+exported files will look like.\r\n+\r\n+When optional argument REFRESH is non-nil, refresh existing\r\n+images between BEG and END.  This will create new image displays\r\n+only if necessary.\r\n+\r\n+BEG and END define the considered part.  They default to the\r\n+buffer boundaries with possible narrowing.\"\r\n+  (interactive \"P\")\r\n+  (when (display-graphic-p)\r\n+    (when refresh\r\n+      (org-link-preview-clear beg end)\r\n+      (when (fboundp 'clear-image-cache) (clear-image-cache)))\r\n+    (let ((end (or end (point-max))))\r\n+      (org-with-point-at (or beg (point-min))\r\n+\t(let* ((case-fold-search t)\r\n+\t       (file-extension-re (image-file-name-regexp))\r\n+\t       (link-abbrevs (mapcar #'car\r\n+\t\t\t\t     (append org-link-abbrev-alist-local\r\n+\t\t\t\t\t     org-link-abbrev-alist)))\r\n+\t       ;; Check absolute, relative file names and explicit\r\n+\t       ;; \"file:\" links.  Also check link abbreviations since\r\n+\t       ;; some might expand to \"file\" links.\r\n+\t       (file-types-re\r\n+\t\t(format \"\\\\[\\\\[\\\\(?:file%s:\\\\|attachment:\\\\|[.\/~]\\\\)\\\\|\\\\]\\\\[\\\\(<?\\\\(?:file\\\\|attachment\\\\):\\\\)\"\r\n+\t\t\t(if (not link-abbrevs) \"\"\r\n+\t\t\t  (concat \"\\\\|\" (regexp-opt link-abbrevs))))))\r\n+\t  (while (re-search-forward file-types-re end t)\r\n+\t    (let* ((link (org-element-lineage\r\n+\t\t\t  (save-match-data (org-element-context))\r\n+\t\t\t  'link t))\r\n+                   (linktype (org-element-property :type link))\r\n+\t\t   (inner-start (match-beginning 1))\r\n+\t\t   (path\r\n+\t\t    (cond\r\n+\t\t     ;; No link at point; no inline image.\r\n+\t\t     ((not link) nil)\r\n+\t\t     ;; File link without a description.  Also handle\r\n+\t\t     ;; INCLUDE-LINKED here since it should have\r\n+\t\t     ;; precedence over the next case.  I.e., if link\r\n+\t\t     ;; contains filenames in both the path and the\r\n+\t\t     ;; description, prioritize the path only when\r\n+\t\t     ;; INCLUDE-LINKED is non-nil.\r\n+\t\t     ((or (not (org-element-contents-begin link))\r\n+\t\t\t  include-linked)\r\n+\t\t      (and (or (equal \"file\" linktype)\r\n+                               (equal \"attachment\" linktype))\r\n+\t\t\t   (org-element-property :path link)))\r\n+\t\t     ;; Link with a description.  Check if description\r\n+\t\t     ;; is a filename.  Even if Org doesn't have syntax\r\n+\t\t     ;; for those -- clickable image -- constructs, fake\r\n+\t\t     ;; them, as in `org-export-insert-image-links'.\r\n+\t\t     ((not inner-start) nil)\r\n+\t\t     (t\r\n+\t\t      (org-with-point-at inner-start\r\n+\t\t\t(and (looking-at\r\n+\t\t\t      (if (char-equal ?< (char-after inner-start))\r\n+\t\t\t\t  org-link-angle-re\r\n+\t\t\t\torg-link-plain-re))\r\n+\t\t\t     ;; File name must fill the whole\r\n+\t\t\t     ;; description.\r\n+\t\t\t     (= (org-element-contents-end link)\r\n+\t\t\t\t(match-end 0))\r\n+\t\t\t     (progn\r\n+                               (setq linktype (match-string 1))\r\n+                               (match-string 2))))))))\r\n+\t      (when (and path (string-match-p file-extension-re path))\r\n+\t\t(let ((file (if (equal \"attachment\" linktype)\r\n+\t\t\t\t(progn\r\n+                                  (require 'org-attach)\r\n+\t\t\t\t  (ignore-errors (org-attach-expand path)))\r\n+                              (expand-file-name path))))\r\n+                  ;; Expand environment variables.\r\n+                  (when file (setq file (substitute-in-file-name file)))\r\n+\t\t  (when (and file (file-exists-p file))\r\n+\t\t    (let ((width (org-display-inline-image--width link))\r\n+\t\t\t  (align (org-image--align link))\r\n+                          (old (get-char-property-and-overlay\r\n+\t\t\t\t(org-element-begin link)\r\n+\t\t\t\t'org-image-overlay)))\r\n+\t\t      (if (and (car-safe old) refresh)\r\n+                          (image-flush (overlay-get (cdr old) 'display))\r\n+\t\t\t(let ((image (org--create-inline-image file width)))\r\n+\t\t\t  (when image\r\n+\t\t\t    (let ((ov (make-overlay\r\n+\t\t\t\t       (org-element-begin link)\r\n+\t\t\t\t       (progn\r\n+\t\t\t\t\t (goto-char\r\n+\t\t\t\t\t  (org-element-end link))\r\n+\t\t\t\t\t (unless (eolp) (skip-chars-backward \" \\t\"))\r\n+\t\t\t\t\t (point)))))\r\n+                              ;; See bug#59902.  We cannot rely\r\n+                              ;; on Emacs to update image if the file\r\n+                              ;; has changed.\r\n+                              (image-flush image)\r\n+\t\t\t      (overlay-put ov 'display image)\r\n+\t\t\t      (overlay-put ov 'face 'default)\r\n+\t\t\t      (overlay-put ov 'org-image-overlay t)\r\n+\t\t\t      (overlay-put\r\n+\t\t\t       ov 'modification-hooks\r\n+\t\t\t       (list 'org-link-preview--remove-overlay))\r\n+\t\t\t      (when (boundp 'image-map)\r\n+\t\t\t\t(overlay-put ov 'keymap image-map))\r\n+                              (when align\r\n+                                (overlay-put\r\n+                                 ov 'before-string\r\n+                                 (propertize\r\n+                                  \" \" 'face 'default\r\n+                                  'display\r\n+                                  (pcase align\r\n+                                    (\"center\" `(space :align-to (- center (0.5 . ,image))))\r\n+                                    (\"right\"  `(space :align-to (- right ,image)))))))\r\n+\t\t\t      (push ov org-inline-image-overlays))))))))))))))))\r\n+\r\n+(make-obsolete 'org-toggle-inline-images\r\n+               'org-link-preview \"9.8\")\r\n+;; FIXME: Unused; obsoleted; to be removed\r\n+(defun org-toggle-inline-images (&optional include-linked beg end)\r\n+  \"Toggle the display of inline images.\r\n+INCLUDE-LINKED is passed to `org-display-inline-images'.\"\r\n+  (interactive \"P\")\r\n+  (if (org-link-preview--get-overlays beg end)\r\n+      (progn\r\n+        (org-link-preview-clear beg end)\r\n+        (when (called-interactively-p 'interactive)\r\n+\t  (message \"Inline image display turned off\")))\r\n+    (org-display-inline-images include-linked nil beg end)\r\n+    (when (called-interactively-p 'interactive)\r\n+      (let ((new (org-link-preview--get-overlays beg end)))\r\n+        (message (if new\r\n+\t\t     (format \"%d images displayed inline\"\r\n+\t\t\t     (length new))\r\n+\t\t   \"No images to display inline\"))))))\r\n+\r\n+(make-obsolete 'org-redisplay-inline-images\r\n+               'org-link-preview \"9.8\")\r\n+;; FIXME: Unused; obsoleted; to be removed\r\n+(defun org-redisplay-inline-images ()\r\n+  \"Assure display of inline images and refresh them.\"\r\n+  (interactive)\r\n+  (org-toggle-inline-images)\r\n+  (unless org-link-preview-overlays\r\n+    (org-toggle-inline-images)))\r\n+\r\n ;;;; Functions unused in Org core.\r\n (defun org-table-recognize-table.el ()\r\n   \"If there is a table.el table nearby, recognize it and move into it.\"\r\ndiff --git a\/lisp\/org-cycle.el b\/lisp\/org-cycle.el\r\nindex 8a39bdb8c..1a1c916bd 100644\r\n--- a\/lisp\/org-cycle.el\r\n+++ b\/lisp\/org-cycle.el\r\n@@ -40,14 +40,14 @@ (declare-function org-element-property \"org-element-ast\" (property node))\r\n (declare-function org-element-post-affiliated \"org-element\" (node))\r\n (declare-function org-element-lineage \"org-element-ast\" (datum &optional types with-self))\r\n (declare-function org-element-at-point \"org-element\" (&optional pom cached-only))\r\n-(declare-function org-display-inline-images \"org\" (&optional include-linked refresh beg end))\r\n+(declare-function org-link-preview-region \"ol\" (&optional include-linked refresh beg end))\r\n (declare-function org-get-tags \"org\" (&optional pos local fontify))\r\n (declare-function org-subtree-end-visible-p \"org\" ())\r\n (declare-function org-narrow-to-subtree \"org\" (&optional element))\r\n (declare-function org-next-visible-heading \"org\" (arg))\r\n (declare-function org-at-property-p \"org\" ())\r\n (declare-function org-re-property \"org\" (property &optional literal allow-null value))\r\n-(declare-function org-remove-inline-images \"org\" (&optional beg end))\r\n+(declare-function org-link-preview-clear \"ol\" (&optional beg end))\r\n (declare-function org-item-beginning-re \"org\" ())\r\n (declare-function org-at-heading-p \"org\" (&optional invisible-not-ok))\r\n (declare-function org-at-item-p \"org\" ())\r\n@@ -817,19 +817,19 @@ (defun org-cycle-display-inline-images (state)\r\n         ;; If has nested headlines, beg,end only from parent headline\r\n         ;; to first child headline which reference to upper\r\n         ;; let-binding `org-next-visible-heading'.\r\n-        (org-display-inline-images\r\n+        (org-link-preview-region\r\n          nil nil\r\n          (point-min) (progn (org-next-visible-heading 1) (point)))))\r\n       ('subtree\r\n        (org-with-wide-buffer\r\n         (org-narrow-to-subtree)\r\n         ;; If has nested headlines, also inline display images under all sub-headlines.\r\n-        (org-display-inline-images nil nil (point-min) (point-max))))\r\n+        (org-link-preview-region nil nil (point-min) (point-max))))\r\n       ('folded\r\n        (org-with-wide-buffer\r\n         (org-narrow-to-subtree)\r\n         (if (numberp (point-max))\r\n-            (org-remove-inline-images (point-min) (point-max))\r\n+            (org-link-preview-clear (point-min) (point-max))\r\n           (ignore)))))))\r\n \r\n (provide 'org-cycle)\r\ndiff --git a\/lisp\/org-keys.el b\/lisp\/org-keys.el\r\nindex 1daedaae8..77cbe5c0f 100644\r\n--- a\/lisp\/org-keys.el\r\n+++ b\/lisp\/org-keys.el\r\n@@ -218,7 +218,7 @@ (declare-function org-toggle-checkbox \"org\" (&optional toggle-presence))\r\n (declare-function org-toggle-radio-button \"org\" (&optional arg))\r\n (declare-function org-toggle-comment \"org\" ())\r\n (declare-function org-toggle-fixed-width \"org\" ())\r\n-(declare-function org-toggle-inline-images-command \"org\" (&optional arg beg end))\r\n+(declare-function org-link-preview \"ol\" (&optional arg beg end))\r\n (declare-function org-latex-preview \"org\" (&optional arg))\r\n (declare-function org-toggle-narrow-to-subtree \"org\" ())\r\n (declare-function org-toggle-ordered-property \"org\" ())\r\n@@ -618,7 +618,7 @@ (org-defkey org-mode-map (kbd \"C-c C-x C-d\") #'org-clock-display)\r\n (org-defkey org-mode-map (kbd \"C-c C-x x\") #'org-dynamic-block-insert-dblock)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-u\") #'org-dblock-update)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-l\") #'org-latex-preview)\r\n-(org-defkey org-mode-map (kbd \"C-c C-x C-v\") #'org-toggle-inline-images-command)\r\n+(org-defkey org-mode-map (kbd \"C-c C-x C-v\") #'org-link-preview)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-M-v\") #'org-redisplay-inline-images)\r\n (org-defkey org-mode-map (kbd \"C-c C-x \\\\\") #'org-toggle-pretty-entities)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-b\") #'org-toggle-checkbox)\r\ndiff --git a\/lisp\/org-plot.el b\/lisp\/org-plot.el\r\nindex b045344f0..836cfaffc 100644\r\n--- a\/lisp\/org-plot.el\r\n+++ b\/lisp\/org-plot.el\r\n@@ -633,7 +633,7 @@ (defun org-plot\/gnuplot-script (table data-file num-cols params &optional prefac\r\n \r\n (defun org-plot\/redisplay-img-in-buffer (img-file)\r\n   \"Find any overlays for IMG-FILE in the current Org buffer, and refresh them.\"\r\n-  (dolist (img-overlay org-inline-image-overlays)\r\n+  (dolist (img-overlay org-link-preview-overlays)\r\n     (when (string= img-file (plist-get (cdr (overlay-get img-overlay 'display)) :file))\r\n       (when (and (file-exists-p img-file)\r\n                  (fboundp 'image-flush))\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex d5c1dcb35..e5cc9308f 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -5079,7 +5079,7 @@ (define-derived-mode org-mode outline-mode \"Org\"\r\n     ;; modifications to make cache updates work reliably.\r\n     (org-unmodified\r\n      (when org-startup-with-beamer-mode (org-beamer-mode))\r\n-     (when org-startup-with-inline-images (org-display-inline-images))\r\n+     (when org-startup-with-inline-images (org-link-preview '(16)))\r\n      (when org-startup-with-latex-preview (org-latex-preview '(16)))\r\n      (unless org-inhibit-startup-visibility-stuff (org-cycle-set-startup-visibility))\r\n      (when org-startup-truncated (setq truncate-lines t))\r\n@@ -15583,26 +15583,6 @@ (defcustom org-image-actual-width t\r\n \t  (list :tag \"Use #+ATTR* or a number of pixels\" (integer))\r\n \t  (const :tag \"Use #+ATTR* or don't resize\" nil)))\r\n \r\n-(defcustom org-image-max-width 'fill-column\r\n-  \"When non-nil, limit the displayed image width.\r\n-This setting only takes effect when `org-image-actual-width' is set to\r\n-t or when #+ATTR* is set to t.\r\n-\r\n-Possible values:\r\n-- `fill-column' :: limit width to `fill-column'\r\n-- `window'      :: limit width to window width\r\n-- integer       :: limit width to number in pixels\r\n-- float         :: limit width to that fraction of window width\r\n-- nil             :: do not limit image width\"\r\n-  :group 'org-appearance\r\n-  :package-version '(Org . \"9.7\")\r\n-  :type '(choice\r\n-          (const :tag \"Do not limit image width\" nil)\r\n-          (const :tag \"Limit to `fill-column'\" fill-column)\r\n-          (const :tag \"Limit to window width\" window)\r\n-          (integer :tag \"Limit to a number of pixels\")\r\n-          (float :tag \"Limit to a fraction of window width\")))\r\n-\r\n (defcustom org-agenda-inhibit-startup nil\r\n   \"Inhibit startup when preparing agenda buffers.\r\n When this variable is t, the initialization of the Org agenda\r\n@@ -16649,518 +16629,6 @@ (defun org-normalize-color (value)\r\n   (format \"%g\" (\/ value 65535.0)))\r\n \r\n \f\r\n-;; Image display\r\n-\r\n-(defvar-local org-inline-image-overlays nil)\r\n-;; Preserve when switching modes or when restarting Org.\r\n-;; If we clear the overlay list and later enable Or mode, the existing\r\n-;; image overlays will never be cleared by `org-toggle-inline-images'\r\n-;; and `org-toggle-inline-images-command'.\r\n-(put 'org-inline-image-overlays 'permanent-local t)\r\n-\r\n-(defun org--inline-image-overlays (&optional beg end)\r\n-  \"Return image overlays between BEG and END.\"\r\n-  (let* ((beg (or beg (point-min)))\r\n-         (end (or end (point-max)))\r\n-         (overlays (overlays-in beg end))\r\n-         result)\r\n-    (dolist (ov overlays result)\r\n-      (when (memq ov org-inline-image-overlays)\r\n-        (push ov result)))))\r\n-\r\n-(defun org-toggle-inline-images-command (&optional arg beg end)\r\n-  \"Toggle display of inline images without description at point.\r\n-\r\n-When point is at an image link, toggle displaying that image.\r\n-Otherwise, toggle displaying images in current entry.\r\n-\r\n-When region BEG..END is active, toggle displaying images in the\r\n-region.\r\n-\r\n-With numeric prefix ARG 1, display images with description as well.\r\n-\r\n-With prefix ARG `\\\\[universal-argument]', toggle displaying images in\r\n-the accessible portion of the buffer.  With numeric prefix ARG 11, do\r\n-the same, but include images with description.\r\n-\r\n-With prefix ARG `\\\\[universal-argument] \\\\[universal-argument]', hide\r\n-all the images in accessible portion of the buffer.\r\n-\r\n-This command is designed for interactive use.  From Elisp, you can\r\n-also use `org-toggle-inline-images'.\"\r\n-  (interactive (cons current-prefix-arg\r\n-                     (when (use-region-p)\r\n-                       (list (region-beginning) (region-end)))))\r\n-  (let* ((include-linked\r\n-          (cond\r\n-           ((member arg '(nil (4) (16)) ) nil)\r\n-           ((member arg '(1 11)) 'include-linked)\r\n-           (t 'include-linked)))\r\n-         (interactive? (called-interactively-p 'any))\r\n-         (toggle-images\r\n-          (lambda (&optional beg end scope force-remove)\r\n-            (let* ((beg (or beg (point-min)))\r\n-                   (end (or end (point-max)))\r\n-                   (old (org--inline-image-overlays beg end))\r\n-                   (scope (or scope (format \"%d:%d\" beg end))))\r\n-              (if (or old force-remove)\r\n-                  (progn\r\n-                    (org-remove-inline-images beg end)\r\n-                    (when interactive?\r\n-                      (message\r\n-                       \"[%s] Inline image display turned off (removed %d images)\"\r\n-                       scope (length old))))\r\n-\t        (org-display-inline-images include-linked t beg end)\r\n-                (when interactive?\r\n-                  (let ((new (org--inline-image-overlays beg end)))\r\n-                    (message\r\n-                     (if new\r\n-\t\t         (format \"[%s] %d images displayed inline %s\"\r\n-\t\t\t         scope (length new)\r\n-                                 (if include-linked \"(including images with description)\"\r\n-                                   \"\"))\r\n-\t\t       (format \"[%s] No images to display inline\" scope))))))))))\r\n-    (cond\r\n-     ((not (display-graphic-p))\r\n-      (message \"Your Emacs does not support displaying images!\"))\r\n-     ;; Region selected :: toggle images in region.\r\n-     ((and beg end) (funcall toggle-images beg end \"region\"))\r\n-     ;; C-u or C-11 argument :: toggle images in the whole buffer.\r\n-     ((member arg '(11 (4))) (funcall toggle-images nil nil \"buffer\"))\r\n-     ;; C-u C-u argument :: unconditionally hide images in the buffer.\r\n-     ((equal arg '(16)) (funcall toggle-images nil nil \"buffer\" 'remove))\r\n-     ;; Argument nil or 1, no region selected :: toggle (display or hide\r\n-     ;; dwim) images in current section or image link at point.\r\n-     ((and (member arg '(nil 1)) (null beg) (null end))\r\n-      (let ((context (org-element-context)))\r\n-        ;; toggle display of inline image link at point.\r\n-        (if (org-element-type-p context 'link)\r\n-            (funcall toggle-images\r\n-                     (org-element-begin context)\r\n-                     (org-element-end context)\r\n-                     \"image at point\")\r\n-          (let ((beg (if (org-before-first-heading-p) (point-min)\r\n-\t               (save-excursion\r\n-\t                 (org-with-limited-levels (org-back-to-heading t) (point)))))\r\n-                (end (org-with-limited-levels (org-entry-end-position))))\r\n-            (funcall toggle-images beg end \"current section\")))))\r\n-     ;; Any other non-nil argument.\r\n-     ((not (null arg)) (funcall toggle-images beg end \"region\")))))\r\n-\r\n-(defun org-toggle-inline-images (&optional include-linked beg end)\r\n-  \"Toggle the display of inline images.\r\n-INCLUDE-LINKED is passed to `org-display-inline-images'.\"\r\n-  (interactive \"P\")\r\n-  (if (org--inline-image-overlays beg end)\r\n-      (progn\r\n-        (org-remove-inline-images beg end)\r\n-        (when (called-interactively-p 'interactive)\r\n-\t  (message \"Inline image display turned off\")))\r\n-    (org-display-inline-images include-linked nil beg end)\r\n-    (when (called-interactively-p 'interactive)\r\n-      (let ((new (org--inline-image-overlays beg end)))\r\n-        (message (if new\r\n-\t\t     (format \"%d images displayed inline\"\r\n-\t\t\t     (length new))\r\n-\t\t   \"No images to display inline\"))))))\r\n-\r\n-(defun org-redisplay-inline-images ()\r\n-  \"Assure display of inline images and refresh them.\"\r\n-  (interactive)\r\n-  (org-toggle-inline-images)\r\n-  (unless org-inline-image-overlays\r\n-    (org-toggle-inline-images)))\r\n-\r\n-;; For without-x builds.\r\n-(declare-function image-flush \"image\" (spec &optional frame))\r\n-\r\n-(defcustom org-display-remote-inline-images 'skip\r\n-  \"How to display remote inline images.\r\n-Possible values of this option are:\r\n-\r\n-skip        Don't display remote images.\r\n-download    Always download and display remote images.\r\n-t\r\n-cache       Display remote images, and open them in separate buffers\r\n-            for caching.  Silently update the image buffer when a file\r\n-            change is detected.\"\r\n-  :group 'org-appearance\r\n-  :package-version '(Org . \"9.7\")\r\n-  :type '(choice\r\n-\t  (const :tag \"Ignore remote images\" skip)\r\n-\t  (const :tag \"Always display remote images\" download)\r\n-\t  (const :tag \"Display and silently update remote images\" cache))\r\n-  :safe #'symbolp)\r\n-\r\n-(defcustom org-image-align 'left\r\n-  \"How to align images previewed using `org-display-inline-images'.\r\n-\r\n-Only stand-alone image links are affected by this setting.  These\r\n-are links without surrounding text.\r\n-\r\n-Possible values of this option are:\r\n-\r\n-left     Insert image at specified position.\r\n-center   Center image previews.\r\n-right    Right-align image previews.\"\r\n-  :group 'org-appearance\r\n-  :package-version '(Org . \"9.7\")\r\n-  :type '(choice\r\n-          (const :tag \"Left align (or don\\\\='t align) image previews\" left)\r\n-\t  (const :tag \"Center image previews\" center)\r\n-\t  (const :tag \"Right align image previews\" right))\r\n-  :safe #'symbolp)\r\n-\r\n-(defun org--create-inline-image (file width)\r\n-  \"Create image located at FILE, or return nil.\r\n-WIDTH is the width of the image.  The image may not be created\r\n-according to the value of `org-display-remote-inline-images'.\"\r\n-  (let* ((remote? (file-remote-p file))\r\n-\t (file-or-data\r\n-\t  (pcase org-display-remote-inline-images\r\n-\t    ((guard (not remote?)) file)\r\n-\t    (`download (with-temp-buffer\r\n-\t\t\t (set-buffer-multibyte nil)\r\n-\t\t\t (insert-file-contents-literally file)\r\n-\t\t\t (buffer-string)))\r\n-\t    ((or `cache `t)\r\n-             (let ((revert-without-query '(\".\")))\r\n-\t       (with-current-buffer (find-file-noselect file)\r\n-\t\t (buffer-string))))\r\n-\t    (`skip nil)\r\n-\t    (other\r\n-\t     (message \"Invalid value of `org-display-remote-inline-images': %S\"\r\n-\t\t      other)\r\n-\t     nil))))\r\n-    (when file-or-data\r\n-      (create-image file-or-data\r\n-\t\t    (and (image-type-available-p 'imagemagick)\r\n-\t\t\t width\r\n-\t\t\t 'imagemagick)\r\n-\t\t    remote?\r\n-\t\t    :width width\r\n-                    :max-width\r\n-                    (pcase org-image-max-width\r\n-                      (`fill-column (* fill-column (frame-char-width (selected-frame))))\r\n-                      (`window (window-width nil t))\r\n-                      ((pred integerp) org-image-max-width)\r\n-                      ((pred floatp) (floor (* org-image-max-width (window-width nil t))))\r\n-                      (`nil nil)\r\n-                      (_ (error \"Unsupported value of `org-image-max-width': %S\"\r\n-                                org-image-max-width)))\r\n-                    :scale 1))))\r\n-\r\n-(defun org-display-inline-images (&optional include-linked refresh beg end)\r\n-  \"Display inline images.\r\n-\r\n-An inline image is a link which follows either of these\r\n-conventions:\r\n-\r\n-  1. Its path is a file with an extension matching return value\r\n-     from `image-file-name-regexp' and it has no contents.\r\n-\r\n-  2. Its description consists in a single link of the previous\r\n-     type.  In this case, that link must be a well-formed plain\r\n-     or angle link, i.e., it must have an explicit \\\"file\\\" or\r\n-     \\\"attachment\\\" type.\r\n-\r\n-Equip each image with the key-map `image-map'.\r\n-\r\n-When optional argument INCLUDE-LINKED is non-nil, also links with\r\n-a text description part will be inlined.  This can be nice for\r\n-a quick look at those images, but it does not reflect what\r\n-exported files will look like.\r\n-\r\n-When optional argument REFRESH is non-nil, refresh existing\r\n-images between BEG and END.  This will create new image displays\r\n-only if necessary.\r\n-\r\n-BEG and END define the considered part.  They default to the\r\n-buffer boundaries with possible narrowing.\"\r\n-  (interactive \"P\")\r\n-  (when (display-graphic-p)\r\n-    (when refresh\r\n-      (org-remove-inline-images beg end)\r\n-      (when (fboundp 'clear-image-cache) (clear-image-cache)))\r\n-    (let ((end (or end (point-max))))\r\n-      (org-with-point-at (or beg (point-min))\r\n-\t(let* ((case-fold-search t)\r\n-\t       (file-extension-re (image-file-name-regexp))\r\n-\t       (link-abbrevs (mapcar #'car\r\n-\t\t\t\t     (append org-link-abbrev-alist-local\r\n-\t\t\t\t\t     org-link-abbrev-alist)))\r\n-\t       ;; Check absolute, relative file names and explicit\r\n-\t       ;; \"file:\" links.  Also check link abbreviations since\r\n-\t       ;; some might expand to \"file\" links.\r\n-\t       (file-types-re\r\n-\t\t(format \"\\\\[\\\\[\\\\(?:file%s:\\\\|attachment:\\\\|[.\/~]\\\\)\\\\|\\\\]\\\\[\\\\(<?\\\\(?:file\\\\|attachment\\\\):\\\\)\"\r\n-\t\t\t(if (not link-abbrevs) \"\"\r\n-\t\t\t  (concat \"\\\\|\" (regexp-opt link-abbrevs))))))\r\n-\t  (while (re-search-forward file-types-re end t)\r\n-\t    (let* ((link (org-element-lineage\r\n-\t\t\t  (save-match-data (org-element-context))\r\n-\t\t\t  'link t))\r\n-                   (linktype (org-element-property :type link))\r\n-\t\t   (inner-start (match-beginning 1))\r\n-\t\t   (path\r\n-\t\t    (cond\r\n-\t\t     ;; No link at point; no inline image.\r\n-\t\t     ((not link) nil)\r\n-\t\t     ;; File link without a description.  Also handle\r\n-\t\t     ;; INCLUDE-LINKED here since it should have\r\n-\t\t     ;; precedence over the next case.  I.e., if link\r\n-\t\t     ;; contains filenames in both the path and the\r\n-\t\t     ;; description, prioritize the path only when\r\n-\t\t     ;; INCLUDE-LINKED is non-nil.\r\n-\t\t     ((or (not (org-element-contents-begin link))\r\n-\t\t\t  include-linked)\r\n-\t\t      (and (or (equal \"file\" linktype)\r\n-                               (equal \"attachment\" linktype))\r\n-\t\t\t   (org-element-property :path link)))\r\n-\t\t     ;; Link with a description.  Check if description\r\n-\t\t     ;; is a filename.  Even if Org doesn't have syntax\r\n-\t\t     ;; for those -- clickable image -- constructs, fake\r\n-\t\t     ;; them, as in `org-export-insert-image-links'.\r\n-\t\t     ((not inner-start) nil)\r\n-\t\t     (t\r\n-\t\t      (org-with-point-at inner-start\r\n-\t\t\t(and (looking-at\r\n-\t\t\t      (if (char-equal ?< (char-after inner-start))\r\n-\t\t\t\t  org-link-angle-re\r\n-\t\t\t\torg-link-plain-re))\r\n-\t\t\t     ;; File name must fill the whole\r\n-\t\t\t     ;; description.\r\n-\t\t\t     (= (org-element-contents-end link)\r\n-\t\t\t\t(match-end 0))\r\n-\t\t\t     (progn\r\n-                               (setq linktype (match-string 1))\r\n-                               (match-string 2))))))))\r\n-\t      (when (and path (string-match-p file-extension-re path))\r\n-\t\t(let ((file (if (equal \"attachment\" linktype)\r\n-\t\t\t\t(progn\r\n-                                  (require 'org-attach)\r\n-\t\t\t\t  (ignore-errors (org-attach-expand path)))\r\n-                              (expand-file-name path))))\r\n-                  ;; Expand environment variables.\r\n-                  (when file (setq file (substitute-in-file-name file)))\r\n-\t\t  (when (and file (file-exists-p file))\r\n-\t\t    (let ((width (org-display-inline-image--width link))\r\n-\t\t\t  (align (org-image--align link))\r\n-                          (old (get-char-property-and-overlay\r\n-\t\t\t\t(org-element-begin link)\r\n-\t\t\t\t'org-image-overlay)))\r\n-\t\t      (if (and (car-safe old) refresh)\r\n-                          (image-flush (overlay-get (cdr old) 'display))\r\n-\t\t\t(let ((image (org--create-inline-image file width)))\r\n-\t\t\t  (when image\r\n-\t\t\t    (let ((ov (make-overlay\r\n-\t\t\t\t       (org-element-begin link)\r\n-\t\t\t\t       (progn\r\n-\t\t\t\t\t (goto-char\r\n-\t\t\t\t\t  (org-element-end link))\r\n-\t\t\t\t\t (unless (eolp) (skip-chars-backward \" \\t\"))\r\n-\t\t\t\t\t (point)))))\r\n-                              ;; See bug#59902.  We cannot rely\r\n-                              ;; on Emacs to update image if the file\r\n-                              ;; has changed.\r\n-                              (image-flush image)\r\n-\t\t\t      (overlay-put ov 'display image)\r\n-\t\t\t      (overlay-put ov 'face 'default)\r\n-\t\t\t      (overlay-put ov 'org-image-overlay t)\r\n-\t\t\t      (overlay-put\r\n-\t\t\t       ov 'modification-hooks\r\n-\t\t\t       (list 'org-display-inline-remove-overlay))\r\n-\t\t\t      (when (boundp 'image-map)\r\n-\t\t\t\t(overlay-put ov 'keymap image-map))\r\n-                              (when align\r\n-                                (overlay-put\r\n-                                 ov 'before-string\r\n-                                 (propertize\r\n-                                  \" \" 'face 'default\r\n-                                  'display\r\n-                                  (pcase align\r\n-                                    (\"center\" `(space :align-to (- center (0.5 . ,image))))\r\n-                                    (\"right\"  `(space :align-to (- right ,image)))))))\r\n-\t\t\t      (push ov org-inline-image-overlays))))))))))))))))\r\n-\r\n-(declare-function org-export-read-attribute \"ox\"\r\n-                  (attribute element &optional property))\r\n-(defvar visual-fill-column-width) ; Silence compiler warning\r\n-(defun org-display-inline-image--width (link)\r\n-  \"Determine the display width of the image LINK, in pixels.\r\n-- When `org-image-actual-width' is t, the image's pixel width is used.\r\n-- When `org-image-actual-width' is a number, that value will is used.\r\n-- When `org-image-actual-width' is nil or a list, :width attribute of\r\n-  #+attr_org or the first #+attr_...  (if it exists) is used to set the\r\n-  image width.  A width of X% is divided by 100.  If the value is a\r\n-  float between 0 and 2, it interpreted as that proportion of the text\r\n-  width in the buffer.\r\n-\r\n-  If no :width attribute is given and `org-image-actual-width' is a\r\n-  list with a number as the car, then that number is used as the\r\n-  default value.\"\r\n-  ;; Apply `org-image-actual-width' specifications.\r\n-  ;; Support subtree-level property \"ORG-IMAGE-ACTUAL-WIDTH\" specified\r\n-  ;; width.\r\n-  (let ((org-image-actual-width (org-property-or-variable-value 'org-image-actual-width)))\r\n-    (cond\r\n-     ((eq org-image-actual-width t) nil)\r\n-     ((listp org-image-actual-width)\r\n-      (require 'ox)\r\n-      (let* ((par (org-element-lineage link 'paragraph))\r\n-             ;; Try to find an attribute providing a :width.\r\n-             ;; #+ATTR_ORG: :width ...\r\n-             (attr-width (org-export-read-attribute :attr_org par :width))\r\n-             (width-unreadable?\r\n-              (lambda (value)\r\n-                (or (not (stringp value))\r\n-                    (unless (string= value \"t\")\r\n-                      (or (not (string-match\r\n-                              (rx bos (opt \"+\")\r\n-                                  (or\r\n-                                   ;; Number of pixels\r\n-                                   ;; must be a lone number, not\r\n-                                   ;; things like 4in\r\n-                                   (seq (1+ (in \"0-9\")) eos)\r\n-                                   ;; Numbers ending with %\r\n-                                   (seq (1+ (in \"0-9.\")) (group-n 1 \"%\"))\r\n-                                   ;; Fractions\r\n-                                   (seq (0+ (in \"0-9\")) \".\" (1+ (in \"0-9\")))))\r\n-                              value))\r\n-                          (let ((number (string-to-number value)))\r\n-                            (and (floatp number)\r\n-                                 (not (match-string 1 value)) ; X%\r\n-                                 (not (<= 0.0 number 2.0)))))))))\r\n-             ;; #+ATTR_BACKEND: :width ...\r\n-             (attr-other\r\n-              (catch :found\r\n-                (org-element-properties-map\r\n-                 (lambda (prop _)\r\n-                   (when (and\r\n-                          (not (eq prop :attr_org))\r\n-                          (string-match-p \"^:attr_\" (symbol-name prop))\r\n-                          (not (funcall width-unreadable? (org-export-read-attribute prop par :width))))\r\n-                     (throw :found prop)))\r\n-                 par)))\r\n-             (attr-width\r\n-              (if (not (funcall width-unreadable? attr-width))\r\n-                  attr-width\r\n-                ;; When #+attr_org: does not have readable :width\r\n-                (and attr-other\r\n-                     (org-export-read-attribute attr-other par :width))))\r\n-             (width\r\n-              (cond\r\n-               ;; Treat :width t as if `org-image-actual-width' were t.\r\n-               ((string= attr-width \"t\") nil)\r\n-               ;; Fallback to `org-image-actual-width' if no interprable width is given.\r\n-               ((funcall width-unreadable? attr-width)\r\n-                (car org-image-actual-width))\r\n-               ;; Convert numeric widths to numbers, converting percentages.\r\n-               ((string-match-p \"\\\\`[[+]?[0-9.]+%\" attr-width)\r\n-                (\/ (string-to-number attr-width) 100.0))\r\n-               (t (string-to-number attr-width)))))\r\n-        (if (and (floatp width) (<= 0.0 width 2.0))\r\n-            ;; A float in [0,2] should be interpereted as this portion of\r\n-            ;; the text width in the window.  This works well with cases like\r\n-            ;; #+attr_latex: :width 0.X\\{line,page,column,etc.}width,\r\n-            ;; as the \"0.X\" is pulled out as a float.  We use 2 as the upper\r\n-            ;; bound as cases such as 1.2\\linewidth are feasible.\r\n-            (round (* width\r\n-                      (window-pixel-width)\r\n-                      (\/ (or (and (bound-and-true-p visual-fill-column-mode)\r\n-                                  (or visual-fill-column-width auto-fill-function))\r\n-                             (when auto-fill-function fill-column)\r\n-                             (- (window-text-width) (line-number-display-width)))\r\n-                         (float (window-total-width)))))\r\n-          width)))\r\n-     ((numberp org-image-actual-width)\r\n-      org-image-actual-width)\r\n-     (t nil))))\r\n-\r\n-(defun org-image--align (link)\r\n-  \"Determine the alignment of the image LINK.\r\n-LINK is a link object.\r\n-\r\n-In decreasing order of priority, this is controlled:\r\n-- Per image by the value of `:center' or `:align' in the\r\n-affiliated keyword `#+attr_org'.\r\n-- By the `#+attr_html' or `#+attr_latex` keywords with valid\r\n-  `:center' or `:align' values.\r\n-- Globally by the user option `org-image-align'.\r\n-\r\n-The result is either nil or one of the strings \\\"left\\\",\r\n-\\\"center\\\" or \\\"right\\\".\r\n-\r\n-\\\"center\\\" will cause the image preview to be centered, \\\"right\\\"\r\n-will cause it to be right-aligned.  A value of \\\"left\\\" or nil\r\n-implies no special alignment.\"\r\n-  (let ((par (org-element-lineage link 'paragraph)))\r\n-    ;; Only align when image is not surrounded by paragraph text:\r\n-    (when (and par ; when image is not in paragraph, but in table\/headline\/etc, do not align\r\n-               (= (org-element-begin link)\r\n-                  (save-excursion\r\n-                    (goto-char (org-element-contents-begin par))\r\n-                    (skip-chars-forward \"\\t \")\r\n-                    (point)))           ;account for leading space\r\n-                                        ;before link\r\n-               (<= (- (org-element-contents-end par)\r\n-                     (org-element-end link))\r\n-                  1))                  ;account for trailing newline\r\n-                                        ;at end of paragraph\r\n-      (save-match-data\r\n-        ;; Look for a valid \":center t\" or \":align left|center|right\"\r\n-        ;; attribute.\r\n-        ;;\r\n-        ;; An attr_org keyword has the highest priority, with\r\n-        ;; any attr.* next.  Choosing between these is\r\n-        ;; unspecified.\r\n-        (let ((center-re \":\\\\(center\\\\)[[:space:]]+t\\\\b\")\r\n-              (align-re \":align[[:space:]]+\\\\(left\\\\|center\\\\|right\\\\)\\\\b\")\r\n-              attr-align)\r\n-          (catch 'exit\r\n-            (org-element-properties-mapc\r\n-             (lambda (propname propval)\r\n-               (when (and propval\r\n-                          (string-match-p \":attr.*\" (symbol-name propname)))\r\n-                 (setq propval (car-safe propval))\r\n-                 (when (or (string-match center-re propval)\r\n-                           (string-match align-re propval))\r\n-                   (setq attr-align (match-string 1 propval))\r\n-                   (when (eq propname :attr_org)\r\n-                     (throw 'exit t)))))\r\n-             par))\r\n-          (if attr-align\r\n-              (when (member attr-align '(\"center\" \"right\")) attr-align)\r\n-            ;; No image-specific keyword, check global alignment property\r\n-            (when (memq org-image-align '(center right))\r\n-              (symbol-name org-image-align))))))))\r\n-\r\n-\r\n-(defun org-display-inline-remove-overlay (ov after _beg _end &optional _len)\r\n-  \"Remove inline-display overlay if a corresponding region is modified.\"\r\n-  (when (and ov after)\r\n-    (setq org-inline-image-overlays (delete ov org-inline-image-overlays))\r\n-    ;; Clear image from cache to avoid image not updating upon\r\n-    ;; changing on disk.  See Emacs bug#59902.\r\n-    (when (overlay-get ov 'org-image-overlay)\r\n-      (image-flush (overlay-get ov 'display)))\r\n-    (delete-overlay ov)))\r\n-\r\n-(defun org-remove-inline-images (&optional beg end)\r\n-  \"Remove inline display of images.\"\r\n-  (interactive)\r\n-  (let* ((beg (or beg (point-min)))\r\n-         (end (or end (point-max)))\r\n-         (overlays (overlays-in beg end)))\r\n-    (dolist (ov overlays)\r\n-      (when (memq ov org-inline-image-overlays)\r\n-        (setq org-inline-image-overlays (delq ov org-inline-image-overlays))\r\n-        (delete-overlay ov)))\r\n-    ;; Clear removed overlays.\r\n-    (dolist (ov org-inline-image-overlays)\r\n-      (unless (overlay-buffer ov)\r\n-        (setq org-inline-image-overlays (delq ov org-inline-image-overlays))))))\r\n-\r\n (defvar org-self-insert-command-undo-counter 0)\r\n (defvar org-speed-command nil)\r\n \r\ndiff --git a\/testing\/lisp\/test-org-fold.el b\/testing\/lisp\/test-org-fold.el\r\nindex f58642be6..809738f6c 100644\r\n--- a\/testing\/lisp\/test-org-fold.el\r\n+++ b\/testing\/lisp\/test-org-fold.el\r\n@@ -716,14 +716,14 @@ (ert-deftest test-org-fold\/org-fold-display-inline-images ()\r\n       (org-show-subtree)\r\n       (org-fold-subtree t)\r\n       (run-hook-with-args 'org-cycle-hook 'folded)\r\n-      (should-not org-inline-image-overlays)\r\n+      (should-not org-link-preview-overlays)\r\n       (should-not\r\n        (cl-every\r\n         (lambda (ov) (overlay-get ov 'org-image-overlay))\r\n         (overlays-in (point-min) (point-max))))\r\n       (org-show-subtree)\r\n       (run-hook-with-args 'org-cycle-hook 'subtree)\r\n-      (should org-inline-image-overlays)\r\n+      (should org-link-preview-overlays)\r\n       (should\r\n        (cl-every\r\n         (lambda (ov) (overlay-get ov 'org-image-overlay))\r\n-- \r\n2.44.1\r\n\r\n","subject":"Re: [PATCH v4] Inline image display as part of a new org-link-preview system"},{"date":"2024-09-15T13:06:16.198Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87frq13w48.fsf@localhost","message-id":"87frq13w48.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["CA+e5oH-Y=ZBtP3ZGOnU-eGdbNf=9zkWGhs6z0uzXZOmFjwUuUA@mail.gmail.com"],"related-refs":["87frq13w48.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow starting multiple org-timers in sequence (was: Feature mostly complete)"},{"date":"2024-09-09T17:14:42.540Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87zfogpx65.fsf@localhost","message-id":"87zfogpx65.fsf@localhost","config":false,"refs-count":5,"username":"Ihor Radchenko","references":["CABLa6CR2kbN0E2KD97dpr45fyTktLvV6GdWMWQL+bWxi4V9j+A@mail.gmail.com","CABLa6CS+K_RL2dRUM72cn92Gtgw-Mbc4vuNGU6cN47gwqK9eTg@mail.gmail.com","87seujpc7p.fsf@localhost"],"related-refs":["87zfogpx65.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Mark all the tags in HTML export with unique class (was: Adding a class to the auto-inserted <br> elements)"},{"date":"2024-09-07T19:09:12.640Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/877cbn706s.fsf@everybody.org","message-id":"877cbn706s.fsf@everybody.org","config":false,"refs-count":6,"username":"Mark A. Hershberger","related-refs":["877cbn706s.fsf@everybody.org"],"from":"mah@everybody.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] results from org-prepare-dblock make clocktable unusable"},{"date":"2024-09-03T22:32:11.089Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2wmjsgyly.fsf@adamkovic.org","message-id":"m2wmjsgyly.fsf@adamkovic.org","config":false,"refs-count":5,"username":"Rudolf Adamkovi\u010d","references":["20240831203449.31407-1-rudolf@adamkovic.org","87jzfvpb8q.fsf@localhost"],"related-refs":["m2wmjsgyly.fsf@adamkovic.org","m2seqi9k31.fsf@adamkovic.org"],"from":"rudolf@adamkovic.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/m2wmjsgyly.fsf@adamkovic.org","source-id":"emacs-orgmode@gnu.org","patch-body":"From 54ff91953d1a456852506ac162eee2a0cf99d3b0 Mon Sep 17 00:00:00 2001\r\nFrom: Rudolf Adamkovic <rudolf@adamkovic.org>\r\nDate: Sat, 24 Aug 2024 15:26:18 +0200\r\nSubject: [PATCH] ox-texinfo: Support numeric values of `toc' in `#+OPTIONS'\r\n\r\n* etc\/ORG-NEWS (Texinfo exporter now supports numeric =toc= values in\r\n=#+OPTIONS:=): Announce the change.\r\n* lisp\/ox.el (org-export-excluded-from-toc-p): Return nil for all\r\nheadlines that are above the `toc' value in the export `#+OPTIONS'.\r\n(org-export-collect-headlines): Exclude all headlines that are above\r\nthe `toc' value in the export `#+OPTIONS' , using the updated\r\n`org-export-excluded-from-toc-p' function.\r\n* testing\/lisp\/test-ox-texinfo.el\r\n(test-ox-texinfo\/menus-nodes-headings): Add a test.\r\n---\r\n etc\/ORG-NEWS                    |  6 +++\r\n lisp\/ox.el                      | 16 ++++---\r\n testing\/lisp\/test-ox-texinfo.el | 81 +++++++++++++++++++++++++++++++++\r\n 3 files changed, 96 insertions(+), 7 deletions(-)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 392788055..344591ebb 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -223,6 +223,12 @@ This way, attachments will remain accessible when opening symlinked Org file.\r\n When no attach dir exists, Org mode will still prefer creating it in\r\n the \"default\" directory - where the symlink is located.\r\n \r\n+*** Texinfo exporter now considers numeric =toc= values in =#+OPTIONS:=\r\n+\r\n+For example, given =H:3= and =toc:2= in =#+OPTIONS:=, all headings at\r\n+the 1st and 2nd level appear in the table of contents and those at the\r\n+3rd level do not.\r\n+\r\n * Version 9.7\r\n \r\n ** Important announcements and breaking changes\r\ndiff --git a\/lisp\/ox.el b\/lisp\/ox.el\r\nindex 7a0ab4dc7..c16e3acf6 100644\r\n--- a\/lisp\/ox.el\r\n+++ b\/lisp\/ox.el\r\n@@ -5555,12 +5555,10 @@ Footnote sections are ignored.\"\r\n \t\t     (+ (org-export-get-relative-level scope info) n))\r\n \t\t   limit))))\r\n     (org-element-map (org-element-contents scope) 'headline\r\n-      (lambda (h)\r\n-\t(and (not (org-element-property :footnote-section-p h))\r\n-\t     (not (equal \"notoc\"\r\n-\t\t       (org-export-get-node-property :UNNUMBERED h t)))\r\n-\t     (>= n (org-export-get-relative-level h info))\r\n-\t     h))\r\n+      (lambda (headline)\r\n+        (and (not (org-export-excluded-from-toc-p headline info))\r\n+             (>= n (org-export-get-relative-level headline info))\r\n+             headline))\r\n       info)))\r\n \r\n (defun org-export-collect-elements (type info &optional predicate)\r\n@@ -5625,7 +5623,11 @@ contents.  However, it is useful if some additional processing is\r\n required on headlines excluded from table of contents.\"\r\n   (or (org-element-property :footnote-section-p headline)\r\n       (org-export-low-level-p headline info)\r\n-      (equal \"notoc\" (org-export-get-node-property :UNNUMBERED headline t))))\r\n+      (equal \"notoc\" (org-export-get-node-property :UNNUMBERED headline t))\r\n+      (let ((toc-depth (plist-get info :with-toc)))\r\n+        (and (wholenump toc-depth)\r\n+             (> (org-element-property :level headline)\r\n+                toc-depth)))))\r\n \r\n (defun org-export-toc-entry-backend (parent &rest transcoders)\r\n   \"Return an export backend appropriate for table of contents entries.\r\ndiff --git a\/testing\/lisp\/test-ox-texinfo.el b\/testing\/lisp\/test-ox-texinfo.el\r\nindex b16a344e7..fc9b6dabd 100644\r\n--- a\/testing\/lisp\/test-ox-texinfo.el\r\n+++ b\/testing\/lisp\/test-ox-texinfo.el\r\n@@ -345,5 +345,86 @@ body\r\n        (should-not (org-element-contents section))\r\n        (should (eq first-heading (org-element-parent section)))))))\r\n \r\n+\f\r\n+;;; Structure\r\n+\r\n+(ert-deftest test-ox-texinfo\/menus-nodes-headings ()\r\n+  \"Test menus, nodes, and headings.\"\r\n+  (should\r\n+   (org-test-with-temp-text\r\n+       (string-join\r\n+        (list \"#+OPTIONS: H:3 toc:2 num:nil\"\r\n+              \"* Heading 1\"\r\n+              \"** Heading 1-1\"\r\n+              \"*** Heading 1-1-1\"\r\n+              \"*** Heading 1-1-2\"\r\n+              \"** Heading 1-2\"\r\n+              \"*** Heading 1-2-1\"\r\n+              \"*** Heading 1-2-2\"\r\n+              \"* Heading 2\"\r\n+              \"** Heading 2-1\"\r\n+              \"*** Heading 2-1-1\"\r\n+              \"*** Heading 2-1-2\"\r\n+              \"** Heading 2-2\"\r\n+              \"*** Heading 2-2-1\"\r\n+              \"*** Heading 2-2-2\")\r\n+        \"\\n\")\r\n+     (let ((export-buffer \"*Test Texinfo Export*\")\r\n+           (org-export-show-temporary-export-buffer nil))\r\n+       (org-export-to-buffer 'texinfo export-buffer\r\n+         nil nil nil nil nil\r\n+         #'texinfo-mode)\r\n+       (with-current-buffer export-buffer\r\n+         (goto-char (point-min))\r\n+         (and\r\n+          (re-search-forward \"^@menu$\")\r\n+          (re-search-forward \"^* Heading 1::$\")\r\n+          (re-search-forward \"^* Heading 2::$\")\r\n+          (re-search-forward \"^@detailmenu$\")\r\n+          (re-search-forward \"^Heading 1$\")\r\n+          (re-search-forward \"^* Heading 1-1::$\")\r\n+          (re-search-forward \"^* Heading 1-2::$\")\r\n+          (re-search-forward \"^Heading 2$\")\r\n+          (re-search-forward \"^* Heading 2-1::$\")\r\n+          (re-search-forward \"^* Heading 2-2::$\")\r\n+          (re-search-forward \"^@end detailmenu$\")\r\n+          (re-search-forward \"^@end menu$\")\r\n+          (re-search-forward \"^@node Heading 1$\")\r\n+          (re-search-forward \"^@unnumbered Heading 1$\")\r\n+          (re-search-forward \"^@menu$\")\r\n+          (re-search-forward \"^* Heading 1-1::$\")\r\n+          (re-search-forward \"^* Heading 1-2::$\")\r\n+          (re-search-forward \"^@end menu$\")\r\n+          (re-search-forward \"^@node Heading 1-1$\")\r\n+          (re-search-forward \"^@unnumberedsec Heading 1-1$\")\r\n+          (re-search-forward \"^@anchor{Heading 1-1-1}$\")\r\n+          (re-search-forward \"^@subheading Heading 1-1-1$\")\r\n+          (re-search-forward \"^@anchor{Heading 1-1-2}$\")\r\n+          (re-search-forward \"^@subheading Heading 1-1-2$\")\r\n+          (re-search-forward \"^@node Heading 1-2$\")\r\n+          (re-search-forward \"^@unnumberedsec Heading 1-2$\")\r\n+          (re-search-forward \"^@anchor{Heading 1-2-1}$\")\r\n+          (re-search-forward \"^@subheading Heading 1-2-1$\")\r\n+          (re-search-forward \"^@anchor{Heading 1-2-2}$\")\r\n+          (re-search-forward \"^@subheading Heading 1-2-2$\")\r\n+          (re-search-forward \"^@node Heading 2$\")\r\n+          (re-search-forward \"^@unnumbered Heading 2$\")\r\n+          (re-search-forward \"^@menu$\")\r\n+          (re-search-forward \"^* Heading 2-1::$\")\r\n+          (re-search-forward \"^* Heading 2-2::$\")\r\n+          (re-search-forward \"^@end menu$\")\r\n+          (re-search-forward \"^@node Heading 2-1$\")\r\n+          (re-search-forward \"^@unnumberedsec Heading 2-1$\")\r\n+          (re-search-forward \"^@anchor{Heading 2-1-1}$\")\r\n+          (re-search-forward \"^@subheading Heading 2-1-1$\")\r\n+          (re-search-forward \"^@anchor{Heading 2-1-2}$\")\r\n+          (re-search-forward \"^@subheading Heading 2-1-2$\")\r\n+          (re-search-forward \"^@node Heading 2-2$\")\r\n+          (re-search-forward \"^@unnumberedsec Heading 2-2$\")\r\n+          (re-search-forward \"^@anchor{Heading 2-2-1}$\")\r\n+          (re-search-forward \"^@subheading Heading 2-2-1$\")\r\n+          (re-search-forward \"^@anchor{Heading 2-2-2}$\")\r\n+          (re-search-forward \"^@subheading Heading 2-2-2$\")))))))\r\n+\r\n (provide 'test-ox-texinfo)\r\n ;;; test-ox-texinfo.el end here\r\n-- \r\n2.39.3 (Apple Git-146)\r\n\r\n","subject":"Re: [PATCH] ox-texinfo: Support numeric values of `toc' in `#+OPTIONS'"},{"date":"2024-08-31T22:39:22.229Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87h6b09v4o.fsf@gmail.com","message-id":"87h6b09v4o.fsf@gmail.com","config":false,"refs-count":34,"username":"Karthik Chikmagalur","references":["CAL1eYuK5Nc0br3bX0fHU4e=wGd=MmmDPzKYC6VZMUoM6soqQ4Q@mail.gmail.com","875xrqg6cb.fsf@gmail.com","66a8b73b.170a0220.383476.996e@mx.google.com","87r0ajawgj.fsf@localhost","87cym38aj8.fsf@gmail.com","669882e5.050a0220.8ff6d.33c6@mx.google.com","874j70n559.fsf@localhost","87v7zyyvm3.fsf@localhost","87frr07xz8.fsf@gmail.com","64cc9b8a.170a0220.dfa99.2e18@mx.google.com","871q3logb9.fsf@localhost","87msksabld.fsf@gmail.com","87jzfwljkq.fsf@localhost","87msl4wv8d.fsf@localhost","87msz7kym0.fsf@localhost","87il9zgpdp.fsf@localhost","64c905d7.170a0220.f434a.fddb@mx.google.com","87a5h77zb1.fsf@gmail.com","6461a84b.a70a0220.b6d36.5d00@mx.google.com","87o75yhwnu.fsf@localhost","87o7jpoqfl.fsf@localhost"],"related-refs":["87tte7wdpj.fsf@gmail.com","87h68weovw.fsf@gmail.com","87h6b09v4o.fsf@gmail.com","8734lx4twk.fsf@gmail.com","87msimtz88.fsf@gmail.com","87a5enevy5.fsf@gmail.com","87r09rxpjg.fsf@gmail.com","878qw9ak6a.fsf@gmail.com","87cykbfodz.fsf@gmail.com","8734m060ma.fsf@gmail.com"],"from":"karthikchikmagalur@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87h6b09v4o.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From d60d5bef78841d548cfbcdca3a461cb9c52e4314 Mon Sep 17 00:00:00 2001\r\nFrom: Karthik Chikmagalur <karthikchikmagalur@gmail.com>\r\nDate: Fri, 23 Aug 2024 15:46:53 -0700\r\nSubject: [PATCH] org-link: Move inline image display to org-link\r\n\r\nMake inline image previews a part of a more universal org-link\r\npreview feature.  Each link type can now be previewed differently\r\nbased on a new link parameter.\r\n\r\n* lisp\/ol.el (org-link-parameters, org-link-preview-overlays,\r\norg-link-preview--get-overlays, org-link-preview--remove-overlay,\r\norg-link-previeworg-link-preview-region, org-link-preview-clear,\r\norg-link-preview-file): Add new commands `org-link-preview',\r\n`org-link-preview-region' and `org-link-preview-clear' for\r\ncreating link previews for any kind of link.  Add new org-link\r\nparameter `:preview' for specifying how a link type should be\r\npreviewed.  File links and attachments are previewed using inline\r\nimage previews as before.\r\n\r\n* testing\/lisp\/test-org-fold.el: Use `org-link-preview'.\r\n\r\n* lisp\/org.el (org-toggle-inline-images,\r\norg-toggle-inline-images-command, org-display-inline-images,\r\norg--inline-image-overlays, org-inline-image-overlays,\r\norg-redisplay-inline-images, org-image-align,\r\norg-display-inline-remove-overlay, org-remove-inline-images):\r\nObsolete and move `org-toggle-inline-images',\r\n`org-display-inline-images' and `org-redisplay-inline-images' to\r\norg-compat.  These are obsoleted by `org-link-preview' and\r\n`org-link-preview-region'.  Remove\r\n`org-toggle-inline-images-command'.  Move the other internal\r\nfunctions to org-link.\r\n\r\n* lisp\/org-plot.el (org-plot\/redisplay-img-in-buffer): Modify to\r\nuse `org-link-preview'.\r\n\r\n* lisp\/org-keys.el: Bind `C-c C-x C-v' to new command\r\n`org-link-preview', which has the same prefix arg behaviors as\r\n`org-latex-preview'.  In addition to these, it supports numeric\r\nprefix args 1 and 11 to preview links with descriptions at\r\npoint\/region (with 1) and across the buffer (with 11).\r\n\r\n* lisp\/org-cycle.el (org-cycle-display-inline-images): Use\r\n`org-link-preview'.\r\n\r\n* lisp\/org-compat.el (org-display-inline-remove-overlay,\r\norg--inline-image-overlays, org-remove-inline-images,\r\norg-inline-image-overlays, org-display-inline-images,\r\norg-toggle-inline-images):\r\n\r\n* lisp\/org-attach.el: Add new `:preview' link parameter for links\r\nof type \"attachment\".\r\n---\r\n lisp\/ol.el                    | 280 ++++++++++++++++++++++++++++++++-\r\n lisp\/org-attach.el            |  10 +-\r\n lisp\/org-compat.el            | 189 +++++++++++++++++++++++\r\n lisp\/org-cycle.el             |  10 +-\r\n lisp\/org-keys.el              |   4 +-\r\n lisp\/org-plot.el              |   2 +-\r\n lisp\/org.el                   | 283 +---------------------------------\r\n testing\/lisp\/test-org-fold.el |   4 +-\r\n 8 files changed, 489 insertions(+), 293 deletions(-)\r\n\r\ndiff --git a\/lisp\/ol.el b\/lisp\/ol.el\r\nindex 52ea62d69..baed73daa 100644\r\n--- a\/lisp\/ol.el\r\n+++ b\/lisp\/ol.el\r\n@@ -82,6 +82,13 @@ (declare-function org-src-source-buffer \"org-src\" ())\r\n (declare-function org-src-source-type \"org-src\" ())\r\n (declare-function org-time-stamp-format \"org\" (&optional long inactive))\r\n (declare-function outline-next-heading \"outline\" ())\r\n+(declare-function image-flush \"image\" (spec &optional frame))\r\n+(declare-function org-entry-end-position \"org\" ())\r\n+(declare-function org-element-contents-begin \"org-element\" (node))\r\n+(declare-function org-attach-expand \"org-attach\" (file))\r\n+(declare-function org-display-inline-image--width \"org\" (link))\r\n+(declare-function org-image--align \"org\" (link))\r\n+(declare-function org--create-inline-image \"org\" (file width))\r\n \r\n \f\r\n ;;; Customization\r\n@@ -171,6 +178,16 @@ (defcustom org-link-parameters nil\r\n \r\n   The default face is `org-link'.\r\n \r\n+`:preview'\r\n+\r\n+  Function to run to generate an in-buffer preview for the link.  It\r\n+  must accept three arguments:\r\n+  - an overlay placed from the start to the end of the link.\r\n+  - the link path, as a string.\r\n+  - the link element\r\n+\r\n+  This function must return a non-nil value to indicate success.\r\n+\r\n `:help-echo'\r\n \r\n   String or function used as a value for the `help-echo' text\r\n@@ -649,6 +666,13 @@ (defvar org-link--insert-history nil\r\n (defvar org-link--search-failed nil\r\n   \"Non-nil when last link search failed.\")\r\n \r\n+(defvar-local org-link-preview-overlays nil)\r\n+;; Preserve when switching modes or when restarting Org.\r\n+;; If we clear the overlay list and later enable Or mode, the existing\r\n+;; image overlays will never be cleared by `org-link-preview'\r\n+;; and `org-link-preview-clear'.\r\n+(put 'org-link-preview-overlays 'permanent-local t)\r\n+\r\n \f\r\n ;;; Internal Functions\r\n \r\n@@ -881,6 +905,30 @@ (defun org-link--file-link-to-here ()\r\n          (setq desc search-desc))))\r\n     (cons link desc)))\r\n \r\n+(defun org-link-preview--get-overlays (&optional beg end)\r\n+  \"Return link preview overlays between BEG and END.\"\r\n+  (let* ((beg (or beg (point-min)))\r\n+         (end (or end (point-max)))\r\n+         (overlays (overlays-in beg end))\r\n+         result)\r\n+    (dolist (ov overlays result)\r\n+      (when (memq ov org-link-preview-overlays)\r\n+        (push ov result)))))\r\n+\r\n+(defun org-link-preview--remove-overlay (ov after _beg _end &optional _len)\r\n+  \"Remove link-preview overlay OV if a corresponding region is modified.\r\n+\r\n+AFTER is true when this function is called post-change.\"\r\n+  (when (and ov after)\r\n+    (setq org-link-preview-overlays (delete ov org-link-preview-overlays))\r\n+    ;; Clear image from cache to avoid image not updating upon\r\n+    ;; changing on disk.  See Emacs bug#59902.\r\n+    (when-let* (((overlay-get ov 'org-image-overlay))\r\n+                (disp (overlay-get ov 'display))\r\n+                ((imagep disp)))\r\n+      (image-flush disp))\r\n+    (delete-overlay ov)))\r\n+\r\n \f\r\n ;;; Public API\r\n \r\n@@ -1573,6 +1621,194 @@ (defun org-link-add-angle-brackets (s)\r\n   (unless (equal (substring s -1) \">\") (setq s (concat s \">\")))\r\n   s)\r\n \r\n+;;;###autoload\r\n+(defun org-link-preview (&optional arg beg end)\r\n+  \"Toggle display of link previews in the buffer.\r\n+\r\n+When region BEG..END is active, preview links in the\r\n+region.\r\n+\r\n+When point is at a link, display a preview for that link only.\r\n+Otherwise, display previews for links in current entry.\r\n+\r\n+With numeric prefix ARG 1, preview links with description as\r\n+well.\r\n+\r\n+With prefix ARG `\\\\[universal-argument]', clear link previews at\r\n+point or in the current entry.\r\n+\r\n+With prefix ARG `\\\\[universal-argument] \\\\[universal-argument]',\r\n+ display link previews in the accessible portion of the\r\n+ buffer.  With numeric prefix ARG 11, do the same, but include\r\n+ links with descriptions.\r\n+\r\n+With prefix ARG `\\\\[universal-argument] \\\\[universal-argument] \\\\[universal-argument]',\r\n+hide all link previews in the accessible portion of the buffer.\r\n+\r\n+This command is designed for interactive use.  From Elisp, you can\r\n+also use `org-link-preview-region'.\"\r\n+  (interactive (cons current-prefix-arg\r\n+                     (when (use-region-p)\r\n+                       (list (region-beginning) (region-end)))))\r\n+  (let* ((include-linked\r\n+          (cond\r\n+           ((member arg '(nil (4) (16)) ) nil)\r\n+           ((member arg '(1 11)) 'include-linked)\r\n+           (t 'include-linked)))\r\n+         (interactive? (called-interactively-p 'any))\r\n+         (toggle-previews\r\n+          (lambda (&optional beg end scope remove)\r\n+            (let* ((beg (or beg (point-min)))\r\n+                   (end (or end (point-max)))\r\n+                   (old (org-link-preview--get-overlays beg end))\r\n+                   (scope (or scope (format \"%d:%d\" beg end))))\r\n+              (if remove\r\n+                  (progn\r\n+                    (org-link-preview-clear beg end)\r\n+                    (when interactive?\r\n+                      (message\r\n+                       \"[%s] Inline link previews turned off (removed %d images)\"\r\n+                       scope (length old))))\r\n+\t        (org-link-preview-region include-linked t beg end)\r\n+                (when interactive?\r\n+                  (let ((new (org-link-preview--get-overlays beg end)))\r\n+                    (message\r\n+                     (if new\r\n+\t\t         (format \"[%s] %d images displayed inline %s\"\r\n+\t\t\t         scope (length new)\r\n+                                 (if include-linked \"(including images with description)\"\r\n+                                   \"\"))\r\n+\t\t       (format \"[%s] No images to display inline\" scope))))))))))\r\n+    (cond\r\n+     ;; Region selected :: display previews in region.\r\n+     ((and beg end)\r\n+      (funcall toggle-previews beg end \"region\"\r\n+               (and (equal arg '(4)) 'remove)))\r\n+     ;; C-u argument: clear image at point or in entry\r\n+     ((equal arg '(4))\r\n+      (if (get-char-property (point) 'org-image-overlay)\r\n+          ;; clear link preview at point\r\n+          (when-let ((context (org-element-context))\r\n+                     ((org-element-type-p context 'link)))\r\n+            (funcall toggle-previews\r\n+                     (org-element-begin context)\r\n+                     (org-element-end context)\r\n+                     \"preview at point\" 'remove))\r\n+        ;; Clear link previews in entry\r\n+        (funcall toggle-previews\r\n+                 (if (org-before-first-heading-p) (point-min)\r\n+                   (save-excursion\r\n+                     (org-with-limited-levels (org-back-to-heading t) (point))))\r\n+                 (org-with-limited-levels (org-entry-end-position))\r\n+                 \"current section\" 'remove)))\r\n+     ;; C-u C-u or C-11 argument :: display images in the whole buffer.\r\n+     ((member arg '(11 (16))) (funcall toggle-previews nil nil \"buffer\"))\r\n+     ;; C-u C-u C-u argument :: unconditionally hide images in the buffer.\r\n+     ((equal arg '(64)) (funcall toggle-previews nil nil \"buffer\" 'remove))\r\n+     ;; Argument nil or 1, no region selected :: display images in\r\n+     ;; current section or image link at point.\r\n+     ((and (member arg '(nil 1)) (null beg) (null end))\r\n+      (let ((context (org-element-context)))\r\n+        ;; toggle display of inline image link at point.\r\n+        (if (org-element-type-p context 'link)\r\n+            (let* ((ov (cdr-safe (get-char-property-and-overlay\r\n+                                  (point) 'org-image-overlay)))\r\n+                   (remove? (and ov (memq ov org-link-preview-overlays)\r\n+                                 'remove)))\r\n+              (funcall toggle-previews\r\n+                       (org-element-begin context)\r\n+                       (org-element-end context)\r\n+                       \"image at point\" remove?))\r\n+          (let ((beg (if (org-before-first-heading-p) (point-min)\r\n+\t               (save-excursion\r\n+\t                 (org-with-limited-levels (org-back-to-heading t) (point)))))\r\n+                (end (org-with-limited-levels (org-entry-end-position))))\r\n+            (funcall toggle-previews beg end \"current section\")))))\r\n+     ;; Any other non-nil argument.\r\n+     ((not (null arg)) (funcall toggle-previews beg end \"region\")))))\r\n+\r\n+(defun org-link-preview-region (&optional include-linked refresh beg end)\r\n+  \"Display link previews.\r\n+\r\n+A previewable link type is one that has a `:preview' link\r\n+parameter, see `org-link-parameters'.\r\n+\r\n+By default, a file link or attachment is previewable if it\r\n+follows either of these conventions:\r\n+\r\n+  1. Its path is a file with an extension matching return value\r\n+     from `image-file-name-regexp' and it has no contents.\r\n+\r\n+  2. Its description consists in a single link of the previous\r\n+     type.  In this case, that link must be a well-formed plain\r\n+     or angle link, i.e., it must have an explicit \\\"file\\\" or\r\n+     \\\"attachment\\\" type.\r\n+\r\n+File links are equipped with the keymap `image-map'.\r\n+\r\n+When optional argument INCLUDE-LINKED is non-nil, links with a\r\n+text description part will also be inlined.  This can be nice for\r\n+a quick look at those images, but it does not reflect what\r\n+exported files will look like.\r\n+\r\n+When optional argument REFRESH is non-nil, refresh existing\r\n+images between BEG and END.  This will create new image displays\r\n+only if necessary.\r\n+\r\n+BEG and END define the considered part.  They default to the\r\n+buffer boundaries with possible narrowing.\"\r\n+  (interactive \"P\")\r\n+  (when (display-graphic-p)\r\n+    (when refresh (org-link-preview-clear beg end))\r\n+    (when (fboundp 'clear-image-cache) (clear-image-cache)))\r\n+  (org-with-point-at (or beg (point-min))\r\n+    (let ((case-fold-search t))\r\n+      (while (re-search-forward org-link-any-re end t)\r\n+        (when-let* ((link (org-element-lineage\r\n+                           (save-match-data (org-element-context))\r\n+                           'link t))\r\n+                    (linktype (org-element-property :type link))\r\n+                    (preview-func (org-link-get-parameter linktype :preview))\r\n+                    (path (and (or include-linked\r\n+                                   (not (org-element-contents-begin link)))\r\n+                               (org-element-property :path link))))\r\n+          ;; Create an overlay to hold the preview\r\n+          (let ((ov (make-overlay\r\n+                     (org-element-begin link)\r\n+                     (progn\r\n+\t\t       (goto-char\r\n+\t\t\t(org-element-end link))\r\n+\t\t       (unless (eolp) (skip-chars-backward \" \\t\"))\r\n+\t\t       (point)))))\r\n+            ;; TODO: Change this overlay property to `org-link-preview' everywhere.\r\n+            (overlay-put ov 'org-image-overlay t)\r\n+            (overlay-put ov 'modification-hooks\r\n+                         (list 'org-link-preview--remove-overlay))\r\n+            ;; call preview function for link type\r\n+            (if (funcall preview-func ov path link)\r\n+              (when (overlay-buffer ov)\r\n+                (push ov org-link-preview-overlays))\r\n+              ;; Preview was unsuccessful, delete overlay\r\n+              (delete-overlay ov))))))))\r\n+\r\n+(defun org-link-preview-clear (&optional beg end)\r\n+  \"Clear link previews in region BEG to END.\"\r\n+  (interactive (and (use-region-p) (list (region-beginning) (region-end))))\r\n+  (let* ((beg (or beg (point-min)))\r\n+         (end (or end (point-max)))\r\n+         (overlays (overlays-in beg end)))\r\n+    (dolist (ov overlays)\r\n+      (when (memq ov org-link-preview-overlays)\r\n+        (when-let ((image (overlay-get ov 'display))\r\n+                   ((imagep image)))\r\n+          (image-flush image))\r\n+        (setq org-link-preview-overlays (delq ov org-link-preview-overlays))\r\n+        (delete-overlay ov)))\r\n+    ;; Clear removed overlays.\r\n+    (dolist (ov org-link-preview-overlays)\r\n+      (unless (overlay-buffer ov)\r\n+        (setq org-link-preview-overlays (delq ov org-link-preview-overlays))))))\r\n+\r\n \f\r\n ;;; Built-in link types\r\n \r\n@@ -1595,7 +1831,49 @@ (defun org-link--open-elisp (path _)\r\n (org-link-set-parameters \"elisp\" :follow #'org-link--open-elisp)\r\n \r\n ;;;; \"file\" link type\r\n-(org-link-set-parameters \"file\" :complete #'org-link-complete-file)\r\n+(org-link-set-parameters \"file\"\r\n+                         :complete #'org-link-complete-file\r\n+                         :preview #'org-link-preview-file)\r\n+\r\n+(defun org-link-preview-file (ov path link)\r\n+  \"Display image file PATH in overlay OV for LINK.\r\n+\r\n+LINK is the Org element being previewed.\r\n+\r\n+Equip each image with the keymap `image-map'.\r\n+\r\n+This is intended to be used as the `:preview' link property of\r\n+file links, see `org-link-parameters'.\"\r\n+  (if (not (display-graphic-p))\r\n+      (prog1 nil\r\n+        (message \"Your Emacs does not support displaying images!\"))\r\n+    (when-let* ((file-full (expand-file-name path))\r\n+                (file (substitute-in-file-name file-full))\r\n+                ((string-match-p (image-file-name-regexp) file))\r\n+                ((file-exists-p file)))\r\n+      (let* ((width (org-display-inline-image--width link))\r\n+\t     (align (org-image--align link))\r\n+             (image (org--create-inline-image file width)))\r\n+        (when image            ; Add image to overlay\r\n+\t  ;; See bug#59902.  We cannot rely\r\n+          ;; on Emacs to update image if the file\r\n+          ;; has changed.\r\n+          (image-flush image)\r\n+\t  (overlay-put ov 'display image)\r\n+\t  (overlay-put ov 'face 'default)\r\n+\t  (overlay-put ov 'org-image-overlay t)\r\n+\t  (when (boundp 'image-map)\r\n+\t    (overlay-put ov 'keymap image-map))\r\n+          (when align\r\n+            (overlay-put\r\n+             ov 'before-string\r\n+             (propertize\r\n+              \" \" 'face 'default\r\n+              'display\r\n+              (pcase align\r\n+                (\"center\" `(space :align-to (- center (0.5 . ,image))))\r\n+                (\"right\"  `(space :align-to (- right ,image)))))))\r\n+          t)))))\r\n \r\n ;;;; \"help\" link type\r\n (defun org-link--open-help (path _)\r\ndiff --git a\/lisp\/org-attach.el b\/lisp\/org-attach.el\r\nindex 7a03d170e..4b0887fcd 100644\r\n--- a\/lisp\/org-attach.el\r\n+++ b\/lisp\/org-attach.el\r\n@@ -797,9 +797,17 @@ (defun org-attach-follow (file arg)\r\n See `org-open-file' for details about ARG.\"\r\n   (org-link-open-as-file (org-attach-expand file) arg))\r\n \r\n+(defun org-attach-preview-file (ov path link)\r\n+  \"Preview attachment with PATH in overlay OV.\r\n+\r\n+LINK is the Org link element being previewed.\"\r\n+  (org-link-preview-file\r\n+   ov (org-attach-expand path) link))\r\n+\r\n (org-link-set-parameters \"attachment\"\r\n \t\t\t :follow #'org-attach-follow\r\n-                         :complete #'org-attach-complete-link)\r\n+                         :complete #'org-attach-complete-link\r\n+                         :preview #'org-attach-preview-file)\r\n \r\n (defun org-attach-complete-link ()\r\n   \"Advise the user with the available files in the attachment directory.\"\r\ndiff --git a\/lisp\/org-compat.el b\/lisp\/org-compat.el\r\nindex d843216f3..242b46a86 100644\r\n--- a\/lisp\/org-compat.el\r\n+++ b\/lisp\/org-compat.el\r\n@@ -783,6 +783,195 @@ (defun org-add-link-type (type &optional follow export)\r\n \r\n (make-obsolete 'org-add-link-type \"use `org-link-set-parameters' instead.\" \"9.0\")\r\n \r\n+(declare-function org-link-preview--remove-overlay \"ol\")\r\n+(declare-function org-link-preview--get-overlays \"ol\")\r\n+(declare-function org-link-preview-clear \"ol\")\r\n+(declare-function org-link-preview--remove-overlay \"ol\")\r\n+\r\n+(define-obsolete-function-alias 'org-display-inline-remove-overlay\r\n+  'org-link-preview--remove-overlay \"9.8\")\r\n+(define-obsolete-function-alias 'org--inline-image-overlays\r\n+  'org-link-preview--get-overlays \"9.8\")\r\n+(define-obsolete-function-alias 'org-remove-inline-images\r\n+  'org-link-preview-clear \"9.8\")\r\n+(define-obsolete-variable-alias 'org-inline-image-overlays\r\n+  'org-link-preview-overlays \"9.8\")\r\n+(defvar org-link-preview-overlays)\r\n+(defvar org-link-abbrev-alist-local)\r\n+(defvar org-link-abbrev-alist)\r\n+(defvar org-link-angle-re)\r\n+(defvar org-link-plain-re)\r\n+(declare-function org-attach-expand \"org-attach\")\r\n+(declare-function org-display-inline-image--width \"org\")\r\n+(declare-function org-image--align \"org\")\r\n+(declare-function org--create-inline-image \"org\")\r\n+\r\n+(make-obsolete 'org-display-inline-images\r\n+               'org-link-preview-region \"9.8\")\r\n+;; FIXME: Unused; obsoleted; to be removed\r\n+(defun org-display-inline-images (&optional include-linked refresh beg end)\r\n+  \"Display inline images.\r\n+\r\n+An inline image is a link which follows either of these\r\n+conventions:\r\n+\r\n+  1. Its path is a file with an extension matching return value\r\n+     from `image-file-name-regexp' and it has no contents.\r\n+\r\n+  2. Its description consists in a single link of the previous\r\n+     type.  In this case, that link must be a well-formed plain\r\n+     or angle link, i.e., it must have an explicit \\\"file\\\" or\r\n+     \\\"attachment\\\" type.\r\n+\r\n+Equip each image with the key-map `image-map'.\r\n+\r\n+When optional argument INCLUDE-LINKED is non-nil, also links with\r\n+a text description part will be inlined.  This can be nice for\r\n+a quick look at those images, but it does not reflect what\r\n+exported files will look like.\r\n+\r\n+When optional argument REFRESH is non-nil, refresh existing\r\n+images between BEG and END.  This will create new image displays\r\n+only if necessary.\r\n+\r\n+BEG and END define the considered part.  They default to the\r\n+buffer boundaries with possible narrowing.\"\r\n+  (interactive \"P\")\r\n+  (when (display-graphic-p)\r\n+    (when refresh\r\n+      (org-link-preview-clear beg end)\r\n+      (when (fboundp 'clear-image-cache) (clear-image-cache)))\r\n+    (let ((end (or end (point-max))))\r\n+      (org-with-point-at (or beg (point-min))\r\n+\t(let* ((case-fold-search t)\r\n+\t       (file-extension-re (image-file-name-regexp))\r\n+\t       (link-abbrevs (mapcar #'car\r\n+\t\t\t\t     (append org-link-abbrev-alist-local\r\n+\t\t\t\t\t     org-link-abbrev-alist)))\r\n+\t       ;; Check absolute, relative file names and explicit\r\n+\t       ;; \"file:\" links.  Also check link abbreviations since\r\n+\t       ;; some might expand to \"file\" links.\r\n+\t       (file-types-re\r\n+\t\t(format \"\\\\[\\\\[\\\\(?:file%s:\\\\|attachment:\\\\|[.\/~]\\\\)\\\\|\\\\]\\\\[\\\\(<?\\\\(?:file\\\\|attachment\\\\):\\\\)\"\r\n+\t\t\t(if (not link-abbrevs) \"\"\r\n+\t\t\t  (concat \"\\\\|\" (regexp-opt link-abbrevs))))))\r\n+\t  (while (re-search-forward file-types-re end t)\r\n+\t    (let* ((link (org-element-lineage\r\n+\t\t\t  (save-match-data (org-element-context))\r\n+\t\t\t  'link t))\r\n+                   (linktype (org-element-property :type link))\r\n+\t\t   (inner-start (match-beginning 1))\r\n+\t\t   (path\r\n+\t\t    (cond\r\n+\t\t     ;; No link at point; no inline image.\r\n+\t\t     ((not link) nil)\r\n+\t\t     ;; File link without a description.  Also handle\r\n+\t\t     ;; INCLUDE-LINKED here since it should have\r\n+\t\t     ;; precedence over the next case.  I.e., if link\r\n+\t\t     ;; contains filenames in both the path and the\r\n+\t\t     ;; description, prioritize the path only when\r\n+\t\t     ;; INCLUDE-LINKED is non-nil.\r\n+\t\t     ((or (not (org-element-contents-begin link))\r\n+\t\t\t  include-linked)\r\n+\t\t      (and (or (equal \"file\" linktype)\r\n+                               (equal \"attachment\" linktype))\r\n+\t\t\t   (org-element-property :path link)))\r\n+\t\t     ;; Link with a description.  Check if description\r\n+\t\t     ;; is a filename.  Even if Org doesn't have syntax\r\n+\t\t     ;; for those -- clickable image -- constructs, fake\r\n+\t\t     ;; them, as in `org-export-insert-image-links'.\r\n+\t\t     ((not inner-start) nil)\r\n+\t\t     (t\r\n+\t\t      (org-with-point-at inner-start\r\n+\t\t\t(and (looking-at\r\n+\t\t\t      (if (char-equal ?< (char-after inner-start))\r\n+\t\t\t\t  org-link-angle-re\r\n+\t\t\t\torg-link-plain-re))\r\n+\t\t\t     ;; File name must fill the whole\r\n+\t\t\t     ;; description.\r\n+\t\t\t     (= (org-element-contents-end link)\r\n+\t\t\t\t(match-end 0))\r\n+\t\t\t     (progn\r\n+                               (setq linktype (match-string 1))\r\n+                               (match-string 2))))))))\r\n+\t      (when (and path (string-match-p file-extension-re path))\r\n+\t\t(let ((file (if (equal \"attachment\" linktype)\r\n+\t\t\t\t(progn\r\n+                                  (require 'org-attach)\r\n+\t\t\t\t  (ignore-errors (org-attach-expand path)))\r\n+                              (expand-file-name path))))\r\n+                  ;; Expand environment variables.\r\n+                  (when file (setq file (substitute-in-file-name file)))\r\n+\t\t  (when (and file (file-exists-p file))\r\n+\t\t    (let ((width (org-display-inline-image--width link))\r\n+\t\t\t  (align (org-image--align link))\r\n+                          (old (get-char-property-and-overlay\r\n+\t\t\t\t(org-element-begin link)\r\n+\t\t\t\t'org-image-overlay)))\r\n+\t\t      (if (and (car-safe old) refresh)\r\n+                          (image-flush (overlay-get (cdr old) 'display))\r\n+\t\t\t(let ((image (org--create-inline-image file width)))\r\n+\t\t\t  (when image\r\n+\t\t\t    (let ((ov (make-overlay\r\n+\t\t\t\t       (org-element-begin link)\r\n+\t\t\t\t       (progn\r\n+\t\t\t\t\t (goto-char\r\n+\t\t\t\t\t  (org-element-end link))\r\n+\t\t\t\t\t (unless (eolp) (skip-chars-backward \" \\t\"))\r\n+\t\t\t\t\t (point)))))\r\n+                              ;; See bug#59902.  We cannot rely\r\n+                              ;; on Emacs to update image if the file\r\n+                              ;; has changed.\r\n+                              (image-flush image)\r\n+\t\t\t      (overlay-put ov 'display image)\r\n+\t\t\t      (overlay-put ov 'face 'default)\r\n+\t\t\t      (overlay-put ov 'org-image-overlay t)\r\n+\t\t\t      (overlay-put\r\n+\t\t\t       ov 'modification-hooks\r\n+\t\t\t       (list 'org-link-preview--remove-overlay))\r\n+\t\t\t      (when (boundp 'image-map)\r\n+\t\t\t\t(overlay-put ov 'keymap image-map))\r\n+                              (when align\r\n+                                (overlay-put\r\n+                                 ov 'before-string\r\n+                                 (propertize\r\n+                                  \" \" 'face 'default\r\n+                                  'display\r\n+                                  (pcase align\r\n+                                    (\"center\" `(space :align-to (- center (0.5 . ,image))))\r\n+                                    (\"right\"  `(space :align-to (- right ,image)))))))\r\n+\t\t\t      (push ov org-inline-image-overlays))))))))))))))))\r\n+\r\n+(make-obsolete 'org-toggle-inline-images\r\n+               'org-link-preview \"9.8\")\r\n+;; FIXME: Unused; obsoleted; to be removed\r\n+(defun org-toggle-inline-images (&optional include-linked beg end)\r\n+  \"Toggle the display of inline images.\r\n+INCLUDE-LINKED is passed to `org-display-inline-images'.\"\r\n+  (interactive \"P\")\r\n+  (if (org-link-preview--get-overlays beg end)\r\n+      (progn\r\n+        (org-link-preview-clear beg end)\r\n+        (when (called-interactively-p 'interactive)\r\n+\t  (message \"Inline image display turned off\")))\r\n+    (org-display-inline-images include-linked nil beg end)\r\n+    (when (called-interactively-p 'interactive)\r\n+      (let ((new (org-link-preview--get-overlays beg end)))\r\n+        (message (if new\r\n+\t\t     (format \"%d images displayed inline\"\r\n+\t\t\t     (length new))\r\n+\t\t   \"No images to display inline\"))))))\r\n+\r\n+(make-obsolete 'org-redisplay-inline-images\r\n+               'org-link-preview \"9.8\")\r\n+;; FIXME: Unused; obsoleted; to be removed\r\n+(defun org-redisplay-inline-images ()\r\n+  \"Assure display of inline images and refresh them.\"\r\n+  (interactive)\r\n+  (org-toggle-inline-images)\r\n+  (unless org-link-preview-overlays\r\n+    (org-toggle-inline-images)))\r\n+\r\n ;;;; Functions unused in Org core.\r\n (defun org-table-recognize-table.el ()\r\n   \"If there is a table.el table nearby, recognize it and move into it.\"\r\ndiff --git a\/lisp\/org-cycle.el b\/lisp\/org-cycle.el\r\nindex 8a39bdb8c..1a1c916bd 100644\r\n--- a\/lisp\/org-cycle.el\r\n+++ b\/lisp\/org-cycle.el\r\n@@ -40,14 +40,14 @@ (declare-function org-element-property \"org-element-ast\" (property node))\r\n (declare-function org-element-post-affiliated \"org-element\" (node))\r\n (declare-function org-element-lineage \"org-element-ast\" (datum &optional types with-self))\r\n (declare-function org-element-at-point \"org-element\" (&optional pom cached-only))\r\n-(declare-function org-display-inline-images \"org\" (&optional include-linked refresh beg end))\r\n+(declare-function org-link-preview-region \"ol\" (&optional include-linked refresh beg end))\r\n (declare-function org-get-tags \"org\" (&optional pos local fontify))\r\n (declare-function org-subtree-end-visible-p \"org\" ())\r\n (declare-function org-narrow-to-subtree \"org\" (&optional element))\r\n (declare-function org-next-visible-heading \"org\" (arg))\r\n (declare-function org-at-property-p \"org\" ())\r\n (declare-function org-re-property \"org\" (property &optional literal allow-null value))\r\n-(declare-function org-remove-inline-images \"org\" (&optional beg end))\r\n+(declare-function org-link-preview-clear \"ol\" (&optional beg end))\r\n (declare-function org-item-beginning-re \"org\" ())\r\n (declare-function org-at-heading-p \"org\" (&optional invisible-not-ok))\r\n (declare-function org-at-item-p \"org\" ())\r\n@@ -817,19 +817,19 @@ (defun org-cycle-display-inline-images (state)\r\n         ;; If has nested headlines, beg,end only from parent headline\r\n         ;; to first child headline which reference to upper\r\n         ;; let-binding `org-next-visible-heading'.\r\n-        (org-display-inline-images\r\n+        (org-link-preview-region\r\n          nil nil\r\n          (point-min) (progn (org-next-visible-heading 1) (point)))))\r\n       ('subtree\r\n        (org-with-wide-buffer\r\n         (org-narrow-to-subtree)\r\n         ;; If has nested headlines, also inline display images under all sub-headlines.\r\n-        (org-display-inline-images nil nil (point-min) (point-max))))\r\n+        (org-link-preview-region nil nil (point-min) (point-max))))\r\n       ('folded\r\n        (org-with-wide-buffer\r\n         (org-narrow-to-subtree)\r\n         (if (numberp (point-max))\r\n-            (org-remove-inline-images (point-min) (point-max))\r\n+            (org-link-preview-clear (point-min) (point-max))\r\n           (ignore)))))))\r\n \r\n (provide 'org-cycle)\r\ndiff --git a\/lisp\/org-keys.el b\/lisp\/org-keys.el\r\nindex 1daedaae8..77cbe5c0f 100644\r\n--- a\/lisp\/org-keys.el\r\n+++ b\/lisp\/org-keys.el\r\n@@ -218,7 +218,7 @@ (declare-function org-toggle-checkbox \"org\" (&optional toggle-presence))\r\n (declare-function org-toggle-radio-button \"org\" (&optional arg))\r\n (declare-function org-toggle-comment \"org\" ())\r\n (declare-function org-toggle-fixed-width \"org\" ())\r\n-(declare-function org-toggle-inline-images-command \"org\" (&optional arg beg end))\r\n+(declare-function org-link-preview \"ol\" (&optional arg beg end))\r\n (declare-function org-latex-preview \"org\" (&optional arg))\r\n (declare-function org-toggle-narrow-to-subtree \"org\" ())\r\n (declare-function org-toggle-ordered-property \"org\" ())\r\n@@ -618,7 +618,7 @@ (org-defkey org-mode-map (kbd \"C-c C-x C-d\") #'org-clock-display)\r\n (org-defkey org-mode-map (kbd \"C-c C-x x\") #'org-dynamic-block-insert-dblock)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-u\") #'org-dblock-update)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-l\") #'org-latex-preview)\r\n-(org-defkey org-mode-map (kbd \"C-c C-x C-v\") #'org-toggle-inline-images-command)\r\n+(org-defkey org-mode-map (kbd \"C-c C-x C-v\") #'org-link-preview)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-M-v\") #'org-redisplay-inline-images)\r\n (org-defkey org-mode-map (kbd \"C-c C-x \\\\\") #'org-toggle-pretty-entities)\r\n (org-defkey org-mode-map (kbd \"C-c C-x C-b\") #'org-toggle-checkbox)\r\ndiff --git a\/lisp\/org-plot.el b\/lisp\/org-plot.el\r\nindex b045344f0..836cfaffc 100644\r\n--- a\/lisp\/org-plot.el\r\n+++ b\/lisp\/org-plot.el\r\n@@ -633,7 +633,7 @@ (defun org-plot\/gnuplot-script (table data-file num-cols params &optional prefac\r\n \r\n (defun org-plot\/redisplay-img-in-buffer (img-file)\r\n   \"Find any overlays for IMG-FILE in the current Org buffer, and refresh them.\"\r\n-  (dolist (img-overlay org-inline-image-overlays)\r\n+  (dolist (img-overlay org-link-preview-overlays)\r\n     (when (string= img-file (plist-get (cdr (overlay-get img-overlay 'display)) :file))\r\n       (when (and (file-exists-p img-file)\r\n                  (fboundp 'image-flush))\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex d5c1dcb35..091a09344 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -5079,7 +5079,7 @@ (define-derived-mode org-mode outline-mode \"Org\"\r\n     ;; modifications to make cache updates work reliably.\r\n     (org-unmodified\r\n      (when org-startup-with-beamer-mode (org-beamer-mode))\r\n-     (when org-startup-with-inline-images (org-display-inline-images))\r\n+     (when org-startup-with-inline-images (org-link-preview '(16)))\r\n      (when org-startup-with-latex-preview (org-latex-preview '(16)))\r\n      (unless org-inhibit-startup-visibility-stuff (org-cycle-set-startup-visibility))\r\n      (when org-startup-truncated (setq truncate-lines t))\r\n@@ -16651,126 +16651,6 @@ (defun org-normalize-color (value)\r\n \f\r\n ;; Image display\r\n \r\n-(defvar-local org-inline-image-overlays nil)\r\n-;; Preserve when switching modes or when restarting Org.\r\n-;; If we clear the overlay list and later enable Or mode, the existing\r\n-;; image overlays will never be cleared by `org-toggle-inline-images'\r\n-;; and `org-toggle-inline-images-command'.\r\n-(put 'org-inline-image-overlays 'permanent-local t)\r\n-\r\n-(defun org--inline-image-overlays (&optional beg end)\r\n-  \"Return image overlays between BEG and END.\"\r\n-  (let* ((beg (or beg (point-min)))\r\n-         (end (or end (point-max)))\r\n-         (overlays (overlays-in beg end))\r\n-         result)\r\n-    (dolist (ov overlays result)\r\n-      (when (memq ov org-inline-image-overlays)\r\n-        (push ov result)))))\r\n-\r\n-(defun org-toggle-inline-images-command (&optional arg beg end)\r\n-  \"Toggle display of inline images without description at point.\r\n-\r\n-When point is at an image link, toggle displaying that image.\r\n-Otherwise, toggle displaying images in current entry.\r\n-\r\n-When region BEG..END is active, toggle displaying images in the\r\n-region.\r\n-\r\n-With numeric prefix ARG 1, display images with description as well.\r\n-\r\n-With prefix ARG `\\\\[universal-argument]', toggle displaying images in\r\n-the accessible portion of the buffer.  With numeric prefix ARG 11, do\r\n-the same, but include images with description.\r\n-\r\n-With prefix ARG `\\\\[universal-argument] \\\\[universal-argument]', hide\r\n-all the images in accessible portion of the buffer.\r\n-\r\n-This command is designed for interactive use.  From Elisp, you can\r\n-also use `org-toggle-inline-images'.\"\r\n-  (interactive (cons current-prefix-arg\r\n-                     (when (use-region-p)\r\n-                       (list (region-beginning) (region-end)))))\r\n-  (let* ((include-linked\r\n-          (cond\r\n-           ((member arg '(nil (4) (16)) ) nil)\r\n-           ((member arg '(1 11)) 'include-linked)\r\n-           (t 'include-linked)))\r\n-         (interactive? (called-interactively-p 'any))\r\n-         (toggle-images\r\n-          (lambda (&optional beg end scope force-remove)\r\n-            (let* ((beg (or beg (point-min)))\r\n-                   (end (or end (point-max)))\r\n-                   (old (org--inline-image-overlays beg end))\r\n-                   (scope (or scope (format \"%d:%d\" beg end))))\r\n-              (if (or old force-remove)\r\n-                  (progn\r\n-                    (org-remove-inline-images beg end)\r\n-                    (when interactive?\r\n-                      (message\r\n-                       \"[%s] Inline image display turned off (removed %d images)\"\r\n-                       scope (length old))))\r\n-\t        (org-display-inline-images include-linked t beg end)\r\n-                (when interactive?\r\n-                  (let ((new (org--inline-image-overlays beg end)))\r\n-                    (message\r\n-                     (if new\r\n-\t\t         (format \"[%s] %d images displayed inline %s\"\r\n-\t\t\t         scope (length new)\r\n-                                 (if include-linked \"(including images with description)\"\r\n-                                   \"\"))\r\n-\t\t       (format \"[%s] No images to display inline\" scope))))))))))\r\n-    (cond\r\n-     ((not (display-graphic-p))\r\n-      (message \"Your Emacs does not support displaying images!\"))\r\n-     ;; Region selected :: toggle images in region.\r\n-     ((and beg end) (funcall toggle-images beg end \"region\"))\r\n-     ;; C-u or C-11 argument :: toggle images in the whole buffer.\r\n-     ((member arg '(11 (4))) (funcall toggle-images nil nil \"buffer\"))\r\n-     ;; C-u C-u argument :: unconditionally hide images in the buffer.\r\n-     ((equal arg '(16)) (funcall toggle-images nil nil \"buffer\" 'remove))\r\n-     ;; Argument nil or 1, no region selected :: toggle (display or hide\r\n-     ;; dwim) images in current section or image link at point.\r\n-     ((and (member arg '(nil 1)) (null beg) (null end))\r\n-      (let ((context (org-element-context)))\r\n-        ;; toggle display of inline image link at point.\r\n-        (if (org-element-type-p context 'link)\r\n-            (funcall toggle-images\r\n-                     (org-element-begin context)\r\n-                     (org-element-end context)\r\n-                     \"image at point\")\r\n-          (let ((beg (if (org-before-first-heading-p) (point-min)\r\n-\t               (save-excursion\r\n-\t                 (org-with-limited-levels (org-back-to-heading t) (point)))))\r\n-                (end (org-with-limited-levels (org-entry-end-position))))\r\n-            (funcall toggle-images beg end \"current section\")))))\r\n-     ;; Any other non-nil argument.\r\n-     ((not (null arg)) (funcall toggle-images beg end \"region\")))))\r\n-\r\n-(defun org-toggle-inline-images (&optional include-linked beg end)\r\n-  \"Toggle the display of inline images.\r\n-INCLUDE-LINKED is passed to `org-display-inline-images'.\"\r\n-  (interactive \"P\")\r\n-  (if (org--inline-image-overlays beg end)\r\n-      (progn\r\n-        (org-remove-inline-images beg end)\r\n-        (when (called-interactively-p 'interactive)\r\n-\t  (message \"Inline image display turned off\")))\r\n-    (org-display-inline-images include-linked nil beg end)\r\n-    (when (called-interactively-p 'interactive)\r\n-      (let ((new (org--inline-image-overlays beg end)))\r\n-        (message (if new\r\n-\t\t     (format \"%d images displayed inline\"\r\n-\t\t\t     (length new))\r\n-\t\t   \"No images to display inline\"))))))\r\n-\r\n-(defun org-redisplay-inline-images ()\r\n-  \"Assure display of inline images and refresh them.\"\r\n-  (interactive)\r\n-  (org-toggle-inline-images)\r\n-  (unless org-inline-image-overlays\r\n-    (org-toggle-inline-images)))\r\n-\r\n ;; For without-x builds.\r\n (declare-function image-flush \"image\" (spec &optional frame))\r\n \r\n@@ -16793,7 +16673,7 @@ (defcustom org-display-remote-inline-images 'skip\r\n   :safe #'symbolp)\r\n \r\n (defcustom org-image-align 'left\r\n-  \"How to align images previewed using `org-display-inline-images'.\r\n+  \"How to align images previewed using `org-link-preview-region'.\r\n \r\n Only stand-alone image links are affected by this setting.  These\r\n are links without surrounding text.\r\n@@ -16850,139 +16730,6 @@ (defun org--create-inline-image (file width)\r\n                                 org-image-max-width)))\r\n                     :scale 1))))\r\n \r\n-(defun org-display-inline-images (&optional include-linked refresh beg end)\r\n-  \"Display inline images.\r\n-\r\n-An inline image is a link which follows either of these\r\n-conventions:\r\n-\r\n-  1. Its path is a file with an extension matching return value\r\n-     from `image-file-name-regexp' and it has no contents.\r\n-\r\n-  2. Its description consists in a single link of the previous\r\n-     type.  In this case, that link must be a well-formed plain\r\n-     or angle link, i.e., it must have an explicit \\\"file\\\" or\r\n-     \\\"attachment\\\" type.\r\n-\r\n-Equip each image with the key-map `image-map'.\r\n-\r\n-When optional argument INCLUDE-LINKED is non-nil, also links with\r\n-a text description part will be inlined.  This can be nice for\r\n-a quick look at those images, but it does not reflect what\r\n-exported files will look like.\r\n-\r\n-When optional argument REFRESH is non-nil, refresh existing\r\n-images between BEG and END.  This will create new image displays\r\n-only if necessary.\r\n-\r\n-BEG and END define the considered part.  They default to the\r\n-buffer boundaries with possible narrowing.\"\r\n-  (interactive \"P\")\r\n-  (when (display-graphic-p)\r\n-    (when refresh\r\n-      (org-remove-inline-images beg end)\r\n-      (when (fboundp 'clear-image-cache) (clear-image-cache)))\r\n-    (let ((end (or end (point-max))))\r\n-      (org-with-point-at (or beg (point-min))\r\n-\t(let* ((case-fold-search t)\r\n-\t       (file-extension-re (image-file-name-regexp))\r\n-\t       (link-abbrevs (mapcar #'car\r\n-\t\t\t\t     (append org-link-abbrev-alist-local\r\n-\t\t\t\t\t     org-link-abbrev-alist)))\r\n-\t       ;; Check absolute, relative file names and explicit\r\n-\t       ;; \"file:\" links.  Also check link abbreviations since\r\n-\t       ;; some might expand to \"file\" links.\r\n-\t       (file-types-re\r\n-\t\t(format \"\\\\[\\\\[\\\\(?:file%s:\\\\|attachment:\\\\|[.\/~]\\\\)\\\\|\\\\]\\\\[\\\\(<?\\\\(?:file\\\\|attachment\\\\):\\\\)\"\r\n-\t\t\t(if (not link-abbrevs) \"\"\r\n-\t\t\t  (concat \"\\\\|\" (regexp-opt link-abbrevs))))))\r\n-\t  (while (re-search-forward file-types-re end t)\r\n-\t    (let* ((link (org-element-lineage\r\n-\t\t\t  (save-match-data (org-element-context))\r\n-\t\t\t  'link t))\r\n-                   (linktype (org-element-property :type link))\r\n-\t\t   (inner-start (match-beginning 1))\r\n-\t\t   (path\r\n-\t\t    (cond\r\n-\t\t     ;; No link at point; no inline image.\r\n-\t\t     ((not link) nil)\r\n-\t\t     ;; File link without a description.  Also handle\r\n-\t\t     ;; INCLUDE-LINKED here since it should have\r\n-\t\t     ;; precedence over the next case.  I.e., if link\r\n-\t\t     ;; contains filenames in both the path and the\r\n-\t\t     ;; description, prioritize the path only when\r\n-\t\t     ;; INCLUDE-LINKED is non-nil.\r\n-\t\t     ((or (not (org-element-contents-begin link))\r\n-\t\t\t  include-linked)\r\n-\t\t      (and (or (equal \"file\" linktype)\r\n-                               (equal \"attachment\" linktype))\r\n-\t\t\t   (org-element-property :path link)))\r\n-\t\t     ;; Link with a description.  Check if description\r\n-\t\t     ;; is a filename.  Even if Org doesn't have syntax\r\n-\t\t     ;; for those -- clickable image -- constructs, fake\r\n-\t\t     ;; them, as in `org-export-insert-image-links'.\r\n-\t\t     ((not inner-start) nil)\r\n-\t\t     (t\r\n-\t\t      (org-with-point-at inner-start\r\n-\t\t\t(and (looking-at\r\n-\t\t\t      (if (char-equal ?< (char-after inner-start))\r\n-\t\t\t\t  org-link-angle-re\r\n-\t\t\t\torg-link-plain-re))\r\n-\t\t\t     ;; File name must fill the whole\r\n-\t\t\t     ;; description.\r\n-\t\t\t     (= (org-element-contents-end link)\r\n-\t\t\t\t(match-end 0))\r\n-\t\t\t     (progn\r\n-                               (setq linktype (match-string 1))\r\n-                               (match-string 2))))))))\r\n-\t      (when (and path (string-match-p file-extension-re path))\r\n-\t\t(let ((file (if (equal \"attachment\" linktype)\r\n-\t\t\t\t(progn\r\n-                                  (require 'org-attach)\r\n-\t\t\t\t  (ignore-errors (org-attach-expand path)))\r\n-                              (expand-file-name path))))\r\n-                  ;; Expand environment variables.\r\n-                  (when file (setq file (substitute-in-file-name file)))\r\n-\t\t  (when (and file (file-exists-p file))\r\n-\t\t    (let ((width (org-display-inline-image--width link))\r\n-\t\t\t  (align (org-image--align link))\r\n-                          (old (get-char-property-and-overlay\r\n-\t\t\t\t(org-element-begin link)\r\n-\t\t\t\t'org-image-overlay)))\r\n-\t\t      (if (and (car-safe old) refresh)\r\n-                          (image-flush (overlay-get (cdr old) 'display))\r\n-\t\t\t(let ((image (org--create-inline-image file width)))\r\n-\t\t\t  (when image\r\n-\t\t\t    (let ((ov (make-overlay\r\n-\t\t\t\t       (org-element-begin link)\r\n-\t\t\t\t       (progn\r\n-\t\t\t\t\t (goto-char\r\n-\t\t\t\t\t  (org-element-end link))\r\n-\t\t\t\t\t (unless (eolp) (skip-chars-backward \" \\t\"))\r\n-\t\t\t\t\t (point)))))\r\n-                              ;; See bug#59902.  We cannot rely\r\n-                              ;; on Emacs to update image if the file\r\n-                              ;; has changed.\r\n-                              (image-flush image)\r\n-\t\t\t      (overlay-put ov 'display image)\r\n-\t\t\t      (overlay-put ov 'face 'default)\r\n-\t\t\t      (overlay-put ov 'org-image-overlay t)\r\n-\t\t\t      (overlay-put\r\n-\t\t\t       ov 'modification-hooks\r\n-\t\t\t       (list 'org-display-inline-remove-overlay))\r\n-\t\t\t      (when (boundp 'image-map)\r\n-\t\t\t\t(overlay-put ov 'keymap image-map))\r\n-                              (when align\r\n-                                (overlay-put\r\n-                                 ov 'before-string\r\n-                                 (propertize\r\n-                                  \" \" 'face 'default\r\n-                                  'display\r\n-                                  (pcase align\r\n-                                    (\"center\" `(space :align-to (- center (0.5 . ,image))))\r\n-                                    (\"right\"  `(space :align-to (- right ,image)))))))\r\n-\t\t\t      (push ov org-inline-image-overlays))))))))))))))))\r\n-\r\n (declare-function org-export-read-attribute \"ox\"\r\n                   (attribute element &optional property))\r\n (defvar visual-fill-column-width) ; Silence compiler warning\r\n@@ -17135,32 +16882,6 @@ (defun org-image--align (link)\r\n             (when (memq org-image-align '(center right))\r\n               (symbol-name org-image-align))))))))\r\n \r\n-\r\n-(defun org-display-inline-remove-overlay (ov after _beg _end &optional _len)\r\n-  \"Remove inline-display overlay if a corresponding region is modified.\"\r\n-  (when (and ov after)\r\n-    (setq org-inline-image-overlays (delete ov org-inline-image-overlays))\r\n-    ;; Clear image from cache to avoid image not updating upon\r\n-    ;; changing on disk.  See Emacs bug#59902.\r\n-    (when (overlay-get ov 'org-image-overlay)\r\n-      (image-flush (overlay-get ov 'display)))\r\n-    (delete-overlay ov)))\r\n-\r\n-(defun org-remove-inline-images (&optional beg end)\r\n-  \"Remove inline display of images.\"\r\n-  (interactive)\r\n-  (let* ((beg (or beg (point-min)))\r\n-         (end (or end (point-max)))\r\n-         (overlays (overlays-in beg end)))\r\n-    (dolist (ov overlays)\r\n-      (when (memq ov org-inline-image-overlays)\r\n-        (setq org-inline-image-overlays (delq ov org-inline-image-overlays))\r\n-        (delete-overlay ov)))\r\n-    ;; Clear removed overlays.\r\n-    (dolist (ov org-inline-image-overlays)\r\n-      (unless (overlay-buffer ov)\r\n-        (setq org-inline-image-overlays (delq ov org-inline-image-overlays))))))\r\n-\r\n (defvar org-self-insert-command-undo-counter 0)\r\n (defvar org-speed-command nil)\r\n \r\ndiff --git a\/testing\/lisp\/test-org-fold.el b\/testing\/lisp\/test-org-fold.el\r\nindex f58642be6..809738f6c 100644\r\n--- a\/testing\/lisp\/test-org-fold.el\r\n+++ b\/testing\/lisp\/test-org-fold.el\r\n@@ -716,14 +716,14 @@ (ert-deftest test-org-fold\/org-fold-display-inline-images ()\r\n       (org-show-subtree)\r\n       (org-fold-subtree t)\r\n       (run-hook-with-args 'org-cycle-hook 'folded)\r\n-      (should-not org-inline-image-overlays)\r\n+      (should-not org-link-preview-overlays)\r\n       (should-not\r\n        (cl-every\r\n         (lambda (ov) (overlay-get ov 'org-image-overlay))\r\n         (overlays-in (point-min) (point-max))))\r\n       (org-show-subtree)\r\n       (run-hook-with-args 'org-cycle-hook 'subtree)\r\n-      (should org-inline-image-overlays)\r\n+      (should org-link-preview-overlays)\r\n       (should\r\n        (cl-every\r\n         (lambda (ov) (overlay-get ov 'org-image-overlay))\r\n-- \r\n2.44.1\r\n\r\n","subject":"Re: [PATCH v2] Inline image display as part of a new org-link-preview system"},{"date":"2024-08-20T16:15:25.057Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/BE99BCB6-8629-4754-B767-0E65C39F1702@gmail.com","message-id":"BE99BCB6-8629-4754-B767-0E65C39F1702@gmail.com","config":false,"refs-count":2,"username":"Peter Solodov","related-refs":["BE99BCB6-8629-4754-B767-0E65C39F1702@gmail.com"],"from":"solodov@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] bulk todo state changing only adds state change log to the last entry [9.6.15 (release_9.6.15 @ \/opt\/homebrew\/Cellar\/emacs-plus@29\/29.4\/share\/emacs\/29.4\/lisp\/org\/)]"},{"date":"2024-08-20T15:07:31.281Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87plq3nslb.fsf@no.lan","message-id":"87plq3nslb.fsf@no.lan","config":false,"refs-count":4,"username":"Gregor Zattler","related-refs":["87plq3nslb.fsf@no.lan"],"from":"telegraph@gmx.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] stable literal hrefs in HTML export of direct links and usage of link description instead of numbered links in case of shortend link syntax"},{"date":"2024-08-20T13:08:47.110Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/f2cdf50bf412972a7b5d6f3f1b733217@condition-alpha.com","message-id":"f2cdf50bf412972a7b5d6f3f1b733217@condition-alpha.com","config":false,"refs-count":7,"username":"Alexander Adolf via General discussions about Org-mode.","references":["8734nc30dq.fsf@localhost","878qwuyq8f.fsf@localhost","87ikwcazd9.fsf@localhost","6ce3ea5364e48afc79f8345c67111c63@condition-alpha.com","b434baf78d0d4875631913ec8cda245c@condition-alpha.com","d4f5e6e94a8b5b62463a8df8cb85e233@condition-alpha.com"],"related-refs":["b46539132be3ed81d1b6da24dac4a1b8@condition-alpha.com","f2cdf50bf412972a7b5d6f3f1b733217@condition-alpha.com"],"from":"emacs-orgmode@gnu.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/f2cdf50bf412972a7b5d6f3f1b733217@condition-alpha.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From d9e467207f333fd925bd9090228808da54205280 Mon Sep 17 00:00:00 2001\r\nFrom: Alexander Adolf <alexander.adolf@condition-alpha.com>\r\nDate: Sat, 17 Aug 2024 18:29:51 +0200\r\nSubject: [PATCH] doc\/org-manual.org: better explain columnview column summary\r\n types\r\n\r\n* doc\/org-manual.org (Column attributes): Shed more words on how\r\nsummary types for columnview columns work, which property values are\r\ntaken into account, and which property values get updated in the\r\nbuffer under what circumstances.\r\n---\r\n doc\/org-manual.org | 211 ++++++++++++++++++++++++++++++++++++++++++++-\r\n 1 file changed, 207 insertions(+), 4 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 6cf51ebca..97ae0867c 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -5734,10 +5734,8 @@ optional.  The individual parts have the following meaning:\r\n \r\n - {{{var(SUMMARY-TYPE)}}} ::\r\n \r\n-  The summary type.  If specified, the column values for parent nodes\r\n-  are computed from the children[fn:: If more than one summary type\r\n-  applies to the same property, the parent values are computed\r\n-  according to the first of them.].\r\n+  The summary type.  If specified, the column and property values for\r\n+  ancestor nodes are computed from their descendants.\r\n \r\n   Supported summary types are:\r\n \r\n@@ -5810,6 +5808,211 @@ children have been checked.  The =CLOCKSUM= and =CLOCKSUM_T= columns\r\n are special, they list the sums of CLOCK intervals in the subtree,\r\n either for all clocks or just for today.\r\n \r\n+When using summary types for non-special properties like the\r\n+=Time_Estimate= column in the example, the collection of data for the\r\n+summary in each subtree within scope will start at the furthest\r\n+descendant nodes which have the respective property.  When any of\r\n+their sibling nodes also have the property in question, all the\r\n+siblings's values of the property are used to compute the summary\r\n+result according to the summary type specified.  Then the closest\r\n+ancestor node which also has the respective property is located, and\r\n+the buffer is modified as the value of that node's property is updated\r\n+with the summary result of its descendant nodes.  This process is\r\n+repeated starting from each updated node, until the top of each\r\n+subtree has been reached, and all branches of the subtree have been\r\n+traversed.  Since the property values of ancestor nodes get updated in\r\n+this process, only the furthest descendant nodes which have the\r\n+respective property along each subtree axis will contribute to the\r\n+summary results.\r\n+\r\n+When a non-special property appears more than once in a columns\r\n+definition, and with different summary type specifications (including\r\n+with none), the values of that property present on any ancestor nodes\r\n+will be updated according to the summary type specification (if any)\r\n+of the first instance of the property in the columns definition.\r\n+Hence, when the first occurrence of a property in a columns definition\r\n+has no summary type specification, the property values of ancestor\r\n+nodes will not be updated.\r\n+\r\n+When using summary types with columns for the special properties\r\n+=CLOCKSUM= and =CLOCKSUM_T=, the summary process will be different.\r\n+First, as these are special properties that are not stored in property\r\n+drawers, no updates will be made to any nodes involved.  Secondly, the\r\n+summary value will be computed not just from the furthest descendant\r\n+nodes, but from the special property values of all nodes in a subtree.\r\n+\r\n+The following example illustrates how special, and non-special\r\n+properties contribute to the summary results, and how the property\r\n+values of the headlines get updated.  Consider the following buffer\r\n+contents (the =#+BEGIN= must be on a single line, and is wrapped here\r\n+for readability only):\r\n+\r\n+#+begin_example\r\n+,#+BEGIN: columnview :indent t :format \"%ITEM(Task) \\\r\n+          %EFFORT(Estimated Total){:} %EFFORT(Estimated) \\\r\n+          %CLOCKSUM(Clocked Total){:} %CLOCKSUM(Clocked)\" :id global\r\n+,#+END:\r\n+\r\n+,* Task 1\r\n+:PROPERTIES:\r\n+:EFFORT:   2d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 48:00\r\n+:END:\r\n+\r\n+,** Task 1.1\r\n+:PROPERTIES:\r\n+:EFFORT:   2d\r\n+:END:\r\n+\r\n+,*** Task 1.1.1\r\n+:PROPERTIES:\r\n+:EFFORT:   3d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 72:00\r\n+:END:\r\n+\r\n+,*** Task 1.1.2\r\n+:PROPERTIES:\r\n+:EFFORT:   4d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 96:00\r\n+:END:\r\n+\r\n+,** Task 1.2\r\n+:PROPERTIES:\r\n+:EFFORT:   4d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 96:00\r\n+:END:\r\n+#+end_example\r\n+\r\n+When the colmnview dynamic block is now updated by {{{kbd(C-c C-c)}}}\r\n+or {{{kbd(C-c C-x C-u)}}} (~org-dblock-update~) with the cursor\r\n+somewhere on the =#+BEGIN= line, the buffer contents shown below will\r\n+result.  Note how the values of the =EFFORT= property of =Task 1= and\r\n+=Task 1.1= were updated to eleven days, and to seven days\r\n+respectively.  Note also, how the =CLOCKSUM= of thirteen days for\r\n+=Task 1= includes the two days which were clocked on the headline\r\n+itself.  Comparing the two estimated, and the two clocksum columns\r\n+with each other in the table shows how the first summary type\r\n+specification determines the summary calculation for a given property.\r\n+\r\n+#+begin_example\r\n+,#+BEGIN: columnview :indent t :format \"%ITEM(Task) \\\r\n+          %EFFORT(Estimated Total){:} %EFFORT(Estimated) \\\r\n+          %CLOCKSUM(Clocked Total){:} %CLOCKSUM(Clocked)\" :id global\r\n+| Task             | Estimated Total | Estimated | Clocked Total | Clocked  |\r\n+|------------------+-----------------+-----------+---------------+----------|\r\n+| Task 1           |        11d 0:00 |  11d 0:00 | 13d 0:00      | 13d 0:00 |\r\n+| \\_  Task 1.1     |         7d 0:00 |   7d 0:00 | 7d 0:00       | 7d 0:00  |\r\n+| \\_    Task 1.1.1 |              3d |        3d | 3d 0:00       | 3d 0:00  |\r\n+| \\_    Task 1.1.2 |              4d |        4d | 4d 0:00       | 4d 0:00  |\r\n+| \\_  Task 1.2     |              4d |        4d | 4d 0:00       | 4d 0:00  |\r\n+,#+END:\r\n+\r\n+,* Task 1\r\n+:PROPERTIES:\r\n+:EFFORT:   11d 0:00\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 48:00\r\n+:END:\r\n+\r\n+,** Task 1.1\r\n+:PROPERTIES:\r\n+:EFFORT:   7d 0:00\r\n+:END:\r\n+\r\n+,*** Task 1.1.1\r\n+:PROPERTIES:\r\n+:EFFORT:   3d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 72:00\r\n+:END:\r\n+\r\n+,*** Task 1.1.2\r\n+:PROPERTIES:\r\n+:EFFORT:   4d\r\n+:END:\r\n+:LOGBOOK:\r\n+        CLOCK:  => 96:00\r\n+:END:\r\n+\r\n+,** Task 1.2\r\n+:PROPERTIES:\r\n+:EFFORT:   4d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 96:00\r\n+:END:\r\n+#+end_example\r\n+\r\n+Starting again from the same initial example buffer content, but with\r\n+a modified =#+BEGIN= line that swaps the order of the two estimated,\r\n+and the two clocksum columns, the result of updating the columnview\r\n+dynamic block will be as shown below.  Note the different results in\r\n+the estimated column without a summary type.  Also note that the\r\n+=EFFORT= properties of the =Task 1= and =Task 1.1= headlines were not\r\n+updated in this case, because the first column specification for the\r\n+=EFFORT= property has no summary type.\r\n+\r\n+#+begin_example\r\n+,#+BEGIN: columnview :indent t :format \"%ITEM(Task) \\\r\n+          %EFFORT(Estimated) %EFFORT(Estimated Total){:} \\\r\n+          %CLOCKSUM(Clocked) %CLOCKSUM(Clocked Total){:}\" :id global\r\n+| Task             | Estimated | Estimated Total | Clocked  | Clocked Total |\r\n+|------------------+-----------+-----------------+----------+---------------|\r\n+| Task 1           |        2d |        11d 0:00 | 13d 0:00 | 13d 0:00      |\r\n+| \\_  Task 1.1     |        2d |         7d 0:00 | 7d 0:00  | 7d 0:00       |\r\n+| \\_    Task 1.1.1 |        3d |              3d | 3d 0:00  | 3d 0:00       |\r\n+| \\_    Task 1.1.2 |        4d |              4d | 4d 0:00  | 4d 0:00       |\r\n+| \\_  Task 1.2     |        4d |              4d | 4d 0:00  | 4d 0:00       |\r\n+#+END:\r\n+\r\n+,* Task 1\r\n+:PROPERTIES:\r\n+:EFFORT:   2d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 48:00\r\n+:END:\r\n+\r\n+,** Task 1.1\r\n+:PROPERTIES:\r\n+:EFFORT:   2d\r\n+:END:\r\n+\r\n+,*** Task 1.1.1\r\n+:PROPERTIES:\r\n+:EFFORT:   3d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 72:00\r\n+:END:\r\n+\r\n+,*** Task 1.1.2\r\n+:PROPERTIES:\r\n+:EFFORT:   4d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 96:00\r\n+:END:\r\n+\r\n+,** Task 1.2\r\n+:PROPERTIES:\r\n+:EFFORT:   4d\r\n+:END:\r\n+:LOGBOOK:\r\n+CLOCK:  => 96:00\r\n+:END:\r\n+#+end_example\r\n+\r\n *** Using column view\r\n :PROPERTIES:\r\n :DESCRIPTION: How to create and use column view.\r\n-- \r\n2.39.3 (Apple Git-146)\r\n\r\n","subject":"Re: Summation of effort estimates in columnview dblock"},{"date":"2024-08-18T10:34:34.618Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87sev2yv92.fsf@localhost","message-id":"87sev2yv92.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","references":["64c8a313.a70a0220.93ee0.14fb@mx.google.com","CAL1eYuK5Nc0br3bX0fHU4e=wGd=MmmDPzKYC6VZMUoM6soqQ4Q@mail.gmail.com","66a8b73b.170a0220.383476.996e@mx.google.com","87zg3l1rgb.fsf@localhost","669882e5.050a0220.8ff6d.33c6@mx.google.com","64cc9b8a.170a0220.dfa99.2e18@mx.google.com","871q3logb9.fsf@localhost","87msz7kym0.fsf@localhost","87y1lo4ou1.fsf@localhost","87il9zgpdp.fsf@localhost","64c905d7.170a0220.f434a.fddb@mx.google.com","646379fc.620a0220.c0ae4.9fb2@mx.google.com","6461a84b.a70a0220.b6d36.5d00@mx.google.com","87sfbxhmxe.fsf@localhost","64623c09.170a0220.52bf9.9437@mx.google.com","87o75yhwnu.fsf@localhost","87o7jpoqfl.fsf@localhost"],"related-refs":["87sev2yv92.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Automatically display images in resutls of evaluation (was: [PATCH v4.0] Re: [PATCH] add a function to only refresh inline images under current headline instead of global buffer)"},{"date":"2024-08-15T17:02:25.540Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8734n53el5.fsf@localhost","message-id":"8734n53el5.fsf@localhost","config":false,"refs-count":12,"username":"Ihor Radchenko","references":["871q2rsa9e.fsf@localhost","878qwzjrxp.fsf@mat.ucm.es","87bk1vsfey.fsf@localhost","87mslgrzba.fsf@localhost","87a5hfla9u.fsf@mat.ucm.es","87ed6rsgm6.fsf@localhost","87v803qtwv.fsf@localhost","87ttfnleqn.fsf@mat.ucm.es","87plqbjtg2.fsf@mat.ucm.es","878qwzmukt.fsf@mat.ucm.es","878qwzsf1k.fsf@localhost","87h6bnlege.fsf@mat.ucm.es","87wmklyd5v.fsf@mat.ucm.es"],"related-refs":["8734n53el5.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] latex preview and pdflatex-only packages (was: org-latex-preview, pNiceArray (running latex twice))"},{"date":"2024-08-10T18:49:25.714Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cymg5i72.fsf@ushin.org","message-id":"87cymg5i72.fsf@ushin.org","config":false,"refs-count":6,"username":"Joseph Turner","references":["87ikw834f3.fsf@localhost","875xs9am61.fsf@ushin.org","87wml0f265.fsf@ushin.org","87o766kebj.fsf@localhost","20dcde53-c4aa-4db6-9143-9e6ea6a62215@gmail.com","875xsh5wze.fsf@ushin.org"],"related-refs":["87cymg5i72.fsf@ushin.org"],"from":"joseph@ushin.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87cymg5i72.fsf@ushin.org","source-id":"emacs-orgmode@gnu.org","patch-body":"From 5284e6cf66a8e4a8c2dcc0471e5285746c56a455 Mon Sep 17 00:00:00 2001\r\nFrom: Joseph Turner <joseph@breatheoutbreathe.in>\r\nDate: Sat, 10 Aug 2024 11:45:53 -0700\r\nSubject: [PATCH] index.org: Link to new worg org-media-type page\r\n\r\n---\r\n index.org | 7 ++++---\r\n 1 file changed, 4 insertions(+), 3 deletions(-)\r\n\r\ndiff --git a\/index.org b\/index.org\r\nindex 025b4aa..6bfa6d0 100644\r\n--- a\/index.org\r\n+++ b\/index.org\r\n@@ -119,9 +119,10 @@ * More Org\r\n   :CUSTOM_ID: more\r\n   :END:\r\n \r\n-The \/de facto\/ mimetype for Org files is =text\/org=. Org files use the\r\n-~.org~ extension. Most operating systems don't know to open ~.org~ files\r\n-in Emacs, but they can be configured to do so without much effort.\r\n+The \/de facto\/ [[https:\/\/orgmode.org\/worg\/org-media-type.html][mimetype for Org files]] is =text\/org=. Org files use the\r\n+~.org~ extension. Most operating systems don't know to open ~.org~\r\n+files in Emacs, but they can be configured to do so without much\r\n+effort.\r\n \r\n While the reference implementation of Org in Emacs lisp is by far the\r\n most featureful, there are many additional [[file:tools.org][tools]] that work with Org.\r\n-- \r\n2.41.0\r\n\r\n","subject":"Re: Adding text\/org MIME type to jshttp\/mime-db"},{"date":"2024-07-23T20:01:02.344Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871q3jyj6a.fsf@rensoliemans.nl","message-id":"871q3jyj6a.fsf@rensoliemans.nl","config":false,"refs-count":4,"username":"Rens Oliemans","related-refs":["871q3jyj6a.fsf@rensoliemans.nl"],"from":"hallo@rensoliemans.nl","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Capital-letter options from dangling clock don't clock out [9.8-pre (release_9.7.7-106-g114c76 @ \/home\/rens\/Projects\/org\/org-mode\/lisp\/)]"},{"date":"2024-07-17T12:45:36.755Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/PH8PR12MB669812F7E4A73C1147A3A5BFDCA32@PH8PR12MB6698.namprd12.prod.outlook.com","message-id":"PH8PR12MB669812F7E4A73C1147A3A5BFDCA32@PH8PR12MB6698.namprd12.prod.outlook.com","config":false,"refs-count":3,"username":"Nina Lanyon","related-refs":["PH8PR12MB669812F7E4A73C1147A3A5BFDCA32@PH8PR12MB6698.namprd12.prod.outlook.com"],"from":"ninalanyon@hotmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org parser error [9.6.15 (release_9.6.15 @ \/snap\/emacs\/current\/usr\/share\/emacs\/29.4\/lisp\/org\/)]"},{"date":"2024-07-16T20:56:51.618Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/877cdlnjjm.fsf@sappc2.fritz.box","message-id":"877cdlnjjm.fsf@sappc2.fritz.box","config":false,"refs-count":2,"username":"Jens Schmidt","related-refs":["877cdlnjjm.fsf@sappc2.fritz.box"],"from":"jschmidt4gnu@vodafonemail.de","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Emphasized text in *HEADLINE link target leaks through invisible text [9.8-pre (release_9.7.6-107-gf21415 @ \/home\/jschmidt\/work\/org-mode\/lisp\/)]"},{"date":"2024-07-15T12:16:17.786Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87le22x3lc.fsf@no.lan","message-id":"87le22x3lc.fsf@no.lan","config":false,"refs-count":1,"username":"Gregor Zattler","related-refs":["87le22x3lc.fsf@no.lan"],"from":"telegraph@gmx.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Warning (org-element): org-element--cache: Warning(2.org): Org parser error in 2.org::5951. Resetting. [9.8-pre (release_9.7.6-101-g4f6aab @ \/home\/grfz\/src\/org-mode\/lisp\/)]"},{"date":"2024-07-12T07:14:04.763Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/6a7129e2-9d26-4292-b8d1-1a3e3db90f4b@7d.nz","message-id":"6a7129e2-9d26-4292-b8d1-1a3e3db90f4b@7d.nz","config":false,"refs-count":3,"username":"Phil","related-refs":["6a7129e2-9d26-4292-b8d1-1a3e3db90f4b@7d.nz"],"from":"pe@7d.nz","source-id":"emacs-orgmode@gnu.org","subject":"[FR] org-babel-n-tangle"},{"date":"2024-06-28T15:23:23.647Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87tthd6qht.fsf@localhost","message-id":"87tthd6qht.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["87sex5gdqc.fsf@localhost"],"related-refs":["87tthd6qht.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Bug of Feature? Attack vector via deceiving link abbrevs (was: [ANN] Emergency bugfix release: Org mode 9.7.5)"},{"date":"2024-06-28T15:09:44.520Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87wmm96r53.fsf@localhost","message-id":"87wmm96r53.fsf@localhost","config":false,"refs-count":8,"username":"Ihor Radchenko","references":["87sex5gdqc.fsf@localhost"],"related-refs":["87wmm96r53.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] We plan to remove #+LINK: ...%(my-function) placeholder from link abbreviation spec (was: [ANN] Emergency bugfix release: Org mode 9.7.5)"},{"date":"2024-06-27T13:00:52.836Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87a5j6y1zk.fsf@localhost","message-id":"87a5j6y1zk.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["ujamo1$5t9$1@ciao.gmane.io","v0an63$3n2$1@ciao.gmane.io","878r14qso9.fsf@localhost","87a5liexcu.fsf@localhost","18f01342a2f.124ad27612732529.8693431365849276517@excalamus.com","87le50uyx4.fsf@localhost"],"related-refs":["87a5j6y1zk.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] ob-shell may use \/bin\/sh instead of the specified shell when :cmdline is provided (was: [PATCH] Re: [BUG] ob-shell: :shebang changes interpretation of :cmdline)"},{"date":"2024-06-27T09:41:58.782Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871q4izpr4.fsf@localhost","message-id":"871q4izpr4.fsf@localhost","config":false,"refs-count":10,"username":"Ihor Radchenko","references":["Eol9qrqro63gxtIvCHknY775AV2QB4sVptOEZY__3tyWRRgw7GkCfbxqahcbQoVgNoQeqJzzXs5fHS-7ocn3OqTE0hJSwW9HCmWF4lt6N6g=@crawf.uk","87jzibkfc4.fsf@localhost","16Z2_l6WnvrrYSQE7LC5XJQB3dO0DNAREBe7F4yE_DuNVOpHzqwELJ08ditlBSgFv_nnI3FSwi0JYCLEpd9CMqViJHxHiR3XbGeqDf4DM7Y=@crawf.uk"],"related-refs":["871q4izpr4.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] ob-R, ob-julia: Should we force-disable ess-ask-for-ess-directory? (was: [BUG] Relative filenames for graphics output in ob-R.el [9.8-pre (release_9.7.4-80-g7fa169)])"},{"date":"2024-06-23T21:09:16.414Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2tthjl66c.fsf@turingmachine.org","message-id":"m2tthjl66c.fsf@turingmachine.org","config":false,"refs-count":2,"username":"dmg","references":["87tti494ko.fsf@localhost","m2ed99dzb0.fsf@turingmachine.org"],"related-refs":["m2tthjl66c.fsf@turingmachine.org"],"from":"dmg@turingmachine.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/m2tthjl66c.fsf@turingmachine.org","source-id":"emacs-orgmode@gnu.org","patch-body":"From 2949d23c1e06f5cb9c4a07a4b7ec5322b87d8b8e Mon Sep 17 00:00:00 2001\r\nFrom: Daniel M German <dmg@turingmachine.org>\r\nDate: Sun, 23 Jun 2024 13:55:57 -0700\r\nSubject: [PATCH] Documenting readonly parameter for sqlite's babel\r\n\r\norg-contrib\/babel\/languages\/ob-doc-sqlite.org:\r\n\tnew option :readonly  to ob-sqlite to open the database\r\n\tin readonly mode:\r\n---\r\n org-contrib\/babel\/languages\/ob-doc-sqlite.org | 21 +++++++++++++++++++\r\n 1 file changed, 21 insertions(+)\r\n\r\ndiff --git a\/org-contrib\/babel\/languages\/ob-doc-sqlite.org b\/org-contrib\/babel\/languages\/ob-doc-sqlite.org\r\nindex d7febb0c..d909d24b 100644\r\n--- a\/org-contrib\/babel\/languages\/ob-doc-sqlite.org\r\n+++ b\/org-contrib\/babel\/languages\/ob-doc-sqlite.org\r\n@@ -110,6 +110,7 @@ There are 11 SQLite-specific header arguments.\r\n                 SQLite `list' output mode and by the SQLite dot command\r\n                 =.import=. \r\n  - nullvalue :: a string to use in place of NULL values.\r\n+ - readonly :: if yes, open the database in readonly mode.\r\n \r\n *** Variables \r\n \r\n@@ -252,3 +253,23 @@ where exists (select * from updates where updates.id = bookreview.id);\r\n By editing the intermediary table to replace \"null\" values with a\r\n numerical rating, and then running the second source block, the SQLite\r\n table will be updated correctly.\r\n+\r\n+** Open database in read-only mode\r\n+\r\n+Sometimes it is useful to open the database in readonly mode to make sure no\r\n+modifications are made to it.\r\n+\r\n+#+BEGIN_EXAMPLE\r\n+,#+begin_src sqlite :readonly yes :db \/tmp\/test.db\r\n+create table atable(a int, b int);\r\n+,#+end_src\r\n+#+END_EXAMPLE\r\n+\r\n+Attempting to run this block will generate the following error:\r\n+\r\n+#+BEGIN_EXAMPLE\r\n+Runtime error near line 2: attempt to write a readonly database (8)\r\n+[ Babel evaluation exited with code 1 ]\r\n+#+END_EXAMPLE\r\n+\r\n+\r\n-- \r\n2.45.2\r\n\r\n","subject":"Re: Add 'readonly' option to ob-sqlite"},{"date":"2024-06-18T05:13:12.411Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87jzimu98z.fsf@gmail.com","message-id":"87jzimu98z.fsf@gmail.com","config":false,"refs-count":2,"username":"Visuwesh","references":["8734q7jfes.fsf@gmail.com","87le36ilf0.fsf@localhost","87ikyd48f8.fsf@gmail.com","87le3440qe.fsf@gmail.com","87wmmu72pu.fsf@localhost","87zfrp4939.fsf@gmail.com","87y173a3vs.fsf@localhost","87cypbjw50.fsf@gmail.com","871q5rv1qy.fsf@localhost"],"related-refs":["87ikyd48f8.fsf@gmail.com","87zfrp4939.fsf@gmail.com","87cypbjw50.fsf@gmail.com","87jzimu98z.fsf@gmail.com"],"from":"visuweshm@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87jzimu98z.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 9755ccb636ab8e1d855bbc386bc6bab2203a2cd5 Mon Sep 17 00:00:00 2001\r\nFrom: Visuwesh <visuweshm@gmail.com>\r\nDate: Tue, 18 Jun 2024 10:39:27 +0530\r\nSubject: [PATCH] org-plot: Respect parameters given in\r\n `org-plot\/preset-plot-types'\r\n\r\n* org-plot.el (org-plot\/gnuplot-script-preamble)\r\n(org-plot\/gnuplot-term-extra): Explain what \"plot type\" means.\r\n(org-plot\/preset-plot-types): Fix docstring and correct the lambda\r\nargument order for the 'grid' plot type.\r\n(org-plot\/gnuplot): Merge the parameters given in\r\n`org-plot\/preset-plot-types' and the #+PLOT line to ensure the former\r\nis respected everywhere.\r\n\r\nReported-by: Visuwesh <visuweshm@gmail.com>\r\nLink: https:\/\/orgmode.org\/list\/87cypbjw50.fsf@gmail.com\r\n---\r\n lisp\/org-plot.el | 24 +++++++++++++++---------\r\n 1 file changed, 15 insertions(+), 9 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-plot.el b\/lisp\/org-plot.el\r\nindex 83483b2..b436613 100644\r\n--- a\/lisp\/org-plot.el\r\n+++ b\/lisp\/org-plot.el\r\n@@ -302,9 +302,10 @@ (defgroup org-plot nil\r\n (defcustom org-plot\/gnuplot-script-preamble \"\"\r\n   \"String of function to be inserted before the gnuplot plot command is run.\r\n \r\n-Note that this is in addition to, not instead of other content generated in\r\n-`org-plot\/gnuplot-script'.  If a function, it is called with the plot type as\r\n-the argument, and must return a string to be used.\"\r\n+Note that this is in addition to, not instead of other content generated\r\n+in `org-plot\/gnuplot-script'.  If a function, it is called with the\r\n+parameters used by the current plot type (see\r\n+`org-plot\/preset-plot-types'), and must return a string to be used.\"\r\n   :group 'org-plot\r\n   :type '(choice string function))\r\n \r\n@@ -349,7 +350,7 @@ (defcustom org-plot\/preset-plot-types\r\n     (grid :plot-cmd \"splot\"\r\n \t  :plot-pre (lambda (_table _data-file _num-cols params _plot-str)\r\n \t\t      (if (plist-get params :map) \"set pm3d map\" \"set map\"))\r\n-\t  :data-dump (lambda (table data-file params _num-cols)\r\n+\t  :data-dump (lambda (table data-file _num-cols params)\r\n \t\t       (let ((y-labels (org-plot\/gnuplot-to-grid-data\r\n \t\t\t\t\ttable data-file params)))\r\n \t\t\t (when y-labels (plist-put params :ylabels y-labels))))\r\n@@ -391,8 +392,8 @@ (defcustom org-plot\/preset-plot-types\r\n - :data-dump - Function to dump the table to a datafile for ease of\r\n   use.\r\n \r\n-  Accepts lambda function.  Default lambda body:\r\n-  (org-plot\/gnuplot-to-data table data-file params)\r\n+  Accepts function with arguments:\r\n+  (table data-file num-cols params)\r\n \r\n - :plot-pre - Gnuplot code to be inserted early into the script, just\r\n   after term and output have been set.\r\n@@ -541,7 +542,8 @@ (defcustom org-plot\/gnuplot-term-extra \"\"\r\n   \"String or function which provides the extra term options.\r\n E.g. a value of \\\"size 1050,650\\\" would cause\r\n \\\"set term ... size 1050,650\\\" to be used.\r\n-If a function, it is called with the plot type as the argument.\"\r\n+If a function, it is called with the parameters used by the current plot\r\n+type, see `org-plot\/preset-plot-types'.\"\r\n   :group 'org-plot\r\n   :type '(choice string function))\r\n \r\n@@ -678,8 +680,8 @@ (defun org-plot\/gnuplot (&optional params)\r\n \t\t    tbl))\r\n \t   (num-cols (length (if (eq (nth 0 table) 'hline) (nth 1 table)\r\n \t\t\t       (nth 0 table))))\r\n-\t   (type (assoc (plist-get params :plot-type)\r\n-\t\t\torg-plot\/preset-plot-types))\r\n+\t   (type (cdr (assoc (plist-get params :plot-type)\r\n+\t\t\t     org-plot\/preset-plot-types)))\r\n            gnuplot-script data-file)\r\n \r\n       (unless type\r\n@@ -693,6 +695,10 @@ (defun org-plot\/gnuplot (&optional params)\r\n       (save-excursion (while (and (equal 0 (forward-line -1))\r\n \t\t\t\t  (looking-at \"[[:space:]]*#\\\\+\"))\r\n \t\t\t(setf params (org-plot\/collect-options params))))\r\n+      ;; Ensure that the user can override any plot parameter, and\r\n+      ;; that the parameters set by the plot type in\r\n+      ;; `org-plot\/preset-plot-types' is respected.\r\n+      (setq params (org-combine-plists type params))\r\n       ;; Dump table to datafile\r\n       (let ((dump-func (plist-get type :data-dump)))\r\n         ;; Use a stable temporary file to ensure that 'replot' upon\r\n-- \r\n2.43.0\r\n\r\n","subject":"Re: [BUG] org-plot: Unable to use text xtics with type:2d (+ more) [9.7-pre (N\/A @ \/home\/viz\/lib\/emacs\/straight\/build\/org\/)]"},{"date":"2024-06-18T02:57:37.055Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87v8277ye7.fsf@gmail.com","message-id":"87v8277ye7.fsf@gmail.com","config":false,"refs-count":14,"username":"Suhail Singh","related-refs":["87v8277ye7.fsf@gmail.com"],"from":"suhailsingh247@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87v8277ye7.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 7a61bb6a7c7e1122199232a1c01885fb270dd370 Mon Sep 17 00:00:00 2001\r\nFrom: Suhail <suhail@bayesians.ca>\r\nDate: Mon, 17 Jun 2024 21:04:18 -0400\r\nSubject: [PATCH 1\/2] ox-html: Add support for attr_html for source code blocks\r\n\r\n* lisp\/ox-html.el (org-html-src-block): Handle attr_html in a manner\r\nsimilar to example blocks.\r\n\r\nTINYCHANGE\r\n---\r\n lisp\/ox-html.el | 14 ++++++++++++--\r\n 1 file changed, 12 insertions(+), 2 deletions(-)\r\n\r\ndiff --git a\/lisp\/ox-html.el b\/lisp\/ox-html.el\r\nindex d1687cf5a..675d85ffe 100644\r\n--- a\/lisp\/ox-html.el\r\n+++ b\/lisp\/ox-html.el\r\n@@ -3667,14 +3667,24 @@ (defun org-html-src-block\r\n contextual information.\"\r\n   (if (org-export-read-attribute :attr_html src-block :textarea)\r\n       (org-html--textarea-block src-block)\r\n-    (let* ((lang (org-element-property :language src-block))\r\n+    (let* ((attributes (org-export-read-attribute :attr_html src-block))\r\n+           (lang (org-element-property :language src-block))\r\n \t   (code (org-html-format-code src-block info))\r\n \t   (label (let ((lbl (org-html--reference src-block info t)))\r\n \t\t    (if lbl (format \" id=\\\"%s\\\"\" lbl) \"\")))\r\n \t   (klipsify  (and  (plist-get info :html-klipsify-src)\r\n                             (member lang '(\"javascript\" \"js\"\r\n \t\t\t\t\t   \"ruby\" \"scheme\" \"clojure\" \"php\" \"html\")))))\r\n-      (format \"<div class=\\\"org-src-container\\\">\\n%s%s\\n<\/div>\"\r\n+      (if-let ((class-val (plist-get attributes :class)))\r\n+          (setq attributes (plist-put attributes :class (concat \"org-src-container \" class-val)))\r\n+        (setq attributes (plist-put attributes :class \"org-src-container\")))\r\n+      (format \"<div%s>\\n%s%s\\n<\/div>\"\r\n+              (let* ((reference (org-html--reference src-block info))\r\n+\t\t     (a (org-html--make-attribute-string\r\n+\t\t\t (if (or (not reference) (plist-member attributes :id))\r\n+\t\t\t     attributes\r\n+\t\t\t   (plist-put attributes :id reference)))))\r\n+\t\t(if (org-string-nw-p a) (concat \" \" a) \"\"))\r\n \t      ;; Build caption.\r\n \t      (let ((caption (org-export-get-caption src-block)))\r\n \t\t(if (not caption) \"\"\r\n-- \r\n2.45.2\r\n\r\n","subject":"[PATCH] [BUG] Support attr_html in source code and fixed-width blocks"},{"date":"2024-06-17T17:43:00.203Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87msnja2k3.fsf@localhost","message-id":"87msnja2k3.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["W3Wrd_rlAaLcO3TiYh0qI4bhufhABTEKi739lgR4kBVilSixUL2hPbRnei13mb8uoJTP_fKH0qSprR-_AiDMIAy3wdTr0dqMaQZyTSX0Z_k=@protonmail.com","U7e3eolGUqJxSXD4-Dr-O4PI9-tpwW0fEVU_O7iWz5PsYQMwMeCFXSxLXlBqiiJyFzCKGp06pOzKlTAesIHPg4robvI24fq3W7luN5qcl9M=@protonmail.com"],"related-refs":["87msnja2k3.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] place a header from an archive file back in its original location"},{"date":"2024-06-14T21:23:19.313Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2bk43gr0l.fsf@adamkovic.org","message-id":"m2bk43gr0l.fsf@adamkovic.org","config":false,"refs-count":2,"username":"Rudolf Adamkovi\u010d","references":["216278dc-075c-47d1-94dc-f5bde8346b3c@gmail.com","m2ttjk88m8.fsf@adamkovic.org","m2bk5onqzl.fsf@adamkovic.org","m28r0vsyni.fsf@adamkovic.org","m28qzd6dm2.fsf@adamkovic.org","87il01k6k1.fsf@localhost","8734raewr6.fsf@localhost","m2msnnh0ut.fsf@adamkovic.org","m2a5lepxxn.fsf@adamkovic.org","m2plsjh169.fsf@adamkovic.org","87pluctf6m.fsf@localhost","877cgc9nea.fsf@localhost","20240423164458.33702-1-rudolf@adamkovic.org","m2pluereit.fsf@adamkovic.org"],"related-refs":["m2plsjh169.fsf@adamkovic.org","m2bk43gr0l.fsf@adamkovic.org"],"from":"rudolf@adamkovic.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/m2bk43gr0l.fsf@adamkovic.org","source-id":"emacs-orgmode@gnu.org","patch-body":"From 6dcca348337c05d33d62da6eeb1f4193b73f4d6e Mon Sep 17 00:00:00 2001\r\nFrom: =?UTF-8?q?Rudolf=20Adamkovi=C4=8D?= <rudolf@adamkovic.org>\r\nDate: Fri, 14 Jun 2024 16:55:24 +0200\r\nSubject: [PATCH 1\/5] ob-lua: Escape double quote characters in results\r\n\r\n* lisp\/ob-lua.el (org-babel-lua-wrapper-method): Escape all double\r\nquote characters in Lua before giving them to Org Babel.\r\n* testing\/lisp\/test-ob-lua.el (test-ob-lua\/escaping-quotes): Test\r\nautomatic escaping of double quote characters.\r\n\r\nReported-by: Max Nikulin <manikulin@gmail.com>\r\nLink: https:\/\/list.orgmode.org\/216278dc-075c-47d1-94dc-f5bde8346b3c@gmail.com\/\r\n---\r\n lisp\/ob-lua.el              | 2 +-\r\n testing\/lisp\/test-ob-lua.el | 6 ++++++\r\n 2 files changed, 7 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/lisp\/ob-lua.el b\/lisp\/ob-lua.el\r\nindex 041abfabc..0168bc070 100644\r\n--- a\/lisp\/ob-lua.el\r\n+++ b\/lisp\/ob-lua.el\r\n@@ -283,7 +283,7 @@ function dump(it, indent)\r\n       end\r\n       return result\r\n    else\r\n-      return tostring(it)\r\n+      return string.gsub(tostring(it), '\\\"', '\\\\\\\"')\r\n    end\r\n end\r\n \r\ndiff --git a\/testing\/lisp\/test-ob-lua.el b\/testing\/lisp\/test-ob-lua.el\r\nindex 0a60c68ca..ff69f5411 100644\r\n--- a\/testing\/lisp\/test-ob-lua.el\r\n+++ b\/testing\/lisp\/test-ob-lua.el\r\n@@ -176,6 +176,12 @@ return x\r\n             (org-test-with-temp-text \"src_lua{return 1, 2, 3}\"\r\n               (org-babel-execute-src-block))))))\r\n \r\n+(ert-deftest test-ob-lua\/escaping-quotes ()\r\n+  (should\r\n+   (equal \"A \\\" B\"\r\n+          (org-test-with-temp-text \"src_lua{return 'A \\\" B'}\"\r\n+            (org-babel-execute-src-block)))))\r\n+\r\n (provide 'test-ob-lua)\r\n \r\n ;;; test-ob-lua.el ends here\r\n-- \r\n2.39.3 (Apple Git-146)\r\n\r\n","subject":"Re: [PATCH] ob-lua: Support all types and multiple values in results"},{"date":"2024-06-14T17:43:40.709Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2plsjh169.fsf@adamkovic.org","message-id":"m2plsjh169.fsf@adamkovic.org","config":false,"refs-count":8,"username":"Rudolf Adamkovi\u010d","references":["216278dc-075c-47d1-94dc-f5bde8346b3c@gmail.com","m2ttjk88m8.fsf@adamkovic.org","m2bk5onqzl.fsf@adamkovic.org","m28r0vsyni.fsf@adamkovic.org","m28qzd6dm2.fsf@adamkovic.org","87il01k6k1.fsf@localhost","8734raewr6.fsf@localhost","m2a5lepxxn.fsf@adamkovic.org","87pluctf6m.fsf@localhost","877cgc9nea.fsf@localhost","20240423164458.33702-1-rudolf@adamkovic.org","m2pluereit.fsf@adamkovic.org"],"related-refs":["m2plsjh169.fsf@adamkovic.org","m2bk43gr0l.fsf@adamkovic.org"],"from":"rudolf@adamkovic.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/m2plsjh169.fsf@adamkovic.org","source-id":"emacs-orgmode@gnu.org","patch-body":"From 6dcca348337c05d33d62da6eeb1f4193b73f4d6e Mon Sep 17 00:00:00 2001\r\nFrom: =?UTF-8?q?Rudolf=20Adamkovi=C4=8D?= <rudolf@adamkovic.org>\r\nDate: Fri, 14 Jun 2024 16:55:24 +0200\r\nSubject: [PATCH 1\/4] ob-lua: Escape double quote characters in results\r\n\r\n* lisp\/ob-lua.el (org-babel-lua-wrapper-method): Escape all double\r\nquote characters in Lua before giving them to Org Babel.\r\n* testing\/lisp\/test-ob-lua.el (test-ob-lua\/escaping-quotes): Test\r\nautomatic escaping of double quote characters.\r\n\r\nReported-by: Max Nikulin <manikulin@gmail.com>\r\nLink: https:\/\/list.orgmode.org\/216278dc-075c-47d1-94dc-f5bde8346b3c@gmail.com\/\r\n---\r\n lisp\/ob-lua.el              | 2 +-\r\n testing\/lisp\/test-ob-lua.el | 6 ++++++\r\n 2 files changed, 7 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/lisp\/ob-lua.el b\/lisp\/ob-lua.el\r\nindex 041abfabc..0168bc070 100644\r\n--- a\/lisp\/ob-lua.el\r\n+++ b\/lisp\/ob-lua.el\r\n@@ -283,7 +283,7 @@ function dump(it, indent)\r\n       end\r\n       return result\r\n    else\r\n-      return tostring(it)\r\n+      return string.gsub(tostring(it), '\\\"', '\\\\\\\"')\r\n    end\r\n end\r\n \r\ndiff --git a\/testing\/lisp\/test-ob-lua.el b\/testing\/lisp\/test-ob-lua.el\r\nindex 0a60c68ca..ff69f5411 100644\r\n--- a\/testing\/lisp\/test-ob-lua.el\r\n+++ b\/testing\/lisp\/test-ob-lua.el\r\n@@ -176,6 +176,12 @@ return x\r\n             (org-test-with-temp-text \"src_lua{return 1, 2, 3}\"\r\n               (org-babel-execute-src-block))))))\r\n \r\n+(ert-deftest test-ob-lua\/escaping-quotes ()\r\n+  (should\r\n+   (equal \"A \\\" B\"\r\n+          (org-test-with-temp-text \"src_lua{return 'A \\\" B'}\"\r\n+            (org-babel-execute-src-block)))))\r\n+\r\n (provide 'test-ob-lua)\r\n \r\n ;;; test-ob-lua.el ends here\r\n-- \r\n2.39.3 (Apple Git-146)\r\n\r\n","subject":"Re: [PATCH] ob-lua: Support all types and multiple values in results"},{"date":"2024-06-14T16:56:43.696Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CAJ+TeodGutt7U2O5_rFi6u4_oDnek56D8E_T=6pczYLcvJJKfw@mail.gmail.com","message-id":"CAJ+TeodGutt7U2O5_rFi6u4_oDnek56D8E_T=6pczYLcvJJKfw@mail.gmail.com","config":false,"refs-count":17,"username":"Rustom Mody","related-refs":["CAJ+TeodGutt7U2O5_rFi6u4_oDnek56D8E_T=6pczYLcvJJKfw@mail.gmail.com"],"from":"rustompmody@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] orgalist send bug"},{"date":"2024-06-14T15:31:54.569Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/874j9vk09f.fsf@localhost","message-id":"874j9vk09f.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["875xudszmk.fsf@gmail.com"],"related-refs":["874j9vk09f.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Support sessions in ob-emacs-lisp via IELM"},{"date":"2024-06-13T07:20:58.429Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ikyd48f8.fsf@gmail.com","message-id":"87ikyd48f8.fsf@gmail.com","config":false,"refs-count":5,"username":"Visuwesh","references":["8734q7jfes.fsf@gmail.com","87wmmu72pu.fsf@localhost","87zfrp4939.fsf@gmail.com","87cypbjw50.fsf@gmail.com","871q5rv1qy.fsf@localhost"],"related-refs":["87ikyd48f8.fsf@gmail.com","87zfrp4939.fsf@gmail.com","87cypbjw50.fsf@gmail.com","87jzimu98z.fsf@gmail.com"],"from":"visuweshm@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87ikyd48f8.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 2a153a5bc015b0e970ecde39fd2edbb515261349 Mon Sep 17 00:00:00 2001\r\nFrom: Visuwesh <visuweshm@gmail.com>\r\nDate: Thu, 13 Jun 2024 12:33:49 +0530\r\nSubject: [PATCH] org-plot: Respect parameters given in\r\n `org-plot\/preset-plot-types'\r\n\r\n* lisp\/org-plot.el (org-plot\/preset-plot-types): Fix docstring and\r\ncorrect the lambda argument order for the 'grid' plot type.\r\n(org-plot\/gnuplot): Merge the parameters given in\r\n`org-plot\/preset-plot-types' and the #+PLOT line to ensure the former\r\nis respected everywhere.\r\n\r\nReported-by: Visuwesh <visuweshm@gmail.com>\r\nLink: https:\/\/orgmode.org\/list\/87cypbjw50.fsf@gmail.com\r\n---\r\n lisp\/org-plot.el | 11 ++++++-----\r\n 1 file changed, 6 insertions(+), 5 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-plot.el b\/lisp\/org-plot.el\r\nindex 283d993..6d53830 100644\r\n--- a\/lisp\/org-plot.el\r\n+++ b\/lisp\/org-plot.el\r\n@@ -349,7 +349,7 @@ (defcustom org-plot\/preset-plot-types\r\n     (grid :plot-cmd \"splot\"\r\n \t  :plot-pre (lambda (_table _data-file _num-cols params _plot-str)\r\n \t\t      (if (plist-get params :map) \"set pm3d map\" \"set map\"))\r\n-\t  :data-dump (lambda (table data-file params _num-cols)\r\n+\t  :data-dump (lambda (table data-file _num-cols params)\r\n \t\t       (let ((y-labels (org-plot\/gnuplot-to-grid-data\r\n \t\t\t\t\ttable data-file params)))\r\n \t\t\t (when y-labels (plist-put params :ylabels y-labels))))\r\n@@ -391,8 +391,8 @@ (defcustom org-plot\/preset-plot-types\r\n - :data-dump - Function to dump the table to a datafile for ease of\r\n   use.\r\n\r\n-  Accepts lambda function.  Default lambda body:\r\n-  (org-plot\/gnuplot-to-data table data-file params)\r\n+  Accepts lambda function with arguments:\r\n+  (table data-file num-cols params)\r\n\r\n - :plot-pre - Gnuplot code to be inserted early into the script, just\r\n   after term and output have been set.\r\n@@ -679,8 +679,8 @@ (defun org-plot\/gnuplot (&optional params)\r\n \t\t    tbl))\r\n \t   (num-cols (length (if (eq (nth 0 table) 'hline) (nth 1 table)\r\n \t\t\t       (nth 0 table))))\r\n-\t   (type (assoc (plist-get params :plot-type)\r\n-\t\t\torg-plot\/preset-plot-types))\r\n+\t   (type (cdr (assoc (plist-get params :plot-type)\r\n+\t\t\t     org-plot\/preset-plot-types)))\r\n            gnuplot-script)\r\n\r\n       (unless type\r\n@@ -695,6 +695,7 @@ (defun org-plot\/gnuplot (&optional params)\r\n       (save-excursion (while (and (equal 0 (forward-line -1))\r\n \t\t\t\t  (looking-at \"[[:space:]]*#\\\\+\"))\r\n \t\t\t(setf params (org-plot\/collect-options params))))\r\n+      (setq params (org-combine-plists type params))\r\n       ;; Dump table to datafile\r\n       (let ((dump-func (plist-get type :data-dump)))\r\n         (if dump-func\r\n--\r\n2.43.0\r\n","subject":"Re: [BUG] org-plot: Unable to use text xtics with type:2d (+ more) [9.7-pre (N\/A @ \/home\/viz\/lib\/emacs\/straight\/build\/org\/)]"},{"date":"2024-06-13T07:12:36.627Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87zfrp4939.fsf@gmail.com","message-id":"87zfrp4939.fsf@gmail.com","config":false,"refs-count":6,"username":"Visuwesh","references":["8734q7jfes.fsf@gmail.com","87wmmu72pu.fsf@localhost","87cypbjw50.fsf@gmail.com","871q5rv1qy.fsf@localhost"],"related-refs":["87ikyd48f8.fsf@gmail.com","87zfrp4939.fsf@gmail.com","87cypbjw50.fsf@gmail.com","87jzimu98z.fsf@gmail.com"],"from":"visuweshm@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87zfrp4939.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 2a153a5bc015b0e970ecde39fd2edbb515261349 Mon Sep 17 00:00:00 2001\r\nFrom: Visuwesh <visuweshm@gmail.com>\r\nDate: Thu, 13 Jun 2024 12:33:49 +0530\r\nSubject: [PATCH] org-plot: Respect parameters given in\r\n `org-plot\/preset-plot-types'\r\n\r\n* lisp\/org-plot.el (org-plot\/preset-plot-types): Fix docstring and\r\ncorrect the lambda argument order for the 'grid' plot type.\r\n(org-plot\/gnuplot): Merge the parameters given in\r\n`org-plot\/preset-plot-types' and the #+PLOT line to ensure the former\r\nis respected everywhere.\r\n\r\nReported-by: Visuwesh <visuweshm@gmail.com>\r\nLink: https:\/\/orgmode.org\/list\/87edbu4kdh.fsf@gmail.com\r\n---\r\n lisp\/org-plot.el | 11 ++++++-----\r\n 1 file changed, 6 insertions(+), 5 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-plot.el b\/lisp\/org-plot.el\r\nindex 283d993..6d53830 100644\r\n--- a\/lisp\/org-plot.el\r\n+++ b\/lisp\/org-plot.el\r\n@@ -349,7 +349,7 @@ (defcustom org-plot\/preset-plot-types\r\n     (grid :plot-cmd \"splot\"\r\n \t  :plot-pre (lambda (_table _data-file _num-cols params _plot-str)\r\n \t\t      (if (plist-get params :map) \"set pm3d map\" \"set map\"))\r\n-\t  :data-dump (lambda (table data-file params _num-cols)\r\n+\t  :data-dump (lambda (table data-file _num-cols params)\r\n \t\t       (let ((y-labels (org-plot\/gnuplot-to-grid-data\r\n \t\t\t\t\ttable data-file params)))\r\n \t\t\t (when y-labels (plist-put params :ylabels y-labels))))\r\n@@ -391,8 +391,8 @@ (defcustom org-plot\/preset-plot-types\r\n - :data-dump - Function to dump the table to a datafile for ease of\r\n   use.\r\n \r\n-  Accepts lambda function.  Default lambda body:\r\n-  (org-plot\/gnuplot-to-data table data-file params)\r\n+  Accepts lambda function with arguments:\r\n+  (table data-file num-cols params)\r\n \r\n - :plot-pre - Gnuplot code to be inserted early into the script, just\r\n   after term and output have been set.\r\n@@ -679,8 +679,8 @@ (defun org-plot\/gnuplot (&optional params)\r\n \t\t    tbl))\r\n \t   (num-cols (length (if (eq (nth 0 table) 'hline) (nth 1 table)\r\n \t\t\t       (nth 0 table))))\r\n-\t   (type (assoc (plist-get params :plot-type)\r\n-\t\t\torg-plot\/preset-plot-types))\r\n+\t   (type (cdr (assoc (plist-get params :plot-type)\r\n+\t\t\t     org-plot\/preset-plot-types)))\r\n            gnuplot-script)\r\n \r\n       (unless type\r\n@@ -695,6 +695,7 @@ (defun org-plot\/gnuplot (&optional params)\r\n       (save-excursion (while (and (equal 0 (forward-line -1))\r\n \t\t\t\t  (looking-at \"[[:space:]]*#\\\\+\"))\r\n \t\t\t(setf params (org-plot\/collect-options params))))\r\n+      (setq params (org-combine-plists type params))\r\n       ;; Dump table to datafile\r\n       (let ((dump-func (plist-get type :data-dump)))\r\n         (if dump-func\r\n-- \r\n2.43.0\r\n\r\n","subject":"Re: [BUG] org-plot: Unable to use text xtics with type:2d (+ more) [9.7-pre (N\/A @ \/home\/viz\/lib\/emacs\/straight\/build\/org\/)]"},{"date":"2024-06-09T07:01:59.142Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/0e2ed754-bc71-4558-9c46-f17d73981fe5@NymanTechnology.com","message-id":"0e2ed754-bc71-4558-9c46-f17d73981fe5@NymanTechnology.com","config":false,"refs-count":8,"username":"Robert Nyman","related-refs":["0e2ed754-bc71-4558-9c46-f17d73981fe5@NymanTechnology.com"],"from":"RKNyman@NymanTechnology.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Clock malfunction -- Cannot process task file after update [9.7.2 (release_N\/A-N\/A-88dd2c @ \/home\/rknyman\/.emacs.d\/elpa\/org-9.7.2\/)]"},{"date":"2024-06-05T18:18:07.863Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cyov5k63.fsf@localhost","message-id":"87cyov5k63.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["CAAdktEx-=8DvG7LNkkKg7fJC06QoSNY_buKDaqDbKKmeBK9EBA@mail.gmail.com","279D1AD1-F38A-4442-AE06-60CFA0798874@health.ucsd.edu"],"related-refs":["87cyov5k63.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Org babel: mixing multiple outputs (was: Output of R code block: only text or plot but not both? And only one \"result\" can be output?)"},{"date":"2024-06-04T09:34:39.724Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87mso1oxvs.fsf@localhost","message-id":"87mso1oxvs.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["87seyydnf7.fsf@localhost","87ttjl8cf9.fsf@gmail.com","875xvxk1bj.fsf@gmail.com","87h6fjz07g.fsf@localhost"],"related-refs":["87mso1oxvs.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87mso1oxvs.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From add9e512fa80e53bfa396ebc4d0bdf35b3bee089 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <add9e512fa80e53bfa396ebc4d0bdf35b3bee089.1717493559.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Tue, 4 Jun 2024 11:30:44 +0200\r\nSubject: [PATCH] org-attach-dir-from-id: Search existing attachments for\r\n symlinks\r\n\r\n* lisp\/org-attach.el (org-attach-dir-from-id): When current buffer\r\ndisplays a symlinked file, search for existing attachments in the\r\noriginal file dir.\r\n* etc\/ORG-NEWS (=org-attach= now considers symlinked files when\r\nsearching pre-existing attach dirs): Announce the change.\r\n\r\nReported-by: Karthik Chikmagalur <karthikchikmagalur@gmail.com>\r\nLink: https:\/\/orgmode.org\/list\/87seyydnf7.fsf@localhost\r\n---\r\n etc\/ORG-NEWS       |  8 ++++++++\r\n lisp\/org-attach.el | 39 +++++++++++++++++++++++++++++----------\r\n 2 files changed, 37 insertions(+), 10 deletions(-)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 4b0b77ca8..4ac88f139 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -41,6 +41,14 @@ all the references are resolved in the generated png.\r\n # This also includes changes in function behavior from Elisp perspective.\r\n \r\n ** Miscellaneous\r\n+*** =org-attach= now considers symlinked files when searching pre-existing attach dirs\r\n+\r\n+When Org buffer is opened from a symlink, Org mode looks into the\r\n+original file directory when searching if an attach directory already exists.\r\n+This way, attachments will remain accessible when opening symlinked Org file.\r\n+\r\n+When no attach dir exists, Org mode will still prefer creating it in\r\n+the \"default\" directory - where the symlink is located.\r\n \r\n * Version 9.7\r\n \r\ndiff --git a\/lisp\/org-attach.el b\/lisp\/org-attach.el\r\nindex 16f6e1e29..d4bff03ad 100644\r\n--- a\/lisp\/org-attach.el\r\n+++ b\/lisp\/org-attach.el\r\n@@ -433,22 +433,42 @@ (defun org-attach-dir-get-create ()\r\n       (make-directory attach-dir t))\r\n     attach-dir))\r\n \r\n-(defun org-attach-dir-from-id (id  &optional existing)\r\n+(defun org-attach-dir-from-id (id &optional existing)\r\n   \"Return a folder path based on `org-attach-id-dir' and ID.\r\n Try id-to-path functions in `org-attach-id-to-path-function-list'\r\n ignoring nils.  If EXISTING is non-nil, then return the first path\r\n-found in the filesystem.  Otherwise return the first non-nil value.\"\r\n+found in the filesystem.  Otherwise return the first non-nil value.\r\n+\r\n+The existing paths are searched in\r\n+1. `org-attach-id-dir';\r\n+2. in \\\"data\/\\\" dir - the default value of `org-attach-id-dir';\r\n+3. if current buffer is a symlink, (1) and (2) searches are repeated\r\n+   in the `default-directory' of symlink target.\"\r\n   (let ((fun-list org-attach-id-to-path-function-list)\r\n         (base-dir (expand-file-name org-attach-id-dir))\r\n-        (default-base-dir (expand-file-name \"data\/\"))\r\n+        (fallback-dirs (list (expand-file-name \"data\/\")))\r\n         preferred first)\r\n+    (when (and (buffer-file-name)\r\n+               (file-symlink-p (buffer-file-name)))\r\n+      (let ((default-directory\r\n+             (file-name-directory\r\n+              (file-truename (buffer-file-name)))))\r\n+        (cl-pushnew (expand-file-name org-attach-id-dir) fallback-dirs)\r\n+        (cl-pushnew (expand-file-name \"data\/\") fallback-dirs)))\r\n+    (setq fallback-dirs (delete base-dir fallback-dirs))\r\n+    (setq fallback-dirs (seq-filter #'file-directory-p fallback-dirs))\r\n     (while (and fun-list\r\n                 (not preferred))\r\n       (let* ((name (funcall (car fun-list) id))\r\n              (candidate (and name (expand-file-name name base-dir)))\r\n-             ;; Try the default value `org-attach-id-dir' as a fallback.\r\n-             (candidate2 (and name (not (equal base-dir default-base-dir))\r\n-                              (expand-file-name name default-base-dir))))\r\n+             ;; Try the default value `org-attach-id-dir', and linked\r\n+             ;; dirs if buffer is a symlink as a fallback.\r\n+             (fallback-candidates\r\n+              (and name (mapcar\r\n+                         (lambda (dir) (expand-file-name name dir))\r\n+                         fallback-dirs)))\r\n+             (fallback-candidates\r\n+              (seq-filter #'file-directory-p fallback-candidates)))\r\n         (setq fun-list (cdr fun-list))\r\n         (when candidate\r\n           (if (or (not existing) (file-directory-p candidate))\r\n@@ -456,10 +476,9 @@ (defun org-attach-dir-from-id (id  &optional existing)\r\n             (unless first\r\n               (setq first candidate)))\r\n           (when (and existing\r\n-                     candidate2\r\n-                     (not (file-directory-p candidate))\r\n-                     (file-directory-p candidate2))\r\n-            (setq preferred candidate2)))))\r\n+                     fallback-candidates\r\n+                     (not (file-directory-p candidate)))\r\n+            (setq preferred (car fallback-candidates))))))\r\n     (or preferred first)))\r\n \r\n (defun org-attach-check-absolute-path (dir)\r\n-- \r\n2.45.1\r\n\r\n","subject":"Re: [BUG] Attachments not resolved correctly from symlinked Org files"},{"date":"2024-06-04T03:59:32.654Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CAErawX=o5kuTa5eshiZRnSEYrTutgUktYVk8aS5jJZDSMkM9aA@mail.gmail.com","message-id":"CAErawX=o5kuTa5eshiZRnSEYrTutgUktYVk8aS5jJZDSMkM9aA@mail.gmail.com","config":false,"refs-count":2,"username":"Weaver Marquez","related-refs":["CAErawX=o5kuTa5eshiZRnSEYrTutgUktYVk8aS5jJZDSMkM9aA@mail.gmail.com"],"from":"weavermarquez0@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Adding explicitly negative :results Type option"},{"date":"2024-05-22T23:20:00.848Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/85r0dt77xf.fsf@gmail.com","message-id":"85r0dt77xf.fsf@gmail.com","config":false,"refs-count":5,"username":"Amy Grinn","references":["87r0e7s3uo.fsf@localhost","87y19kxagi.fsf@localhost","s31cys8xz4w.fsf@gmail.com","87h6hixhnw.fsf@localhost","85wmo0l4m1.fsf@gmail.com","85wmp82boq.fsf_-_@gmail.com"],"related-refs":["85r0dt77xf.fsf@gmail.com","85wmo0l4m1.fsf@gmail.com"],"from":"grinn.amy@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/85r0dt77xf.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 9442c029a7b2f1ec061e42a047b3d1bff88441d8 Mon Sep 17 00:00:00 2001\r\nFrom: Amy Grinn <grinn.amy@gmail.com>\r\nDate: Wed, 17 Apr 2024 16:01:40 -0400\r\nSubject: [PATCH 1\/2] lisp\/ob-core.el: (org-babel-noweb-wrap): renamed to\r\n org-babel-noweb-make-regexp\r\n\r\n* lisp\/org-compat.el: Declare org-babel-noweb-wrap to be an obselete\r\nfunction alias for org-babel-noweb-make-regexp.\r\n* lisp\/ob-core.el (org-babel-noweb-make-regexp): Rename the function.\r\n(org-babel-goto-named-src-block):\r\n(org-babel-expand-noweb-references):\r\n* lisp\/ob-exp.el (org-babel-exp-code):\r\n* lisp\/ob-tangle.el (org-babel-tangle-clean):\r\n(org-babel-tangle-single-block): Use the new function name.\r\n---\r\n lisp\/ob-core.el    | 8 ++++----\r\n lisp\/ob-exp.el     | 2 +-\r\n lisp\/ob-tangle.el  | 5 +++--\r\n lisp\/org-compat.el | 2 +-\r\n 4 files changed, 9 insertions(+), 8 deletions(-)\r\n\r\ndiff --git a\/lisp\/ob-core.el b\/lisp\/ob-core.el\r\nindex c5dd20b0e..1518d7726 100644\r\n--- a\/lisp\/ob-core.el\r\n+++ b\/lisp\/ob-core.el\r\n@@ -194,7 +194,7 @@ This string must include a \\\"%s\\\" which will be replaced by the results.\"\r\n   :package-version '(Org . \"9.1\")\r\n   :safe #'booleanp)\r\n \r\n-(defun org-babel-noweb-wrap (&optional regexp)\r\n+(defun org-babel-noweb-make-regexp (&optional regexp)\r\n   \"Return regexp matching a Noweb reference.\r\n \r\n Match any reference, or only those matching REGEXP, if non-nil.\r\n@@ -1976,7 +1976,7 @@ src block, then return nil.\"\r\n \t\t   (type (org-element-type context))\r\n \t\t   (noweb-ref\r\n \t\t    (and (memq type '(inline-src-block src-block))\r\n-\t\t\t (org-in-regexp (org-babel-noweb-wrap)))))\r\n+\t\t\t (org-in-regexp (org-babel-noweb-make-regexp)))))\r\n \t      (cond\r\n \t       (noweb-ref\r\n \t\t(buffer-substring\r\n@@ -3125,7 +3125,7 @@ block but are passed literally to the \\\"example-block\\\".\"\r\n                                   (not (equal (cdr v) \"no\"))))))\r\n \t (noweb-re (format \"\\\\(.*?\\\\)\\\\(%s\\\\)\"\r\n \t\t\t   (with-current-buffer parent-buffer\r\n-\t\t\t     (org-babel-noweb-wrap)))))\r\n+\t\t\t     (org-babel-noweb-make-regexp)))))\r\n     (unless (equal (cons parent-buffer\r\n                          (with-current-buffer parent-buffer\r\n                            (buffer-chars-modified-tick)))\r\n@@ -3175,7 +3175,7 @@ block but are passed literally to the \\\"example-block\\\".\"\r\n \t               ((guard (or org-babel-noweb-error-all-langs\r\n \t\t\t           (member lang org-babel-noweb-error-langs)))\r\n \t                (error \"Cannot resolve %s (see `org-babel-noweb-error-langs')\"\r\n-\t\t               (org-babel-noweb-wrap ,ref)))\r\n+\t\t               (org-babel-noweb-make-regexp ,ref)))\r\n \t               (_ \"\"))))\r\n       (replace-regexp-in-string\r\n        noweb-re\r\ndiff --git a\/lisp\/ob-exp.el b\/lisp\/ob-exp.el\r\nindex 34f12fdcc..33de7a4aa 100644\r\n--- a\/lisp\/ob-exp.el\r\n+++ b\/lisp\/ob-exp.el\r\n@@ -418,7 +418,7 @@ replaced with its value.\"\r\n   (setf (nth 1 info)\r\n \t(if (string= \"strip-export\" (cdr (assq :noweb (nth 2 info))))\r\n \t    (replace-regexp-in-string\r\n-\t     (org-babel-noweb-wrap) \"\" (nth 1 info))\r\n+\t     (org-babel-noweb-make-regexp) \"\" (nth 1 info))\r\n \t  (if (org-babel-noweb-p (nth 2 info) :export)\r\n \t      (org-babel-expand-noweb-references\r\n \t       info org-babel-exp-reference-buffer)\r\ndiff --git a\/lisp\/ob-tangle.el b\/lisp\/ob-tangle.el\r\nindex 79fe6448b..4427250ae 100644\r\n--- a\/lisp\/ob-tangle.el\r\n+++ b\/lisp\/ob-tangle.el\r\n@@ -412,7 +412,7 @@ references.\"\r\n   (interactive)\r\n   (goto-char (point-min))\r\n   (while (or (re-search-forward \"\\\\[\\\\[file:.*\\\\]\\\\[.*\\\\]\\\\]\" nil t)\r\n-             (re-search-forward (org-babel-noweb-wrap) nil t))\r\n+             (re-search-forward (org-babel-noweb-make-regexp) nil t))\r\n     (delete-region (save-excursion (forward-line) (point))\r\n                    (save-excursion (end-of-line 1) (forward-char 1) (point)))))\r\n \r\n@@ -580,7 +580,8 @@ non-nil, return the full association list to be used by\r\n \t  ;; Run the tangle-body-hook.\r\n           (let ((body (if (org-babel-noweb-p params :tangle)\r\n                           (if (string= \"strip-tangle\" (cdr (assq :noweb (nth 2 info))))\r\n-                            (replace-regexp-in-string (org-babel-noweb-wrap) \"\" (nth 1 info))\r\n+                              (replace-regexp-in-string (org-babel-noweb-make-regexp)\r\n+                                                        \"\" (nth 1 info))\r\n \t\t\t    (org-babel-expand-noweb-references info))\r\n \t\t\t(nth 1 info))))\r\n \t    (with-temp-buffer\r\ndiff --git a\/lisp\/org-compat.el b\/lisp\/org-compat.el\r\nindex 92cad3d6e..ce46fd399 100644\r\n--- a\/lisp\/org-compat.el\r\n+++ b\/lisp\/org-compat.el\r\n@@ -433,7 +433,7 @@ This is a floating point number if the size is too large for an integer.\"\r\n (define-obsolete-function-alias 'org-show-context 'org-fold-show-context \"9.6\")\r\n (define-obsolete-function-alias 'org-show-entry 'org-fold-show-entry \"9.6\")\r\n (define-obsolete-function-alias 'org-show-children 'org-fold-show-children \"9.6\")\r\n-\r\n+(define-obsolete-function-alias 'org-babel-noweb-wrap 'org-babel-noweb-make-regexp \"9.7\")\r\n \r\n (defmacro org-re (s)\r\n   \"Replace posix classes in regular expression S.\"\r\n-- \r\n2.39.2\r\n\r\n","subject":"Re: [FR] :noweb-wrap header arg"},{"date":"2024-05-15T13:36:23.255Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/yplmzfsrqjw6.fsf@mnet-mail.de","message-id":"yplmzfsrqjw6.fsf@mnet-mail.de","config":false,"refs-count":3,"username":"Raffael Stocker","related-refs":["yplmzfsrqjw6.fsf@mnet-mail.de"],"from":"r.stocker@mnet-mail.de","patch-url":"https:\/\/tracker.orgmode.org\/patch\/yplmzfsrqjw6.fsf@mnet-mail.de","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/lisp\/org-agenda.el b\/lisp\/org-agenda.el\r\nindex b3c7294a2..968b6bd50 100644\r\n--- a\/lisp\/org-agenda.el\r\n+++ b\/lisp\/org-agenda.el\r\n@@ -6237,11 +6237,12 @@ defun org-agenda-show-clocking-issues\r\n \t      (setq issue\r\n \t\t    (format\r\n \t\t     \"No end time: (%s)\"\r\n-\t\t     (org-duration-from-minutes\r\n-\t\t      (floor\r\n-\t\t       (- (float-time (org-current-time))\r\n-\t\t\t  (float-time (org-time-string-to-time (match-string 1))))\r\n-\t\t       60)))\r\n+\t\t     (let ((diff (floor\r\n+\t\t                  (- (float-time (org-current-time))\r\n+\t\t\t             (float-time (org-time-string-to-time (match-string 1))))\r\n+\t\t                  60)))\r\n+                       (concat (if (> 0 diff) \"-\" \"\")\r\n+                               (org-duration-from-minutes (abs diff)))))\r\n \t\t    face (or (plist-get pl :no-end-time-face) face))\r\n \t      (throw 'next t))\r\n \t    (setq ts (match-string 1)\r\n","subject":"[BUG] Incorrect time calculation in agenda clockcheck"},{"date":"2024-03-08T10:28:14.589Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ttlhhv7y.fsf@localhost","message-id":"87ttlhhv7y.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["87jzmrcwy9.fsf@localhost","87edczlf1t.fsf@bzg.fr","87wmqdxmds.fsf@bzg.fr","87edclz1r6.fsf@bzg.fr","874jdwn6hf.fsf@localhost","87il1xjl0q.fsf@localhost","87wmqudjaw.fsf@bzg.fr","CAJGZZeLmjKBVANMcX0eDKb+O7R0Nzuek8sSjoZRaY50tmmx6kw@mail.gmail.com","877cjk10gs.fsf@localhost"],"related-refs":["87ttlhhv7y.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87ttlhhv7y.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 2e170f073ae258d27680baf16f8db1aa2dcf9b78 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <2e170f073ae258d27680baf16f8db1aa2dcf9b78.1709893748.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Fri, 8 Mar 2024 13:28:12 +0300\r\nSubject: [PATCH] src\/bzg\/data.clj (get-data): Sort list of entries by date\r\n (latest first)\r\n\r\nLink: https:\/\/orgmode.org\/list\/87wmqdxmds.fsf@bzg.fr\r\n---\r\n src\/bzg\/data.clj | 2 ++\r\n 1 file changed, 2 insertions(+)\r\n\r\ndiff --git a\/src\/bzg\/data.clj b\/src\/bzg\/data.clj\r\nindex 99ab66d..333dd6a 100644\r\n--- a\/src\/bzg\/data.clj\r\n+++ b\/src\/bzg\/data.clj\r\n@@ -74,6 +74,8 @@\r\n                     :requests (fetch\/requests source-id search)\r\n                     :patches  (fetch\/patches source-id search)\r\n                     :news     (fetch\/news source-id search))\r\n+        ;; Display the latest first.\r\n+        resources (reverse (sort resources))\r\n         headers   (condp = format\r\n                     \"rss\"  {\"Content-Type\" \"application\/xml\"}\r\n                     \"md\"   {\"Content-Type\" \"text\/plain; charset=utf-8\"}\r\n-- \r\n2.43.0\r\n\r\n","subject":"Re: [DISCUSSION] Add \"Recent News\" to orgmode.org"},{"date":"2024-03-06T20:53:59.781Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/18e158981f3.f22980741623238.5132641315390000744@excalamus.com","message-id":"18e158981f3.f22980741623238.5132641315390000744@excalamus.com","config":false,"refs-count":3,"username":"Matt","related-refs":["18e158981f3.f22980741623238.5132641315390000744@excalamus.com"],"from":"matt@excalamus.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] ob-shell async incorrect table and value results"},{"date":"2024-03-05T22:43:45.081Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/s31r0gowbbn.fsf@gmail.com","message-id":"s31r0gowbbn.fsf@gmail.com","config":false,"refs-count":1,"username":"termux","references":["s31cys8xz4w.fsf@gmail.com"],"related-refs":["s31r0gowbbn.fsf@gmail.com"],"from":"grinn.amy@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/s31r0gowbbn.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/lisp\/ob-core.el b\/lisp\/ob-core.el\r\nindex 4dcfbd3b0..f60b4be12 100644\r\n--- a\/lisp\/ob-core.el\r\n+++ b\/lisp\/ob-core.el\r\n@@ -194,15 +194,20 @@ This string must include a \\\"%s\\\" which will be replaced by the results.\"\r\n   :package-version '(Org . \"9.1\")\r\n   :safe #'booleanp)\r\n \r\n-(defun org-babel-noweb-wrap (&optional regexp)\r\n+(defun org-babel-noweb-wrap (&optional regexp info)\r\n   \"Return regexp matching a Noweb reference.\r\n \r\n Match any reference, or only those matching REGEXP, if non-nil.\r\n \r\n When matching, reference is stored in match group 1.\"\r\n-  (concat (regexp-quote org-babel-noweb-wrap-start)\r\n-\t  (or regexp \"\\\\([^ \\t\\n]\\\\(?:.*?[^ \\t\\n]\\\\)?\\\\)\")\r\n-\t  (regexp-quote org-babel-noweb-wrap-end)))\r\n+  (let ((noweb (mapcar\r\n+                (lambda (token)\r\n+                  (if (stringp token) token (symbol-name token)))\r\n+                (org-babel-read\r\n+                 (format \"'(%s)\" (cdr (assq :noweb (nth 2 info))))))))\r\n+    (concat (regexp-quote (or (nth 1 noweb) org-babel-noweb-wrap-start))\r\n+\t    (or regexp \"\\\\([^ \\t\\n]\\\\(?:.*?[^ \\t\\n]\\\\)?\\\\)\")\r\n+\t    (regexp-quote (or (nth 2 noweb) org-babel-noweb-wrap-end)))))\r\n \r\n (defvar org-babel-src-name-regexp\r\n   \"^[ \\t]*#\\\\+name:[ \\t]*\"\r\n@@ -3116,7 +3121,7 @@ block but are passed literally to the \\\"example-block\\\".\"\r\n                                   (not (equal (cdr v) \"no\"))))))\r\n \t (noweb-re (format \"\\\\(.*?\\\\)\\\\(%s\\\\)\"\r\n \t\t\t   (with-current-buffer parent-buffer\r\n-\t\t\t     (org-babel-noweb-wrap)))))\r\n+\t\t\t     (org-babel-noweb-wrap nil info)))))\r\n     (unless (equal (cons parent-buffer\r\n                          (with-current-buffer parent-buffer\r\n                            (buffer-chars-modified-tick)))\r\n","subject":"Re: noweb-start and noweb-end header args"},{"date":"2024-02-26T09:42:48.053Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8734tfr2f0.fsf@bzg.fr","message-id":"8734tfr2f0.fsf@bzg.fr","config":false,"refs-count":1,"username":"Bastien Guerry","related-refs":["8734tfr2f0.fsf@bzg.fr"],"from":"bzg@bzg.fr","source-id":"emacs-orgmode@gnu.org","body":"The org-capture function is quite useful for some workflows, however,\r\nthe standard documentation for it quickly jumps into template writing\r\nwithout really explaining its use case. The following essay attempts\r\nto be a gentle introduction to org-capture. I will assume you are\r\nfamiliar with both Org and Emacs, but don\u2019t know anything about\r\norg-capture.\r\n\r\nhttps:\/\/howardism.org\/Technical\/Emacs\/capturing-intro.html\r\n\r\n-- \r\n Bastien Guerry\r\n\r\n","subject":"[BLOG] Org Capturing Introduction"},{"date":"2024-02-23T23:54:10.425Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ttlyloyr.fsf@posteo.net","message-id":"87ttlyloyr.fsf@posteo.net","config":false,"refs-count":1,"username":"Juan Manuel Mac\u00edas","related-refs":["87ttlyloyr.fsf@posteo.net"],"from":"maciaschain@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87ttlyloyr.fsf@posteo.net","source-id":"emacs-orgmode@gnu.org","patch-body":"From d211bf601db0dd5c01a3edda74cd1b37f1f9448c Mon Sep 17 00:00:00 2001\r\nFrom: Juan Manuel Macias <maciaschain@posteo.net>\r\nDate: Wed, 21 Feb 2024 20:44:58 +0100\r\nSubject: [PATCH] org-element.el: New element: Inline Special Block.\r\n\r\n* lisp\/ox-latex.el (org-latex-inline-special-block): A possible\r\nfunction for the LaTeX backend.\r\n* lisp\/ox.el (org-export-read-inline-special-block-attributes): read\r\noptional attributes.\r\n* lisp\/ox.el (org-export-inline-special-block-aliases): aliases for grouped attributes.\r\n---\r\n lisp\/org-element.el | 55 ++++++++++++++++++++++++++++++++++++++++++++-\r\n lisp\/ox-latex.el    | 36 +++++++++++++++++++++++++++++\r\n lisp\/ox.el          | 30 +++++++++++++++++++++++++\r\n 3 files changed, 120 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/lisp\/org-element.el b\/lisp\/org-element.el\r\nindex 6691ea44e..c430d934b 100644\r\n--- a\/lisp\/org-element.el\r\n+++ b\/lisp\/org-element.el\r\n@@ -272,6 +272,8 @@ specially in `org-element--object-lex'.\")\r\n \t\t\t       \"\\\\|\"))\r\n \t\t      ;; Objects starting with \"@\": export snippets.\r\n \t\t      \"@@\"\r\n+                      ;; Objects starting with \"&\": inline-special-blocks.\r\n+                      \"&\"\r\n \t\t      ;; Objects starting with \"{\": macro.\r\n \t\t      \"{{{\"\r\n \t\t      ;; Objects starting with \"<\" : timestamp\r\n@@ -313,7 +315,7 @@ specially in `org-element--object-lex'.\")\r\n   \"List of recursive element types aka Greater Elements.\")\r\n \r\n (defconst org-element-all-objects\r\n-  '(bold citation citation-reference code entity export-snippet\r\n+  '(bold citation citation-reference code entity export-snippet inline-special-block\r\n \t footnote-reference inline-babel-call inline-src-block italic line-break\r\n \t latex-fragment link macro radio-target statistics-cookie strike-through\r\n \t subscript superscript table-cell target timestamp underline verbatim)\r\n@@ -440,6 +442,7 @@ Don't modify it, set `org-element-affiliated-keywords' instead.\")\r\n       ;; Ignore inline babel call and inline source block as formulas\r\n       ;; are possible.  Also ignore line breaks and statistics\r\n       ;; cookies.\r\n+      (inline-special-block ,@standard-set)\r\n       (table-cell citation export-snippet footnote-reference link macro\r\n                   radio-target target timestamp ,@minimal-set)\r\n       (table-row table-cell)\r\n@@ -3535,6 +3538,54 @@ Assume point is at the beginning of the entity.\"\r\n \t  (org-element-property :name entity)\r\n \t  (when (org-element-property :use-brackets-p entity) \"{}\")))\r\n \r\n+;;;; inline special block\r\n+\r\n+(defun org-element-inline-special-block-parser ()\r\n+  \"Parse inline special block at point.\r\n+\r\n+When at an inline special block, return a new syntax node of\r\n+`inline-special-block' type containing `:begin', `:end', `:type',\r\n+`:parameters', `:contents-begin', `:contents-end' and\r\n+`:post-blank' as properties.  Otherwise, return nil.\r\n+\r\n+Assume point is at the beginning of the block.\"\r\n+  (save-excursion\r\n+    (when (looking-at \"&\\\\([_A-Za-z]+\\\\)[{[]\")\r\n+      (goto-char (- (match-end 0) 1))\r\n+      (let* ((begin (match-beginning 0))\r\n+             (parameters\r\n+              (let ((p (org-element--parse-paired-brackets ?\\[)))\r\n+                (and (org-string-nw-p p)\r\n+                     (replace-regexp-in-string \"\\n[ \\t]*\" \" \" (org-trim p)))))\r\n+             (contents-begin (when (looking-at-p \"{\") (+ (point) 1)))\r\n+             (type (org-element--get-cached-string\r\n+                    (match-string-no-properties 1)))\r\n+             (contents-end\r\n+              (progn\r\n+                (goto-char (- contents-begin 1))\r\n+                (org-element--parse-paired-brackets ?\\{)\r\n+                (- (point) 1)))\r\n+             (post-blank (skip-chars-forward \" \\t\"))\r\n+             (end (point)))\r\n+        (when contents-end\r\n+          (org-element-create\r\n+           'inline-special-block\r\n+           (list :type type\r\n+                 :parameters parameters\r\n+                 :contents-begin contents-begin\r\n+                 :contents-end contents-end\r\n+                 :begin begin\r\n+                 :end end\r\n+                 :post-blank post-blank)))))))\r\n+\r\n+(defun org-element-inline-special-block-interpreter (inline-special-block contents)\r\n+  \"Interpret INLINE SPECIAL BLOCK object as Org syntax.\"\r\n+  (let ((type (org-element-property :type inline-special-block))\r\n+        (opts (org-element-property :parameters inline-special-block)))\r\n+    (format \"&%s%s{%s}\"\r\n+            type\r\n+            (if opts (format \"[%s]\" opts) \"\")\r\n+            contents)))\r\n \r\n ;;;; Export Snippet\r\n \r\n@@ -5260,6 +5311,8 @@ to an appropriate container (e.g., a paragraph).\"\r\n \t\t\t          (org-element-strike-through-parser)))\r\n \t\t         (?@ (and (memq 'export-snippet restriction)\r\n \t\t\t          (org-element-export-snippet-parser)))\r\n+                         (?& (and (memq 'inline-special-block restriction)\r\n+                                  (org-element-inline-special-block-parser)))\r\n \t\t         (?{ (and (memq 'macro restriction)\r\n \t\t\t          (org-element-macro-parser)))\r\n \t\t         (?$ (and (memq 'latex-fragment restriction)\r\ndiff --git a\/lisp\/ox-latex.el b\/lisp\/ox-latex.el\r\nindex cfa2b8178..c0161716b 100644\r\n--- a\/lisp\/ox-latex.el\r\n+++ b\/lisp\/ox-latex.el\r\n@@ -101,6 +101,7 @@\r\n     (underline . org-latex-underline)\r\n     (verbatim . org-latex-verbatim)\r\n     (verse-block . org-latex-verse-block)\r\n+    (inline-special-block . org-latex-inline-special-block)\r\n     ;; Pseudo objects and elements.\r\n     (latex-math-block . org-latex-math-block)\r\n     (latex-matrices . org-latex-matrices))\r\n@@ -2095,6 +2096,41 @@ holding contextual information.\"\r\n    center-block (format \"\\\\begin{center}\\n%s\\\\end{center}\" contents) info))\r\n \r\n \r\n+;;;; Inline Special Block\r\n+\r\n+(defun org-latex-inline-special-block (inline-special-block contents info)\r\n+  \"Transcode an INLINE SPECIAL BLOCK element from Org to LaTeX.\r\n+CONTENTS holds the contents of the block.  INFO is a plist\r\n+holding contextual information.\"\r\n+  (let* ((type (org-element-property :type inline-special-block))\r\n+         (type-is-anon (string= \"_\" type))\r\n+\t (parameters (org-element-property :parameters inline-special-block))\r\n+\t (attributes (org-export-read-inline-special-block-attributes parameters))\r\n+         (alias (plist-get attributes :alias))\r\n+         (alias-plist (when alias (cdr (or (assoc alias (plist-get info :inline-special-block-aliases))\r\n+\t\t\t\t\t   (assoc alias org-export-inline-special-block-aliases)))))\r\n+\t (basic-format (if type-is-anon\r\n+                           (format \"%s\" contents)\r\n+                         (format \"\\\\%s{%s}\" type contents))))\r\n+    (if (not attributes)\r\n+        basic-format\r\n+      (let* ((attr-final (if alias-plist (append attributes alias-plist) attributes))\r\n+             (prelatex (plist-get attr-final :prelatex))\r\n+\t     (postlatex (plist-get attr-final :postlatex))\r\n+\t     (color (plist-get attr-final :color))\r\n+\t     (smallcaps (plist-get attr-final :smallcaps))\r\n+\t     (lang (plist-get attr-final :lang)))\r\n+        (concat\r\n+         (when (or color smallcaps type-is-anon) \"{\")\r\n+         (when smallcaps \"\\\\scshape{}\")\r\n+         (when color (format \"\\\\color{%s}\" color))\r\n+         (when lang (format \"\\\\foreignlanguage{%s}{\" lang))\r\n+         (if (not (or prelatex postlatex))\r\n+\t     basic-format\r\n+\t   (concat \"\\\\\" type prelatex \"{\" contents \"}\" postlatex))\r\n+         (when lang \"}\")\r\n+         (when (or color smallcaps type-is-anon) \"}\"))))))\r\n+\r\n ;;;; Clock\r\n \r\n (defun org-latex-clock (clock _contents info)\r\ndiff --git a\/lisp\/ox.el b\/lisp\/ox.el\r\nindex 5bf55ec3b..cbb6a8dcd 100644\r\n--- a\/lisp\/ox.el\r\n+++ b\/lisp\/ox.el\r\n@@ -149,6 +149,7 @@\r\n     (:with-tasks nil \"tasks\" org-export-with-tasks)\r\n     (:with-timestamps nil \"<\" org-export-with-timestamps)\r\n     (:with-title nil \"title\" org-export-with-title)\r\n+    (:inline-special-block-aliases nil \"inline-special-block-aliases\" org-export-inline-special-block-aliases)\r\n     (:with-todo-keywords nil \"todo\" org-export-with-todo-keywords)\r\n     ;; Citations processing.\r\n     (:cite-export \"CITE_EXPORT\" nil org-cite-export-processors))\r\n@@ -528,6 +529,11 @@ This option can also be set with the LANGUAGE keyword.\"\r\n   :type '(string :tag \"Language\")\r\n   :safe #'stringp)\r\n \r\n+(defcustom org-export-inline-special-block-aliases nil\r\n+  \"TODO\"\r\n+  :group 'org-export-general\r\n+  :type '(alist :value-type (group plist)))\r\n+\r\n (defcustom org-export-preserve-breaks nil\r\n   \"Non-nil means preserve all line breaks when exporting.\r\n This option can also be set with the OPTIONS keyword,\r\n@@ -3789,6 +3795,30 @@ will become the empty string.\"\r\n \t\t(cdr (nreverse (cons (funcall prepare-value s) result))))))))\r\n     (if property (plist-get attributes property) attributes)))\r\n \r\n+(defun org-export-read-inline-special-block-attributes (attributes)\r\n+  \"TODO\"\r\n+  (let* ((prepare-value\r\n+\t  (lambda (str)\r\n+\t    (save-match-data\r\n+\t      (cond ((member str '(nil \"\" \"nil\")) nil)\r\n+\t\t    ((string-match \"^\\\"\\\\(\\\"+\\\\)?\\\"$\" str)\r\n+\t\t     (or (match-string 1 str) \"\"))\r\n+\t\t    (t str)))))\r\n+\t (attributes\r\n+\t  (let ((value (list attributes)))\r\n+\t    (when value\r\n+\t      (let ((s (mapconcat #'identity value \" \")) result)\r\n+\t\t(while (string-match\r\n+\t\t\t\"\\\\(?:^\\\\|[ \\t]+\\\\)\\\\(:[-a-zA-Z0-9_]+\\\\)\\\\([ \\t]+\\\\|$\\\\)\"\r\n+\t\t\ts)\r\n+\t\t  (let ((value (substring s 0 (match-beginning 0))))\r\n+\t\t    (push (funcall prepare-value value) result))\r\n+\t\t  (push (intern (match-string 1 s)) result)\r\n+\t\t  (setq s (substring s (match-end 0))))\r\n+\t\t;; Ignore any string before first property with `cdr'.\r\n+\t\t(cdr (nreverse (cons (funcall prepare-value s) result))))))))\r\n+    attributes))\r\n+\r\n (defun org-export-get-caption (element &optional short)\r\n   \"Return caption from ELEMENT as a secondary string.\r\n \r\n-- \r\n2.43.2\r\n\r\n","subject":"inline-special-block with full implementation for LaTeX backend"},{"date":"2024-02-19T09:24:52.870Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87a5nwhkjq.fsf@localhost","message-id":"87a5nwhkjq.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["m2lenax5m6.fsf@me.com"],"related-refs":["87a5nwhkjq.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87a5nwhkjq.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From e01f5a56fff7b3a4c9ad016802a4da6a01053e22 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <e01f5a56fff7b3a4c9ad016802a4da6a01053e22.1708334729.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Mon, 19 Feb 2024 12:19:34 +0300\r\nSubject: [PATCH] Work around regexp size limitation for large number of link\r\n targets\r\nMIME-Version: 1.0\r\nContent-Type: text\/plain; charset=UTF-8\r\nContent-Transfer-Encoding: 8bit\r\n\r\n* lisp\/ol.el (org-target-link-regexp-limit): New constant defining\r\nmaximum regexp limit where `org-target-link-regexp' is still safe to\r\nuse without triggering \"Regexp too long\" error.\r\n(org-target-link-regexps): New variable holding a series of shorter\r\nregexps to be used instead of too long single\r\n`org-target-link-regexp'.\r\n(org--re-list-search-forward): New function like `re-search-forward',\r\nbut accepting a list of regexps.\r\n(org--re-list-looking-at): New function like `looking-at', but\r\naccepting a list of regexps.\r\n(org-update-radio-target-regexp): When `org-target-link-regexp' is too\r\nlong, set `org-target-link-regexps', partitioning the link target list\r\ninto smaller regexps.\r\n* lisp\/org-element.el (org-element-link-parser):\r\n(org-element--object-lex):\r\n* lisp\/org.el (org-activate-target-links): Use\r\n`org--re-list-search-forward' and `org--re-list-looking-at' when\r\n`org-target-link-regexps' is non-nil.\r\n* testing\/lisp\/test-org-element.el (test-org-element\/link-parser): Add\r\ntests.\r\n\r\nReported-by: Rudolf Adamkovi\u010d <salutis@me.com>\r\nLink: https:\/\/list.orgmode.org\/orgmode\/m2lenax5m6.fsf@me.com\/\r\n---\r\n lisp\/ol.el                       | 68 ++++++++++++++++++++++++++++++--\r\n lisp\/org-element.el              | 16 ++++++--\r\n lisp\/org.el                      |  4 +-\r\n testing\/lisp\/test-org-element.el | 17 ++++++++\r\n 4 files changed, 97 insertions(+), 8 deletions(-)\r\n\r\ndiff --git a\/lisp\/ol.el b\/lisp\/ol.el\r\nindex a680c43f3..6842fb8fe 100644\r\n--- a\/lisp\/ol.el\r\n+++ b\/lisp\/ol.el\r\n@@ -52,6 +52,7 @@ (declare-function org-before-first-heading-p \"org\" ())\r\n (declare-function org-do-occur \"org\" (regexp &optional cleanup))\r\n (declare-function org-element-at-point \"org-element\" (&optional pom cached-only))\r\n (declare-function org-element-cache-refresh \"org-element\" (pos))\r\n+(declare-function org-element-cache-reset \"org-element\" (&optional all no-persistence))\r\n (declare-function org-element-context \"org-element\" (&optional element))\r\n (declare-function org-element-lineage \"org-element-ast\" (datum &optional types with-self))\r\n (declare-function org-element-link-parser \"org-element\" ())\r\n@@ -532,6 +533,13 @@ (defconst org-radio-target-regexp (format \"<%s>\" org-target-regexp)\r\n \r\n (defvar-local org-target-link-regexp nil\r\n   \"Regular expression matching radio targets in plain text.\")\r\n+(defconst org-target-link-regexp-limit (ash 2 15)\r\n+  \"Maximum allowed length of regexp.\r\n+See MAX_BUF_SIZE in src\/regex-emacs.c\")\r\n+(defvar-local org-target-link-regexps nil\r\n+  \"List of regular expressions matching radio targets in plain text.\r\n+This list is non-nil, when a single regexp would be too long to match\r\n+all the possible targets, exceeding Emacs' regexp length limit.\")\r\n \r\n (defvar org-link-types-re nil\r\n   \"Matches a link that has a url-like prefix like \\\"http:\\\".\")\r\n@@ -2078,6 +2086,34 @@ (defun org-insert-link-global ()\r\n   (org-load-modules-maybe)\r\n   (org-run-like-in-org-mode 'org-insert-link))\r\n \r\n+(defun org--re-list-search-forward (regexp-list &optional bound noerror count)\r\n+  \"Like `re-search-forward', but REGEXP-LIST is a list of regexps.\r\n+BOUND, NOERROR, and COUNT are passed to `re-search-forward'.\"\r\n+  (let (result (min-found most-positive-fixnum)\r\n+               (pos-found nil)\r\n+               (min-found-data nil)\r\n+               (tail regexp-list))\r\n+    (while tail\r\n+      (setq result (save-excursion (re-search-forward (pop tail) bound t count)))\r\n+      (when (and result (< result min-found))\r\n+        (setq min-found result\r\n+              pos-found (match-end 0)\r\n+              min-found-data (match-data))))\r\n+    (if (= most-positive-fixnum min-found)\r\n+        (pcase noerror\r\n+          (`t nil)\r\n+          (_ (re-search-forward (car regexp-list) bound noerror count)))\r\n+      (set-match-data min-found-data)\r\n+      (goto-char pos-found))))\r\n+\r\n+(defun org--re-list-looking-at (regexp-list &optional inhibit-modify)\r\n+  \"Like `looking-at', but REGEXP-LIST is a list of regexps.\r\n+INHIBIT-MODIFY is passed to `looking-at'.\"\r\n+  (catch :found\r\n+    (while regexp-list\r\n+      (when (looking-at (pop regexp-list) inhibit-modify)\r\n+        (throw :found t)))))\r\n+\r\n ;;;###autoload\r\n (defun org-update-radio-target-regexp ()\r\n   \"Find all radio targets in this file and update the regular expression.\r\n@@ -2115,6 +2151,30 @@ (defun org-update-radio-target-regexp ()\r\n \t\t\ttargets\r\n \t\t\t\"\\\\|\")\r\n \t\t       after-re)))\r\n+    (setq org-target-link-regexps nil)\r\n+    (let (current-length sub-targets)\r\n+      (when (<= org-target-link-regexp-limit (length org-target-link-regexp))\r\n+        (while (or targets sub-targets)\r\n+          (when (and sub-targets\r\n+                     (or (not targets)\r\n+                         (>= (+ current-length (length (car targets)))\r\n+                            org-target-link-regexp-limit)))\r\n+            (push (concat before-re\r\n+                          (mapconcat\r\n+\t\t\t   (lambda (x)\r\n+\t\t\t     (replace-regexp-in-string\r\n+\t\t\t      \" +\" \"\\\\s-+\" (regexp-quote x) t t))\r\n+\t\t\t   (nreverse sub-targets)\r\n+\t\t\t   \"\\\\|\")\r\n+\t\t          after-re)\r\n+                  org-target-link-regexps)\r\n+            (setq current-length nil\r\n+                  sub-targets nil))\r\n+          (unless current-length\r\n+            (setq current-length (+ (length before-re) (length after-re))))\r\n+          (when targets (push (pop targets) sub-targets))\r\n+          (cl-incf current-length (length (car sub-targets))))\r\n+        (setq org-target-link-regexps (nreverse org-target-link-regexps))))\r\n     (unless (equal old-regexp org-target-link-regexp)\r\n       ;; Clean-up cache.\r\n       (let ((regexp (cond ((not old-regexp) org-target-link-regexp)\r\n@@ -2130,9 +2190,11 @@ (defun org-update-radio-target-regexp ()\r\n \t\t\t\t   after-re)))))\r\n \t(when (and (featurep 'org-element)\r\n                    (not (bound-and-true-p org-mode-loading)))\r\n-\t  (org-with-point-at 1\r\n-\t    (while (re-search-forward regexp nil t)\r\n-\t      (org-element-cache-refresh (match-beginning 1))))))\r\n+          (if org-target-link-regexps\r\n+              (org-element-cache-reset)\r\n+\t    (org-with-point-at 1\r\n+\t      (while (re-search-forward regexp nil t)\r\n+\t        (org-element-cache-refresh (match-beginning 1)))))))\r\n       ;; Re fontify buffer.\r\n       (when (memq 'radio org-highlight-links)\r\n \t(org-restart-font-lock)))))\r\ndiff --git a\/lisp\/org-element.el b\/lisp\/org-element.el\r\nindex 091059c6c..4ad7fe8c3 100644\r\n--- a\/lisp\/org-element.el\r\n+++ b\/lisp\/org-element.el\r\n@@ -3842,7 +3842,9 @@ (defun org-element-link-parser ()\r\n        ;; Type 1: Text targeted from a radio target.\r\n        ((and org-target-link-regexp\r\n \t     (save-excursion (or (bolp) (backward-char))\r\n-\t\t\t     (looking-at org-target-link-regexp)))\r\n+                             (if org-target-link-regexps\r\n+                                 (org--re-list-looking-at org-target-link-regexps)\r\n+                               (looking-at org-target-link-regexp))))\r\n \t(setq type \"radio\")\r\n \t(setq format 'plain)\r\n \t(setq link-end (match-end 1))\r\n@@ -5215,7 +5217,10 @@ (defun org-element--object-lex (restriction)\r\n \t\t       ((not (memq 'link restriction)) nil)\r\n \t\t       ((progn\r\n \t\t          (unless (bolp) (forward-char -1))\r\n-\t\t          (not (re-search-forward org-target-link-regexp nil t)))\r\n+\t\t          (not\r\n+                           (if org-target-link-regexps\r\n+                               (org--re-list-search-forward org-target-link-regexps nil t)\r\n+                             (re-search-forward org-target-link-regexp nil t))))\r\n \t\t        nil)\r\n \t\t       ;; Since we moved backward, we do not want to\r\n \t\t       ;; match again an hypothetical 1-character long\r\n@@ -5224,8 +5229,11 @@ (defun org-element--object-lex (restriction)\r\n \t\t       ;; beginning of line, we prevent this here.\r\n \t\t       ((and (= start (1+ (line-beginning-position)))\r\n \t\t\t     (= start (match-end 1)))\r\n-\t\t        (and (re-search-forward org-target-link-regexp nil t)\r\n-\t\t\t     (1+ (match-beginning 1))))\r\n+\t\t        (and\r\n+                         (if org-target-link-regexps\r\n+                             (org--re-list-search-forward org-target-link-regexps nil t)\r\n+                           (re-search-forward org-target-link-regexp nil t))\r\n+\t\t\t (1+ (match-beginning 1))))\r\n \t\t       (t (1+ (match-beginning 1))))))\r\n \t      found)\r\n          (save-excursion\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex ad2394ae3..0c0376a9e 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -5705,7 +5705,9 @@ (defun org-activate-target-links (limit)\r\n       ;; `org-target-link-regexp' matches one character before the\r\n       ;; actual target.\r\n       (unless (bolp) (forward-char -1))\r\n-      (when (re-search-forward org-target-link-regexp limit t)\r\n+      (when (if org-target-link-regexps\r\n+                (org--re-list-search-forward org-target-link-regexps limit t)\r\n+              (re-search-forward org-target-link-regexp limit t))\r\n \t(org-remove-flyspell-overlays-in (match-beginning 1) (match-end 1))\r\n \t(add-text-properties (match-beginning 1) (match-end 1)\r\n \t\t\t     (list 'mouse-face 'highlight\r\ndiff --git a\/testing\/lisp\/test-org-element.el b\/testing\/lisp\/test-org-element.el\r\nindex 93754bae5..61cd70693 100644\r\n--- a\/testing\/lisp\/test-org-element.el\r\n+++ b\/testing\/lisp\/test-org-element.el\r\n@@ -2378,6 +2378,23 @@ (ert-deftest test-org-element\/link-parser ()\r\n       (org-element-property\r\n        :type\r\n        (org-element-map (org-element-parse-buffer) 'link #'identity nil t)))))\r\n+  (should\r\n+   (equal\r\n+    \"radio\"\r\n+    (org-test-with-temp-text \"<<<radio>>><<<radio2>>><<<foo>>>A radio link\"\r\n+      (org-update-radio-target-regexp)\r\n+      (org-element-property\r\n+       :type\r\n+       (org-element-map (org-element-parse-buffer) 'link #'identity nil t)))))\r\n+  (should\r\n+   (equal\r\n+    \"radio\"\r\n+    (let ((org-target-link-regexp-limit 9))\r\n+      (org-test-with-temp-text \"<<<radio>>><<<radio2>>><<<foo>>>A radio link\"\r\n+        (org-update-radio-target-regexp)\r\n+        (org-element-property\r\n+         :type\r\n+         (org-element-map (org-element-parse-buffer) 'link #'identity nil t))))))\r\n   ;; Pathological case: radio target of length 1 at beginning of line\r\n   ;; not followed by spaces.\r\n   (should\r\n-- \r\n2.43.0\r\n\r\n","subject":"Re: Radio links work only in small numbers"},{"date":"2024-02-18T20:43:16.714Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/874je5tsim.fsf@strawberrytea.xyz","message-id":"874je5tsim.fsf@strawberrytea.xyz","config":false,"refs-count":4,"username":"StrawberryTea","related-refs":["874je5tsim.fsf@strawberrytea.xyz"],"from":"look@strawberrytea.xyz","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org :extend property bugfix does not work [9.7 (9.7-??-388ba5b @ \/home\/st\/.config\/emacs\/.local\/straight\/build-30.0.50\/org\/)]"},{"date":"2024-02-16T18:39:08.388Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/da1c380b-4d78-4e24-80a6-fd04704fd0a5@passiveobserver.com","message-id":"da1c380b-4d78-4e24-80a6-fd04704fd0a5@passiveobserver.com","config":false,"refs-count":2,"username":"Doug Headley via General discussions about Org-mode.","related-refs":["da1c380b-4d78-4e24-80a6-fd04704fd0a5@passiveobserver.com"],"from":"emacs-orgmode@gnu.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org parser error Invalid search bound (wrong side of point) [9.7 (9.7-??-7a6bb0904 @ \/Users\/dougheadley\/.config\/emacs\/.local\/straight\/build-29.2\/org\/)]"},{"date":"2024-02-12T15:23:28.636Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87v86wlud8.fsf@ccss.com","message-id":"87v86wlud8.fsf@ccss.com","config":false,"refs-count":4,"username":"","related-refs":["87v86wlud8.fsf@ccss.com"],"from":"hugh@ccss.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Recursive dependency when gnuplot added to org-babel-load-languages [9.1.13 (release_9.1.13-791-g842002 @ \/home\/hugh\/git\/org-mode\/lisp\/)]"},{"date":"2024-02-09T10:35:41.086Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87r0hmkjv5.fsf@ice9.digital","message-id":"87r0hmkjv5.fsf@ice9.digital","config":false,"refs-count":6,"username":"Morgan Willcock","related-refs":["87r0hmkjv5.fsf@ice9.digital"],"from":"morgan@ice9.digital","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Flyspell triggers \"Warning (org-element-cache): org-element--cache\" [9.6.18 ( @ \/home\/mwillcock\/.emacs.d\/elpa\/org-9.6.18\/)]"},{"date":"2024-02-04T17:50:28.014Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/18d753c1e8a.cfb3e1921191837.5665565128507976741@excalamus.com","message-id":"18d753c1e8a.cfb3e1921191837.5665565128507976741@excalamus.com","config":false,"refs-count":9,"username":"Matt","related-refs":["18d753c1e8a.cfb3e1921191837.5665565128507976741@excalamus.com"],"from":"matt@excalamus.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Prompt appears in async shell results"},{"date":"2024-02-02T17:45:34.893Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8712e7846134587a2021593191c5f393@posteo.net","message-id":"8712e7846134587a2021593191c5f393@posteo.net","config":false,"refs-count":4,"username":"","related-refs":["8712e7846134587a2021593191c5f393@posteo.net"],"from":"gerard.vermeulen@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG]: contradictory requirements between resolving links and noweb result block"},{"date":"2024-02-02T15:58:19.727Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87il36yhz2.fsf@localhost","message-id":"87il36yhz2.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["CAO48Bk-ema=eUaXS8P-nXFpmrhbTy78Nsw6=xL8W-Lz68P0wNA@mail.gmail.com"],"related-refs":["87il36yhz2.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[RFC] LaTeX - automatically configure encoding when exporting non-Latin languages"},{"date":"2024-01-30T12:27:28.478Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87jznr80p5.fsf@localhost","message-id":"87jznr80p5.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["18d4c963b2e.124d935012378350.8650834621085686252@excalamus.com","87sf2jwjhu.fsf@gmail.com","87fryigtx7.fsf@gmail.com"],"related-refs":["87jznr80p5.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Append wrapped results from babel block (was: Appending results from babel block)"},{"date":"2024-01-29T15:11:43.894Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ttmw41h5.fsf@localhost","message-id":"87ttmw41h5.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["87k07x8ls8.fsf@mat.ucm.es"],"related-refs":["87ttmw41h5.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87ttmw41h5.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From a4927f9ea530db180efdaea6bb01511c03bb1051 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <a4927f9ea530db180efdaea6bb01511c03bb1051.1706541069.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Mon, 29 Jan 2024 16:09:29 +0100\r\nSubject: [PATCH] lisp\/org-colview.el: Fix computing summary with low-level\r\n first child\r\n\r\n* lisp\/org-colview.el (org-columns--compute-spec): Do not assume that\r\nall the children of an entry have the same LAST-LEVEL.  Handle\r\nsituation when the first child has lower level:\r\n\r\n* Heading\r\n****** Child 1\r\n** Child 2\r\n** Child 3\r\n\r\nReported-by: Uwe Brauer <oub@mat.ucm.es>\r\nLink: https:\/\/orgmode.org\/list\/87wn8yj2i5.fsf@localhost\r\n---\r\n lisp\/org-colview.el | 6 +++---\r\n 1 file changed, 3 insertions(+), 3 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-colview.el b\/lisp\/org-colview.el\r\nindex b1b79257b..39ca01502 100644\r\n--- a\/lisp\/org-colview.el\r\n+++ b\/lisp\/org-colview.el\r\n@@ -1244,9 +1244,9 @@ (defun org-columns--compute-spec (spec &optional update)\r\n \t   ;; property `org-summaries', in alist whose key is SPEC.\r\n \t   (let* ((summary\r\n \t\t   (and summarize\r\n-\t\t\t(let ((values (append (and (\/= last-level inminlevel)\r\n-\t\t\t\t\t\t   (aref lvals last-level))\r\n-\t\t\t\t\t      (aref lvals inminlevel))))\r\n+\t\t\t(let ((values\r\n+                               (cl-loop for l from (1+ level) to lmax\r\n+                                        append (aref lvals l))))\r\n \t\t\t  (and values (funcall summarize values printf))))))\r\n \t     ;; Leaf values are not summaries: do not mark them.\r\n \t     (when summary\r\n-- \r\n2.43.0\r\n\r\n","subject":"Re: bizarre: checkbox in properties, counting does not work with subheadings"},{"date":"2024-01-24T19:29:26.740Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/rzm4h0r0i6bkh5.fsf@umass.edu","message-id":"rzm4h0r0i6bkh5.fsf@umass.edu","config":false,"refs-count":2,"username":"Alejandro P\u00e9rez Carballo","related-refs":["rzm4h0r0i6bkh5.fsf@umass.edu"],"from":"apc@umass.edu","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Asked to submit bug report: parse error? [9.7-pre (release_9.6.11-935-g6d7c79 @ \/Users\/apc\/.emacs.d\/straight\/build\/org\/)]"},{"date":"2024-01-21T11:47:33.356Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/878r4ihppr.fsf@localhost","message-id":"878r4ihppr.fsf@localhost","config":false,"refs-count":8,"username":"Ihor Radchenko","references":["87msthwbfz.fsf@localhost","CAOQTW-OMeyWYcLq8hDJ4MB10_4dOkvoNjKnFedLYP2z+-M6BAg@mail.gmail.com","87bkaak0ol.fsf@localhost","CO6PR01MB745259ED606FE0B5B3FF4FCBCB692@CO6PR01MB7452.prod.exchangelabs.com","87ttnyz0jv.fsf@gmail.com","87r0ir2ln8.fsf@gmail.com","87zfxewewe.fsf@localhost","87le91t13e.fsf@gmail.com","87o7dxu15h.fsf@gmail.com","871qapkkqt.fsf@localhost","87cyu9qt4e.fsf@localhost","87zfxgxb8m.fsf@localhost","87le8x3e0a.fsf@gmail.com","87sf4bsm1w.fsf@localhost","87wmsn6ghw.fsf@localhost","877ckhkmtd.fsf@localhost","87mstw18r4.fsf@gmail.com","CAOQTW-PYaV2hCHOhm9HfBKBVaGMyTx9ejQRC8v36XEx9_ErbyA@mail.gmail.com","CAOQTW-MdC=jiGf+3bEVtfww+izSZix7csBJ+mZ4eZ2BQHDR42w@mail.gmail.com","CO6PR01MB7452D9E5660E2176E7F966C3CB692@CO6PR01MB7452.prod.exchangelabs.com","CO6PR01MB74524A264F6698EF838E1C3CCB692@CO6PR01MB7452.prod.exchangelabs.com"],"related-refs":["87cyu9qt4e.fsf@localhost","878r4ihppr.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/878r4ihppr.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 68984a5a0a1df5a5a2619b579f23f70128e979cd Mon Sep 17 00:00:00 2001\r\nMessage-ID: <68984a5a0a1df5a5a2619b579f23f70128e979cd.1705837631.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Sun, 21 Jan 2024 12:44:32 +0100\r\nSubject: [PATCH] ess-request-a-process: Honor\r\n ess-gen-proc-buffer-name-function\r\n\r\n* lisp\/ess-inf.el (ess-request-a-process): Do not make processes not\r\nmatching `ess-gen-proc-buffer-name-function' current.\r\n---\r\n lisp\/ess-inf.el | 4 +++-\r\n 1 file changed, 3 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/lisp\/ess-inf.el b\/lisp\/ess-inf.el\r\nindex 9ca3f455..aaff314c 100644\r\n--- a\/lisp\/ess-inf.el\r\n+++ b\/lisp\/ess-inf.el\r\n@@ -820,7 +820,7 @@ (defun ess-request-a-process (message &optional noswitch ask-if-1)\r\n                            (delete-dups (list \"R\" \"S+\" (or (bound-and-true-p S+-dialect-name) \"S+\")\r\n                                               \"stata\" (or (bound-and-true-p STA-dialect-name) \"stata\")\r\n                                               \"julia\" \"SAS\")))))\r\n-         (pname-list (delq nil ;; keep only those matching dialect\r\n+         (pname-list (delq nil ;; keep only those matching dialect and `ess-gen-proc-buffer-name-function'\r\n                            (append\r\n                             (mapcar (lambda (lproc)\r\n                                       (and (equal ess-dialect\r\n@@ -828,6 +828,8 @@ (defun ess-request-a-process (message &optional noswitch ask-if-1)\r\n                                                    'ess-dialect\r\n                                                    (process-buffer (get-process (car lproc)))))\r\n                                            (not (equal ess-local-process-name (car lproc)))\r\n+                                           (equal (buffer-name (process-buffer (get-process (car lproc))))\r\n+                                                  (funcall ess-gen-proc-buffer-name-function (car lproc)))\r\n                                            (car lproc)))\r\n                                     ess-process-name-list)\r\n                             ;; append local only if running\r\n-- \r\n2.43.0\r\n\r\n","subject":"[PATCH] Add buffer-local setting to request specific ESS process\/session name (was: [PATCH] Set Python shell in Org edit buffer)"},{"date":"2024-01-19T13:01:04.083Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/trinity-c46f8017-5e19-4708-bbf8-34328cf66590-1705573190179@3c-app-gmx-bs21","message-id":"trinity-c46f8017-5e19-4708-bbf8-34328cf66590-1705573190179@3c-app-gmx-bs21","config":false,"refs-count":2,"username":"","references":["mailman.55.1705510808.17102.emacs-orgmode@gnu.org"],"related-refs":["trinity-c46f8017-5e19-4708-bbf8-34328cf66590-1705573190179@3c-app-gmx-bs21"],"from":"Christof.Jung@gmx.de","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Invalid search bound (wrong side of point) [9.6.6 (release_9.6.6 @ c:\/Program Files\/Emacs\/emacs-29.1\/share\/emacs\/29.1\/lisp\/org\/)]"},{"date":"2024-01-18T12:02:50.137Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87edeej1ar.fsf@localhost","message-id":"87edeej1ar.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","related-refs":["87edeej1ar.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Tangling code blocks inside encrypted subtrees"},{"date":"2024-01-17T00:08:21.679Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8734uwhlhj.fsf@gmail.com","message-id":"8734uwhlhj.fsf@gmail.com","config":false,"refs-count":14,"username":"Nathaniel Nicandro","references":["87le9wq2dg.fsf@localhost","871qjobhwa.fsf@localhost","877cueonkj.fsf@localhost","878rev1q0k.fsf@gmail.com","874jpuijpc.fsf@gmail.com","87y1n6igvo.fsf@localhost","87zg6dez93.fsf@gmail.com","877ct5fzt6.fsf@gmail.com","87msvcgjgv.fsf@gmail.com","87a5y1mnj0.fsf@localhost"],"related-refs":["87plmbygp4.fsf@gmail.com","87wmm5yn1m.fsf@gmail.com","8734uwhlhj.fsf@gmail.com","871pz9zc0d.fsf@gmail.com"],"from":"nathanielnicandro@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/8734uwhlhj.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 506e8c1e5a177b797a541b1541ea98c95668d5e1 Mon Sep 17 00:00:00 2001\r\nFrom: Nathaniel Nicandro <nathanielnicandro@gmail.com>\r\nDate: Tue, 9 May 2023 19:58:11 -0500\r\nSubject: [PATCH] Highlight ANSI escape sequences\r\n\r\n* etc\/ORG-NEWS: Describe the new feature.\r\n* org.el (org-fontify-ansi-sequences): New customization variable and\r\nfunction which does the work of fontifying the sequences.\r\n(org-ansi-highlightable-elements)\r\n(org-ansi-highlightable-objects): New customization variables.\r\n(org-ansi-new-context, org-ansi-process-region)\r\n(org-ansi-process-block, org-ansi-process-paragraph)\r\n(org-ansi-process-fixed-width)\r\n(org-fontify-ansi-sequences-1): New functions.\r\n(org-ansi--control-seq-regexp): New variable.\r\n(org-set-font-lock-defaults): Add the `org-fontify-ansi-sequences`\r\nfunction to the font-lock keywords.\r\n(org-unfontify-region): Delete ANSI specific overlays.\r\n(org-ansi-mode): New minor mode to enable\/disable highlighting of the\r\nsequences.  Enabled in Org buffers by default.\r\n---\r\n etc\/ORG-NEWS |  12 +++\r\n lisp\/org.el  | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++\r\n 2 files changed, 281 insertions(+)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 1207d6f..76a81e3 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -492,6 +492,18 @@ Currently implemented options are:\r\n   iCalendar programs support this usage.\r\n \r\n ** New features\r\n+*** ANSI escape sequences are now highlighted in the whole buffer\r\n+\r\n+A new customization ~org-fontify-ansi-sequences~ is available which\r\n+tells Org to highlight all ANSI sequences in the buffer if non-nil and\r\n+the new minor mode ~org-ansi-mode~ is enabled.\r\n+\r\n+To disable highlighting of the sequences you can either\r\n+disable ~org-ansi-mode~ or set ~org-fontify-ansi-sequences~ to ~nil~\r\n+and =M-x org-mode-restart RET=.  Doing the latter will disable\r\n+highlighting of sequences in all newly opened Org buffers whereas\r\n+doing the former disables highlighting locally to the current buffer.\r\n+\r\n *** =ob-plantuml.el=: Support tikz file format output\r\n \r\n =ob-plantuml.el= now output =tikz= :file format via\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex d2cd0b9..6e4744e 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -81,6 +81,7 @@ (eval-when-compile (require 'gnus-sum))\r\n (require 'calendar)\r\n (require 'find-func)\r\n (require 'format-spec)\r\n+(require 'ansi-color)\r\n \r\n (condition-case nil\r\n     (load (concat (file-name-directory load-file-name)\r\n@@ -3608,6 +3609,12 @@ (defcustom org-fontify-whole-block-delimiter-line t\r\n   :group 'org-appearance\r\n   :type 'boolean)\r\n \r\n+(defcustom org-fontify-ansi-sequences t\r\n+  \"Non-nil means to highlight ANSI escape sequences.\"\r\n+  :group 'org-appearance\r\n+  :type 'boolean\r\n+  :package-version '(Org . \"9.7\"))\r\n+\r\n (defcustom org-highlight-latex-and-related nil\r\n   \"Non-nil means highlight LaTeX related syntax in the buffer.\r\n When non-nil, the value should be a list containing any of the\r\n@@ -5598,6 +5605,243 @@ (defun org-fontify-extend-region (beg end _old-len)\r\n \t     (cons beg (or (funcall extend \"end\" \"]\" 1) end)))\r\n \t    (t (cons beg end))))))\r\n \r\n+(defcustom org-ansi-highlightable-elements\r\n+  '(plain-list drawer headline inlinetask\r\n+    example-block export-block fixed-width paragraph)\r\n+  \"A list of element types that will have ANSI sequences processed.\"\r\n+  :type '(list (symbol :tag \"Element Type\"))\r\n+  :version \"9.7\"\r\n+  :group 'org-appearance)\r\n+\r\n+(defcustom org-ansi-highlightable-objects\r\n+  '(bold code export-snippet italic macro\r\n+    strike-through table-cell underline verbatim)\r\n+  \"A list of object types that will have ANSI sequences processed.\"\r\n+  :type '(list (symbol :tag \"Object Type\"))\r\n+  :version \"9.7\"\r\n+  :group 'org-appearance)\r\n+\r\n+(defun org-ansi-new-context (pos)\r\n+  (list (list (make-bool-vector 8 nil)\r\n+              nil nil)\r\n+        (copy-marker pos)))\r\n+\r\n+;; Only match color sequences (escape codes ending with an m).\r\n+;;\r\n+;; This effectively means that other control sequences won't get\r\n+;; conveniently hidden.\r\n+(defvar org-ansi--control-seq-regexp \"\\e\\\\[[\\x30-\\x3F]*[\\x20-\\x2F]*m\")\r\n+\r\n+(defun org-ansi-process-region (beg end &optional context)\r\n+  (or context (setq context (org-ansi-new-context beg)))\r\n+  (move-marker (cadr context) beg)\r\n+  (let ((ansi-color-context-region context)\r\n+        (ansi-color-control-seq-regexp org-ansi--control-seq-regexp)\r\n+        (ansi-color-apply-face-function\r\n+         (lambda (beg end face)\r\n+           (when face\r\n+             (font-lock-prepend-text-property beg end 'face face)\r\n+             (add-text-properties beg end '(font-lock-multiline t))))))\r\n+    (ansi-color-apply-on-region beg end t))\r\n+  (save-excursion\r\n+    (goto-char beg)\r\n+    (while (re-search-forward org-ansi--control-seq-regexp end t)\r\n+      (let ((beg (match-beginning 0))\r\n+            (end (point)))\r\n+        (dolist (ov (overlays-at beg))\r\n+          (when (and (= beg (overlay-start ov))\r\n+                     (= end (overlay-end ov))\r\n+                     (overlay-get ov 'invisible))\r\n+            ;; Assume this is the overlay added by\r\n+            ;; `ansi-color-apply-on-region'\r\n+            (overlay-put ov 'org-ansi t)))))))\r\n+\r\n+(defun org-ansi-process-block (el &optional context)\r\n+  (let ((beg (org-element-property :begin el))\r\n+        (end (org-element-property :end el)))\r\n+    (save-excursion\r\n+      (goto-char beg)\r\n+      (while (org-at-keyword-p)\r\n+        (forward-line))\r\n+      (setq beg (line-beginning-position 2)))\r\n+    (save-excursion\r\n+      (goto-char end)\r\n+      (skip-chars-backward \" \\t\\n\")\r\n+      (setq end (line-beginning-position)))\r\n+    (org-ansi-process-region beg end context)))\r\n+\r\n+(defun org-ansi-process-paragraph (el &optional context)\r\n+  ;; Compute the regions of the paragraph excluding inline\r\n+  ;; source blocks.\r\n+  (let ((pend (org-element-property :contents-end el)) beg end)\r\n+    (push (point) beg)\r\n+    (while (re-search-forward\r\n+            \"\\\\<src_\\\\([^ \\t\\n[{]+\\\\)[{[]\" pend t)\r\n+      (let ((el (org-element-context)))\r\n+        (when (eq (org-element-type el) 'inline-src-block)\r\n+          (push (org-element-property :begin el) end)\r\n+          (goto-char (org-element-property :end el))\r\n+          (push (point) beg))))\r\n+    (push pend end)\r\n+    (let ((ansi-context (or context (org-ansi-new-context (point)))))\r\n+      (while beg\r\n+        (org-ansi-process-region (pop beg) (pop end) ansi-context)))))\r\n+\r\n+(defun org-ansi-process-fixed-width (el &optional context)\r\n+  (org-ansi-process-region\r\n+   (org-element-property :begin el)\r\n+   (save-excursion\r\n+     (goto-char (org-element-property :end el))\r\n+     (skip-chars-backward \" \\t\\n\")\r\n+     (point))\r\n+   context))\r\n+\r\n+(defun org-fontify-ansi-sequences-1 (limit &optional ansi-context)\r\n+  (let ((skip-to-end-p\r\n+         (lambda (el)\r\n+           (or (null (org-element-property :contents-begin el))\r\n+               (<= (org-element-property :contents-end el)\r\n+                   (point)\r\n+                   (org-element-property :end el))))))\r\n+    (while (< (point) limit)\r\n+      (let* ((el (org-element-at-point))\r\n+             (type (org-element-type el)))\r\n+        (pcase type\r\n+          ;; Greater elements\r\n+          ((or `headline `inlinetask `item\r\n+               `center-block `quote-block `special-block\r\n+               `drawer)\r\n+           (if (funcall skip-to-end-p el)\r\n+               (goto-char (org-element-property :end el))\r\n+             (goto-char (org-element-property :contents-begin el))))\r\n+          ((or `dynamic-block `footnote-definition `property-drawer)\r\n+           (goto-char (org-element-property :end el)))\r\n+          (`plain-list\r\n+           (let ((end (org-element-property :end el)))\r\n+             (goto-char (org-element-property :contents-begin el))\r\n+             (while (< (point) end)\r\n+               ;; Move to within the first item of a list.\r\n+               (forward-char)\r\n+               (let* ((item (org-element-at-point))\r\n+                      (cbeg (org-element-property :contents-begin item)))\r\n+                 (when cbeg\r\n+                   (goto-char cbeg)\r\n+                   (org-fontify-ansi-sequences-1\r\n+                    (org-element-property :contents-end item)\r\n+                    ansi-context))\r\n+                 (goto-char (org-element-property :end item))\r\n+                 (skip-chars-forward \" \\t\\n\")))))\r\n+          (`table\r\n+           (if (funcall skip-to-end-p el)\r\n+               (goto-char (org-element-property :end el))\r\n+             (goto-char (org-element-property :contents-begin el))\r\n+             ;; Move to within the table-row of a table to continue\r\n+             ;; processing it.\r\n+             (forward-char)))\r\n+          ;; Lesser elements\r\n+          (`table-row\r\n+           (if (eq (org-element-property :type el) 'rule)\r\n+               (goto-char (org-element-property :end el))\r\n+             (let ((end-1 (1- (org-element-property :end el))))\r\n+               (goto-char (org-element-property :contents-begin el))\r\n+               (while (< (point) end-1)\r\n+                 (let ((cell (org-element-context)))\r\n+                   (org-ansi-process-region\r\n+                    (org-element-property :contents-begin cell)\r\n+                    (org-element-property :contents-end cell)\r\n+                    ansi-context)\r\n+                   (goto-char (org-element-property :end cell))))\r\n+               (forward-char))))\r\n+          ((or `example-block `export-block)\r\n+           (org-ansi-process-block el ansi-context)\r\n+           (goto-char (org-element-property :end el)))\r\n+          (`fixed-width\r\n+           (org-ansi-process-fixed-width el ansi-context)\r\n+           (goto-char (org-element-property :end el)))\r\n+          (`paragraph\r\n+           (org-ansi-process-paragraph el ansi-context)\r\n+           (goto-char (org-element-property :end el)))\r\n+          (_\r\n+           (goto-char (org-element-property :end el))))))))\r\n+\r\n+(defvar org-ansi-mode)\r\n+\r\n+(defun org-fontify-ansi-sequences (limit)\r\n+  \"Fontify ANSI sequences.\"\r\n+  (when (and org-fontify-ansi-sequences org-ansi-mode)\r\n+    (while (< (point) limit)\r\n+      (if (re-search-forward org-ansi--control-seq-regexp limit t)\r\n+          (let* ((ctx (progn\r\n+                        (goto-char (match-beginning 0))\r\n+                        (org-element-context)))\r\n+                 (type (org-element-type ctx)))\r\n+            (cond\r\n+             ((memq type org-ansi-highlightable-objects)\r\n+              ;; If the element-context is an object then there has not\r\n+              ;; been a sequence at the element level so limit the\r\n+              ;; effect of the sequence to the object.\r\n+              (org-ansi-process-region\r\n+               (point)\r\n+               (or (org-element-property :contents-end ctx)\r\n+                   (- (org-element-property :end ctx)\r\n+                      (org-element-property :post-blank ctx)\r\n+                      1))\r\n+               (org-ansi-new-context (point)))\r\n+              (goto-char (org-element-property :end ctx)))\r\n+             ((memq type org-ansi-highlightable-elements)\r\n+              (let ((el ctx))\r\n+                (while (and el (not (org-element-property :results el)))\r\n+                  (setq el (org-element-property :parent el)))\r\n+                (if (and el (not (eq el ctx)))\r\n+                    ;; If the element-context is a highlightable element\r\n+                    ;; that has an ancestor with a RESULTS affiliated\r\n+                    ;; keyword, process the full greater element with\r\n+                    ;; that keyword.\r\n+                    (if (not (memq (org-element-type el)\r\n+                                   org-ansi-highlightable-elements))\r\n+                        ;; Skip over the greater element if not\r\n+                        ;; highlightable.\r\n+                        (goto-char (org-element-property :end el))\r\n+                      (goto-char (org-element-property :begin el))\r\n+                      (add-text-properties\r\n+                       (point) (org-element-property :end el)\r\n+                       '(font-lock-multiline t))\r\n+                      (org-fontify-ansi-sequences-1\r\n+                       (or (org-element-property :contents-end el)\r\n+                           (org-element-property :end el))\r\n+                       (org-ansi-new-context (point)))\r\n+                      (goto-char (org-element-property :end el)))\r\n+                  ;; If the element-context is not a part of a greater\r\n+                  ;; element with a RESULTS affiliated keyword, then it\r\n+                  ;; is just a highlightable lesser element.  Process\r\n+                  ;; the element.\r\n+                  (pcase type\r\n+                    ((or `headline `inlinetask)\r\n+                     (org-ansi-process-region\r\n+                      (org-element-property :begin ctx)\r\n+                      (org-element-property :contents-begin ctx))\r\n+                     (goto-char (or (org-element-property :contents-begin ctx)\r\n+                                    (org-element-property :end ctx))))\r\n+                    ((or `example-block `export-block)\r\n+                     (org-ansi-process-block ctx)\r\n+                     (goto-char (org-element-property :end ctx)))\r\n+                    (`fixed-width\r\n+                     (org-ansi-process-fixed-width ctx)\r\n+                     (goto-char (org-element-property :end ctx)))\r\n+                    (`paragraph\r\n+                     (org-ansi-process-paragraph ctx)\r\n+                     (goto-char (org-element-property :end ctx)))\r\n+                    (_\r\n+                     (goto-char (org-element-property :end ctx)))))))\r\n+             (t\r\n+              (pcase type\r\n+                ((or `headline `inlinetask)\r\n+                 (goto-char (or (org-element-property :contents-begin ctx)\r\n+                                (org-element-property :end ctx))))\r\n+                (_\r\n+                 (goto-char (org-element-property :end ctx)))))))\r\n+        (goto-char limit)))))\r\n+\r\n (defun org-activate-footnote-links (limit)\r\n   \"Add text properties for footnotes.\"\r\n   (let ((fn (org-footnote-next-reference-or-definition limit)))\r\n@@ -5915,6 +6159,7 @@ (defun org-set-font-lock-defaults ()\r\n \t  ;; Blocks and meta lines\r\n \t  '(org-fontify-meta-lines-and-blocks)\r\n           '(org-fontify-inline-src-blocks)\r\n+          '(org-fontify-ansi-sequences)\r\n           ;; Citations.  When an activate processor is specified, if\r\n           ;; specified, try loading it beforehand.\r\n           (progn\r\n@@ -6094,6 +6339,9 @@ (defun org-unfontify-region (beg end &optional _maybe_loudly)\r\n \t\t\t    '(mouse-face t keymap t org-linked-text t\r\n \t\t\t\t\t invisible t intangible t\r\n \t\t\t\t\t org-emphasis t))\r\n+    (dolist (ov (overlays-in beg end))\r\n+      (when (overlay-get ov 'org-ansi)\r\n+        (delete-overlay ov)))\r\n     (org-fold-region beg end nil 'org-link)\r\n     (org-fold-region beg end nil 'org-link-description)\r\n     (org-fold-core-update-optimisation beg end)\r\n@@ -15582,6 +15830,27 @@ (defun org-agenda-prepare-buffers (files)\r\n     (when org-agenda-file-menu-enabled\r\n       (org-install-agenda-files-menu))))\r\n \r\n+\f\r\n+;;;; ANSI minor mode\r\n+\r\n+(define-minor-mode org-ansi-mode\r\n+  \"Toggle the minor `org-ansi-mode'.\r\n+This mode adds support to highlight ANSI sequences in Org mode.\r\n+The sequences are highlighted only if the customization\r\n+`org-fontify-ansi-sequences' is non-nil when the mode is enabled.\r\n+\\\\{org-ansi-mode-map}\"\r\n+  :lighter \" OANSI\"\r\n+  (org-restart-font-lock)\r\n+  (unless org-ansi-mode\r\n+    (org-with-wide-buffer\r\n+     (goto-char (point-min))\r\n+     (while (re-search-forward org-ansi--control-seq-regexp nil t)\r\n+       (dolist (ov (overlays-at (match-beginning 0)))\r\n+         (when (overlay-get ov 'org-ansi)\r\n+           (delete-overlay ov)))))))\r\n+\r\n+(add-hook 'org-mode-hook #'org-ansi-mode)\r\n+\r\n \f\r\n ;;;; CDLaTeX minor mode\r\n \r\n-- \r\n2.39.1\r\n\r\n","subject":"Re: [PATCH] Highlight ANSI sequences in the whole buffer (was [PATCH] ANSI color on example blocks and fixed width elements)"},{"date":"2024-01-16T23:24:41.013Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/eaec072b1971ea3dcada973141fdd172@posteo.net","message-id":"eaec072b1971ea3dcada973141fdd172@posteo.net","config":false,"refs-count":2,"username":"","related-refs":["eaec072b1971ea3dcada973141fdd172@posteo.net"],"from":"rameiko87@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] with org-agenda not loading properly after the diff command"},{"date":"2024-01-16T16:05:02.217Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871qahl0un.fsf@localhost","message-id":"871qahl0un.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["OS3P286MB25657ED1C2BF5C9AECCEEF0AF9732@OS3P286MB2565.JPNP286.PROD.OUTLOOK.COM"],"related-refs":["871qahl0un.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Change calling convention for when `org-link-file-path-type' is set to custom function (was: Enhancement Proposal for 'org-link-file-path-type' Behavior)"},{"date":"2024-01-11T14:55:18.513Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87bk9rkjeu.fsf@localhost","message-id":"87bk9rkjeu.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","related-refs":["87bk9rkjeu.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[TASK] Please help updating parser list on https:\/\/orgmode.org\/tools.html"},{"date":"2024-01-11T14:54:36.773Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87edenkjh5.fsf@localhost","message-id":"87edenkjh5.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","related-refs":["87edenkjh5.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[TASK] Please help updating blog generator list on https:\/\/orgmode.org\/tools.html"},{"date":"2024-01-10T12:17:25.797Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cyu9qt4e.fsf@localhost","message-id":"87cyu9qt4e.fsf@localhost","config":false,"refs-count":16,"username":"Ihor Radchenko","references":["87msthwbfz.fsf@localhost","CAOQTW-OMeyWYcLq8hDJ4MB10_4dOkvoNjKnFedLYP2z+-M6BAg@mail.gmail.com","87bkaak0ol.fsf@localhost","87ttnyz0jv.fsf@gmail.com","87r0ir2ln8.fsf@gmail.com","87zfxewewe.fsf@localhost","878r6647vv.fsf@localhost","87le91t13e.fsf@gmail.com","87o7dxu15h.fsf@gmail.com","87zfxgxb8m.fsf@localhost","87le8x3e0a.fsf@gmail.com","87sf4bsm1w.fsf@localhost","87wmsn6ghw.fsf@localhost","CAOQTW-NySineGSBKEdBjBPj1TORczkVwYAoM=nuZ+gKyvn_jJA@mail.gmail.com","87mstw18r4.fsf@gmail.com","87bkb2rqer.fsf@localhost","CAOQTW-MF14GT-+ZOmQ2=VaA-aymJN6aXDGtyQRGdyBtJP1LGaA@mail.gmail.com","CAOQTW-PYaV2hCHOhm9HfBKBVaGMyTx9ejQRC8v36XEx9_ErbyA@mail.gmail.com","CAOQTW-MdC=jiGf+3bEVtfww+izSZix7csBJ+mZ4eZ2BQHDR42w@mail.gmail.com","CAOQTW-N5zbZNEOEFZO6+Zu35T20-6cJ0m3nRBAKobEL1SKK99A@mail.gmail.com","87edfwsuvx.fsf@localhost"],"related-refs":["87cyu9qt4e.fsf@localhost","878r4ihppr.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Add buffer-local setting to request specific ESS process\/session name (was: [PATCH] Set Python shell in Org edit buffer)"},{"date":"2024-01-09T14:11:35.495Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87frz6y4s6.fsf@localhost","message-id":"87frz6y4s6.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["87pm5boofs.fsf@localhost","CAL1eYuK7GUx_=47e8+N5Jh+ZJnDexY+CDMUjPjJHNmcMiVVRrQ@mail.gmail.com","87ilcvdknx.fsf@localhost","64a000ea.170a0220.250a9.7355@mx.google.com","64612e34.170a0220.28faa.5dcb@mx.google.com","87v8gs4o88.fsf@localhost","87wn1cgjij.fsf@localhost","871qjiiziz.fsf@localhost","645fc094.170a0220.4d545.38e1@mx.google.com","64604168.170a0220.99926.5b4f@mx.google.com","6460f5e3.630a0220.b9085.17d2@mx.google.com","87o7mk3y72.fsf@localhost","64624762.170a0220.fd372.5c0d@mx.google.com","64611586.a70a0220.53db4.4151@mx.google.com","64646d12.170a0220.b780c.b216@mx.google.com","87sfa9p0sy.fsf@localhost","87lehrgwqn.fsf@localhost","64625a39.620a0220.e2d74.706d@mx.google.com","87v8gthnc9.fsf@localhost","646375bd.170a0220.b1c70.dbf1@mx.google.com","87a5y8iiak.fsf@localhost"],"related-refs":["87frz6y4s6.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87frz6y4s6.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 79fee381dc5ecbaed5bfe3ba66b11bb2a02aa97f Mon Sep 17 00:00:00 2001\r\nMessage-ID: <79fee381dc5ecbaed5bfe3ba66b11bb2a02aa97f.1704809509.git.yantar92@posteo.net>\r\nFrom: stardiviner <numbchild@gmail.com>\r\nDate: Sat, 1 Jul 2023 18:29:02 +0800\r\nSubject: [PATCH v6] org-fast-tag-selection: Limit the number of displayed tags\r\n\r\n* lisp\/org.el (org-fast-tag-selection): Do not print tags without\r\nexplicit bindings and tags outside groups when the number of displayed\r\ntags exceeds new customization.\r\n* lisp\/org.el (org-fast-tag-selection-maximum-tags): Add new custom\r\noption to set maximum tags number for fast tag selection.\r\n(org--fast-tag-selection-keys): New internal variable holding keys\r\navailable for auto-assigning tag bindings.\r\n* doc\/org-manual.org (org-fast-tag-selection-maximum-tags): Add new\r\ncustom option documentation.\r\n* etc\/ORG-NEWS: Declare this new custom option.\r\n\r\nCo-Authored-by: Ihor Radchenko <yantar92@posteo.net>\r\nLink: https:\/\/list.orgmode.org\/orgmode\/CAL1eYuK7GUx_=47e8+N5Jh+ZJnDexY+CDMUjPjJHNmcMiVVRrQ@mail.gmail.com\/\r\n---\r\n doc\/org-manual.org |  5 ++++\r\n etc\/ORG-NEWS       |  5 ++++\r\n lisp\/org.el        | 73 +++++++++++++++++++++++++++++++++++-----------\r\n 3 files changed, 66 insertions(+), 17 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex acc6d07ff..bb4b6e625 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -5090,6 +5090,11 @@ ** Setting Tags\r\n the special window is not even shown for single-key tag selection, it\r\n comes up only when you press an extra {{{kbd(C-c)}}}.\r\n \r\n+#+vindex: org-fast-tag-selection-maximum-tags\r\n+The number of tags displayed in the fast tag selection interface is\r\n+limited by ~org-fast-tag-selection-maximum-tags~ to avoid running out\r\n+of keyboard keys.  You can customize this variable.\r\n+\r\n ** Tag Hierarchy\r\n :PROPERTIES:\r\n :DESCRIPTION: Create a hierarchy of tags.\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex b808357d8..847ddf614 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -371,6 +371,11 @@ The change is breaking when ~org-use-property-inheritance~ is set to ~t~.\r\n \r\n The =TEST= parameter is better served by Emacs debugging tools.\r\n ** New and changed options\r\n+*** New option ~org-fast-tag-selection-maximum-tags~\r\n+\r\n+You can now limit the total number of tags displayed in the fast tag\r\n+selection interface.  Useful in buffers with huge number of tags.\r\n+\r\n *** New variable ~org-clock-out-removed-last-clock~\r\n \r\n The variable is intended to be used by ~org-clock-out-hook~.  It is a\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex 57379c26a..3d3099c48 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -2790,6 +2790,25 @@ (defcustom org-fast-tag-selection-single-key nil\r\n \t  (const :tag \"Yes\" t)\r\n \t  (const :tag \"Expert\" expert)))\r\n \r\n+(defvar org--fast-tag-selection-keys\r\n+  (string-to-list \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\")\r\n+  \"List of chars to be used as bindings by `org-fast-tag-selection'.\")\r\n+\r\n+(defcustom org-fast-tag-selection-maximum-tags (length org--fast-tag-selection-keys)\r\n+  \"Set the maximum tags number for fast tag selection.\r\n+This variable only affects tags without explicit key bindings outside\r\n+tag groups.  All the tags with user bindings and all the tags\r\n+corresponding to tag groups are always displayed.\r\n+\r\n+When the number of tags with bindings + tags inside tag groups is\r\n+smaller than `org-fast-tag-selection-maximum-tags', tags without\r\n+explicit bindings will be assigned a binding and displayed up to the\r\n+limit.\"\r\n+  :package-version '(Org . \"9.7\")\r\n+  :group 'org-tags\r\n+  :type 'number\r\n+  :safe #'numberp)\r\n+\r\n (defvar org-fast-tag-selection-include-todo nil\r\n   \"Non-nil means fast tags selection interface will also offer TODO states.\r\n This is an undocumented feature, you should not rely on it.\")\r\n@@ -11983,9 +12002,8 @@ (defun org-fast-tag-selection (current-tags inherited-tags tag-table &optional t\r\n \t (inherited-face 'org-done)\r\n \t (current-face 'org-todo)\r\n          ;; Characters available for auto-assignment.\r\n-         (tag-binding-char-list\r\n-          (eval-when-compile\r\n-            (string-to-list \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~\")))\r\n+         (tag-binding-char-list org--fast-tag-selection-keys)\r\n+         (tag-binding-chars-left org-fast-tag-selection-maximum-tags)\r\n          field-number ; current tag column in the completion buffer.\r\n          tag-binding-spec ; Alist element.\r\n          current-tag current-tag-char auto-tag-char\r\n@@ -11995,6 +12013,22 @@ (defun org-fast-tag-selection (current-tags inherited-tags tag-table &optional t\r\n \t (exit-after-next org-fast-tag-selection-single-key)\r\n \t (done-keywords org-done-keywords)\r\n \t groups ingroup intaggroup)\r\n+    ;; Calculate the number of tags with explicit user bindings + tags in groups.\r\n+    ;; These tags will be displayed unconditionally.  Other tags will\r\n+    ;; be displayed only when there are free bindings left according\r\n+    ;; to `org-fast-tag-selection-maximum-tags'.\r\n+    (dolist (tag-binding-spec tag-alist)\r\n+      (pcase tag-binding-spec\r\n+        (`((or :startgroup :startgrouptag) . _)\r\n+         (setq ingroup t))\r\n+        (`((or :endgroup :endgrouptag) . _)\r\n+         (setq ingroup nil))\r\n+        ((guard (cdr tag-binding-spec))\r\n+         (cl-decf tag-binding-chars-left))\r\n+        (`((or :newline :grouptags))) ; pass\r\n+        ((guard ingroup)\r\n+         (cl-decf tag-binding-chars-left))))\r\n+    (setq ingroup nil) ; It t, it means malformed tag alist.  Reset just in case.\r\n     ;; Move global `org-tags-overlay' overlay to current heading.\r\n     ;; Calls to `org-set-current-tags-overlay' will take care about\r\n     ;; updating the overlay text.\r\n@@ -12083,6 +12117,9 @@ (defun org-fast-tag-selection (current-tags inherited-tags tag-table &optional t\r\n \t     (if (cdr tag-binding-spec)\r\n                  ;; Custom binding.\r\n \t\t (setq current-tag-char (cdr tag-binding-spec))\r\n+               ;; No auto-binding.  Update `tag-binding-chars-left'.\r\n+               (unless (or ingroup intaggroup) ; groups are always displayed.\r\n+                 (cl-decf tag-binding-chars-left))\r\n \t       ;; Automatically assign a character according to the tag string.\r\n \t       (setq auto-tag-char\r\n                      (string-to-char\r\n@@ -12116,20 +12153,22 @@ (defun org-fast-tag-selection (current-tags inherited-tags tag-table &optional t\r\n \t\t\t\t               ((member current-tag inherited-tags) inherited-face))))\r\n \t     (when (equal (caar tag-alist) :grouptags)\r\n \t       (org-add-props current-tag nil 'face 'org-tag-group))\r\n-             ;; Insert the tag.\r\n-\t     (when (and (zerop field-number) (not ingroup) (not intaggroup)) (insert \"  \"))\r\n-\t     (insert \"[\" current-tag-char \"] \" current-tag\r\n-                     ;; Fill spaces up to FIELD-WIDTH.\r\n-                     (make-string\r\n-\t\t      (- field-width 4 (length current-tag)) ?\\ ))\r\n-             ;; Record tag and the binding\/auto-binding.\r\n-\t     (push (cons current-tag current-tag-char) tag-table-local)\r\n-             ;; Last column in the row.\r\n-\t     (when (= (cl-incf field-number) (\/ (- (window-width) 4) field-width))\r\n-\t       (unless (memq (caar tag-alist) '(:endgroup :endgrouptag))\r\n-\t         (insert \"\\n\")\r\n-\t         (when (or ingroup intaggroup) (insert \"  \")))\r\n-\t       (setq field-number 0)))))\r\n+             ;; Respect `org-fast-tag-selection-maximum-tags'.\r\n+             (when (or ingroup intaggroup (cdr tag-binding-spec) (> tag-binding-chars-left 0))\r\n+               ;; Insert the tag.\r\n+\t       (when (and (zerop field-number) (not ingroup) (not intaggroup)) (insert \"  \"))\r\n+\t       (insert \"[\" current-tag-char \"] \" current-tag\r\n+                       ;; Fill spaces up to FIELD-WIDTH.\r\n+                       (make-string\r\n+\t\t        (- field-width 4 (length current-tag)) ?\\ ))\r\n+               ;; Record tag and the binding\/auto-binding.\r\n+\t       (push (cons current-tag current-tag-char) tag-table-local)\r\n+               ;; Last column in the row.\r\n+\t       (when (= (cl-incf field-number) (\/ (- (window-width) 4) field-width))\r\n+\t         (unless (memq (caar tag-alist) '(:endgroup :endgrouptag))\r\n+\t           (insert \"\\n\")\r\n+\t           (when (or ingroup intaggroup) (insert \"  \")))\r\n+\t         (setq field-number 0))))))\r\n         (insert \"\\n\")\r\n         ;; Keep the tags in order displayed.  Will be used later for sorting.\r\n         (setq tag-table-local (nreverse tag-table-local))\r\n-- \r\n2.43.0\r\n\r\n","subject":"[PATCH v6] Re: Improve the performance of `org-set-tags-command` on large `org-tag-alist`"},{"date":"2024-01-05T13:05:36.392Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8734vc6iam.fsf@localhost","message-id":"8734vc6iam.fsf@localhost","config":false,"refs-count":5,"username":"Ihor Radchenko","references":["87il4e75u8.fsf@localhost"],"related-refs":["8734vc6iam.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/8734vc6iam.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 9754dea7cca1bc525d0b39cc31e7b0596c5a2bf8 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <9754dea7cca1bc525d0b39cc31e7b0596c5a2bf8.1704459551.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Sun, 31 Dec 2023 16:20:24 +0100\r\nSubject: [PATCH v2] doc\/org-manual.org (Summary): Clarify the Org markup is\r\n human-readable\r\n\r\nReadability of raw Org text is one of the core principles we maintain\r\nwhen designing Org markup language.  Let's state it explicitly in the\r\nmanual.\r\n---\r\n doc\/org-manual.org | 3 +++\r\n 1 file changed, 3 insertions(+)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 65aa5dd30..c6c37441f 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -22,6 +22,9 @@ ** Summary\r\n It relies on a lightweight plain-text markup language used in files\r\n with the =.org= extension.\r\n \r\n+Authoring Org files is best supported by Emacs, but you can view,\r\n+understand, and change them with any text editor.\r\n+\r\n As an authoring tool, Org helps you write structured documents and\r\n provides exporting facilities. Org files can also be used for literate\r\n programming and reproducible research.  As a TODO lists manager, Org\r\n-- \r\n2.42.0\r\n\r\n","subject":"[PATCH v2] doc\/org-manual.org (Summary): Clarify the Org markup is human-readable"},{"date":"2024-01-04T15:56:18.255Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87wmsphyzk.fsf@localhost","message-id":"87wmsphyzk.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","related-refs":["87wmsphyzk.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Any users setting `org-agenda-use-tag-inheritance' to nil or other non-default value?"},{"date":"2024-01-04T10:52:02.220Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/a142147a781384402547d49859fa3287@posteo.net","message-id":"a142147a781384402547d49859fa3287@posteo.net","config":false,"refs-count":1,"username":"","related-refs":["a142147a781384402547d49859fa3287@posteo.net"],"from":"gerard.vermeulen@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-lint shows strange spurious message before exporting to LaTeX"},{"date":"2023-12-30T21:16:57.871Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8734vjo0j0.fsf@ushin.org","message-id":"8734vjo0j0.fsf@ushin.org","config":false,"refs-count":1,"username":"Joseph Turner","references":["87o7e9ei3p.fsf@ushin.org","87a5pro14q.fsf@ushin.org","87wmsx3vyc.fsf@localhost"],"related-refs":["8734vjo0j0.fsf@ushin.org","87a5pro14q.fsf@ushin.org"],"from":"joseph@ushin.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/8734vjo0j0.fsf@ushin.org","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/lisp\/ol.el b\/lisp\/ol.el\r\nindex 20aab6bb8..947576ddb 100644\r\n--- a\/lisp\/ol.el\r\n+++ b\/lisp\/ol.el\r\n@@ -1097,12 +1097,16 @@ (defun org-link-open (link &optional arg)\r\n       ;; first need to integrate search option, if any.\r\n       (\"file\"\r\n        (let* ((option (org-element-property :search-option link))\r\n-\t      (path (if option (concat path \"::\" option) path)))\r\n-\t (org-link-open-as-file path\r\n-\t\t\t\t(pcase (org-element-property :application link)\r\n-\t\t\t\t  ((guard arg) arg)\r\n-\t\t\t\t  (\"emacs\" 'emacs)\r\n-\t\t\t\t  (\"sys\" 'system)))))\r\n+\t      (path (if option (concat path \"::\" option) path))\r\n+              (f (org-link-get-parameter org-current-uri-scheme :follow)))\r\n+\t (if (and (not (org-element-property :type-explicit-p link))\r\n+                  (functionp f))\r\n+             (funcall f path)\r\n+           (org-link-open-as-file path\r\n+\t\t\t\t  (pcase (org-element-property :application link)\r\n+\t\t\t\t    ((guard arg) arg)\r\n+\t\t\t\t    (\"emacs\" 'emacs)\r\n+\t\t\t\t    (\"sys\" 'system))))))\r\n       ;; Internal links.\r\n       ((or \"coderef\" \"custom-id\" \"fuzzy\" \"radio\")\r\n        (unless (run-hook-with-args-until-success 'org-open-link-functions path)\r\n","subject":"Re: Should org-link-parser add type \"file\" when link has no \"file:\" prefix?"},{"date":"2023-12-18T05:19:29.316Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/egjr423fnphv6hn2xphe5eui6ghzkz4l4eexdh4uhqwihmoxoz@qi4ylh66itz6","message-id":"egjr423fnphv6hn2xphe5eui6ghzkz4l4eexdh4uhqwihmoxoz@qi4ylh66itz6","config":false,"refs-count":2,"username":"Hammer Hu","related-refs":["egjr423fnphv6hn2xphe5eui6ghzkz4l4eexdh4uhqwihmoxoz@qi4ylh66itz6"],"from":"hammer@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/egjr423fnphv6hn2xphe5eui6ghzkz4l4eexdh4uhqwihmoxoz@qi4ylh66itz6","source-id":"emacs-orgmode@gnu.org","patch-body":"From 97ea5d017a2c9a889604fb5216ded59a1952e723 Mon Sep 17 00:00:00 2001\r\nFrom: hammerfunctor <topo20@protonmail.com>\r\nDate: Mon, 18 Dec 2023 00:01:39 -0500\r\nSubject: [PATCH 1\/3] New file\r\n\r\n---\r\n lisp\/ol-arxiv.el | 76 ++++++++++++++++++++++++++++++++++++++++++++++++\r\n 1 file changed, 76 insertions(+)\r\n create mode 100644 lisp\/ol-arxiv.el\r\n\r\ndiff --git a\/lisp\/ol-arxiv.el b\/lisp\/ol-arxiv.el\r\nnew file mode 100644\r\nindex 000000000..280b909f2\r\n--- \/dev\/null\r\n+++ b\/lisp\/ol-arxiv.el\r\n@@ -0,0 +1,76 @@\r\n+;;; ol-arxiv.el --- ARXIV links support in Org           -*- lexical-binding: t; -*-\r\n+\r\n+;; Copyright (C) 2023-2023 Free Software Foundation, Inc.\r\n+\r\n+;; Author: Zhengfei Hu <hammer@posteo.net>\r\n+\r\n+;; This file is part of GNU Emacs.\r\n+\r\n+;; GNU Emacs is free software: you can redistribute it and\/or modify\r\n+;; it under the terms of the GNU General Public License as published by\r\n+;; the Free Software Foundation, either version 3 of the License, or\r\n+;; (at your option) any later version.\r\n+\r\n+;; GNU Emacs is distributed in the hope that it will be useful,\r\n+;; but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n+;; GNU General Public License for more details.\r\n+\r\n+;; You should have received a copy of the GNU General Public License\r\n+;; along with GNU Emacs.  If not, see <https:\/\/www.gnu.org\/licenses\/>.\r\n+\r\n+;;; Commentary:\r\n+\r\n+;; This library introduces the \"arxiv\" link type in Org, and provides\r\n+;; code for opening and exporting such links.\r\n+\r\n+;;; Code:\r\n+\r\n+(require 'org-macs)\r\n+(org-assert-version)\r\n+\r\n+(require 'ol)\r\n+\r\n+(defcustom org-link-arxiv-server-url \"https:\/\/arxiv.org\/abs\/\"\r\n+  \"The URL of the ARXIV server.\"\r\n+  :group 'org-link-follow\r\n+  :version \"24.3\"\r\n+  :type 'string\r\n+  :safe #'stringp)\r\n+\r\n+(defun org-link-arxiv-open (path arg)\r\n+  \"Open a \\\"arxiv\\\" type link.\r\n+PATH is a the path to search for, as a string.\r\n+ARG is passed to `browse-url'.\"\r\n+  (browse-url (url-encode-url (concat org-link-arxiv-server-url path)) arg))\r\n+\r\n+(defun org-link-arxiv-export (path desc backend info)\r\n+  \"Export a \\\"arxiv\\\" type link.\r\n+PATH is the ARXIV name.  DESC is the description of the link, or\r\n+nil.  BACKEND is a symbol representing the backend used for\r\n+export.  INFO is a plist containing the export parameters.\"\r\n+  (let ((uri (concat org-link-arxiv-server-url path)))\r\n+    (pcase backend\r\n+      (`html\r\n+       (format \"<a href=\\\"%s\\\">%s<\/a>\" uri (or desc uri)))\r\n+      (`latex\r\n+       (if desc (format \"\\\\href{%s}{%s}\" uri desc)\r\n+\t (format \"\\\\url{%s}\" uri)))\r\n+      (`ascii\r\n+       (if (not desc) (format \"<%s>\" uri)\r\n+         (concat (format \"[%s]\" desc)\r\n+\t\t (and (not (plist-get info :ascii-links-to-notes))\r\n+\t\t      (format \" (<%s>)\" uri)))))\r\n+      (`texinfo\r\n+       (if (not desc) (format \"@uref{%s}\" uri)\r\n+         (format \"@uref{%s, %s}\" uri desc)))\r\n+      (_ uri))))\r\n+\r\n+(org-link-set-parameters \"arxiv\"\r\n+                         :follow #'org-link-arxiv-open\r\n+                         :export #'org-link-arxiv-export)\r\n+\r\n+\r\n+(provide 'org-link-arxiv)\r\n+(provide 'ol-arxiv)\r\n+;;; ol-arxiv.el ends here\r\n-- \r\n2.43.0\r\n\r\n","subject":"Adding support for arxiv type link"},{"date":"2023-12-11T14:19:20.814Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/874jgo95y0.fsf@localhost","message-id":"874jgo95y0.fsf@localhost","config":false,"refs-count":3,"username":"Ihor Radchenko","references":["yplmsf4ac6va.fsf@mnet-mail.de"],"related-refs":["yplmsf4ac6va.fsf@mnet-mail.de","874jgo95y0.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/874jgo95y0.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 6ffa23a01acad2d5cd37bafa11a57cf7a0c13cec Mon Sep 17 00:00:00 2001\r\nMessage-ID: <6ffa23a01acad2d5cd37bafa11a57cf7a0c13cec.1702304402.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Mon, 11 Dec 2023 15:17:41 +0100\r\nSubject: [PATCH] org-agenda-to-appt: Do not hard-code not-done todo keywords\r\n\r\n* lisp\/org-agenda.el (org-agenda-to-appt): Use org-todo-regexp and\r\norg-not-done-regexp to determine whether an even is already done.\r\n\r\nReported-by: Raffael Stocker <r.stocker@mnet-mail.de>\r\nLink: https:\/\/orgmode.org\/list\/yplmsf4ac6va.fsf@mnet-mail.de\r\n---\r\n lisp\/org-agenda.el | 10 ++++++++--\r\n 1 file changed, 8 insertions(+), 2 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-agenda.el b\/lisp\/org-agenda.el\r\nindex ac8adda7a..6a9b1cc5a 100644\r\n--- a\/lisp\/org-agenda.el\r\n+++ b\/lisp\/org-agenda.el\r\n@@ -11141,10 +11141,16 @@ (defun org-agenda-to-appt (&optional refresh filter &rest args)\r\n                                       (string-match cat-filter cat))\r\n                                  (and (stringp evt-filter)\r\n                                       (string-match evt-filter evt)))))))\r\n-              (wrn (get-text-property 1 'warntime x)))\r\n+              (wrn (get-text-property 1 'warntime x))\r\n+              (todo-regexp (get-text-property 1 'org-todo-regexp x))\r\n+              (not-done-regexp (get-text-property 1 'org-not-done-regexp x)))\r\n          ;; FIXME: Shall we remove text-properties for the appt text?\r\n          ;; (setq evt (set-text-properties 0 (length evt) nil evt))\r\n-         (when (and ok tod (not (string-match \"\\\\`DONE\\\\|CANCELLED\" evt)))\r\n+         (when (and ok tod\r\n+                    ;; Exclude done items unconditionally.\r\n+                    (or (not (and todo-regexp (string-match-p todo-regexp evt))) ; no todo keyword\r\n+                        (and not-done-regexp (string-match-p not-done-regexp evt)) ; or not done\r\n+                        ))\r\n            (setq tod (concat \"00\" (number-to-string tod)))\r\n            (setq tod (when (string-match\r\n                             \"\\\\([0-9]\\\\{1,2\\\\}\\\\)\\\\([0-9]\\\\{2\\\\}\\\\)\\\\'\" tod)\r\n-- \r\n2.42.0\r\n\r\n","subject":"Re: [BUG] Hard-coded and inconsistent todo states in org-agenda.el [9.7-pre (release_9.6.12-934-g4d72f3 @ \/home\/rst\/Devel\/org-mode\/lisp\/)]"},{"date":"2023-12-09T10:55:45.901Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87msujskxg.fsf@localhost","message-id":"87msujskxg.fsf@localhost","config":false,"refs-count":15,"username":"Ihor Radchenko","references":["87plzgbalt.fsf@localhost","CH3PR84MB34240DD3259A46D28C406019C58BA@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM","CH3PR84MB3424C475913C9D2A3F9EDD73C589A@CH3PR84MB3424.NAMPRD84.PROD.OUTLOOK.COM"],"related-refs":["87msujskxg.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow flattened imenu index (was: [PATCH] Add new option 'org-imenu-flatten')"},{"date":"2023-12-05T14:42:10.220Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2cyvrxrme.fsf@pc75-c847.uibk.ac.at","message-id":"m2cyvrxrme.fsf@pc75-c847.uibk.ac.at","config":false,"refs-count":4,"username":"Alexander Gogl","related-refs":["m2cyvrxrme.fsf@pc75-c847.uibk.ac.at"],"from":"gogl.alexander@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Please add custom command variable to org-latex-footnote-reference"},{"date":"2023-12-04T13:52:13.928Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87il5em5v4.fsf@localhost","message-id":"87il5em5v4.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["87ttqv6l2g.fsf@laptop.lockywolf.net","875y38b8ay.fsf@localhost"],"related-refs":["87il5em5v4.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87il5em5v4.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From d655c095fda6d1789a20aa93d4ac3a5f269dadc9 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <d655c095fda6d1789a20aa93d4ac3a5f269dadc9.1701697942.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Mon, 4 Dec 2023 14:47:53 +0100\r\nSubject: [PATCH] org-clock-auto-clockout: Honor system idle time.  Do not\r\n spawn multiple timers\r\n\r\n* lisp\/org-clock.el (org-clock--auto-clockout-timer-obj): New internal\r\nvariable holding the auto-clockout timer.\r\n(org-clock--auto-clockout-maybe): New function to be used in timer.\r\nUse `org-user-idle-seconds' to check for idleness.  Make sure that we\r\ncorrectly handle system idle time, which may be lesser than Emacs idle\r\ntime.\r\n(org-clock-auto-clockout): Do not create duplicate timers.  Use the\r\nnew internal helper function.\r\n\r\nReported-by: Vladimir Nikishkin <lockywolf@gmail.com>\r\nLink: https:\/\/orgmode.org\/list\/87ttqv6l2g.fsf@laptop.lockywolf.net\r\n---\r\n lisp\/org-clock.el | 35 ++++++++++++++++++++++++++++++++---\r\n 1 file changed, 32 insertions(+), 3 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-clock.el b\/lisp\/org-clock.el\r\nindex eda312d74..a042af4f3 100644\r\n--- a\/lisp\/org-clock.el\r\n+++ b\/lisp\/org-clock.el\r\n@@ -1493,6 +1493,33 @@ (defun org-clock-in (&optional select start-time)\r\n \t (message \"Clock starts at %s - %s\" ts org--msg-extra)\r\n \t (run-hooks 'org-clock-in-hook))))))\r\n \r\n+(defvar org-clock--auto-clockout-timer-obj nil\r\n+  \"Timer object holding the existing clockout timer.\")\r\n+(defun org-clock--auto-clockout-maybe ()\r\n+  \"Clock out the currently clocked in task when idle.\r\n+See `org-clock-auto-clockout-timer' to set the idle time span.\r\n+\r\n+This function is to be called by a timer.\"\r\n+  (when (and (numberp org-clock-auto-clockout-timer)\r\n+\t     org-clock-current-task)\r\n+    (let ((user-idle-seconds (org-user-idle-seconds)))\r\n+      (cond\r\n+       ;; Already idle.  Clock out.\r\n+       ((>= user-idle-seconds org-clock-auto-clockout-timer)\r\n+        (setq org-clock--auto-clockout-timer-obj nil)\r\n+        (org-clock-out))\r\n+       ;; Emacs is idle but system is not.  Retry assuming that system will remain idle.\r\n+       ((>= (org-emacs-idle-seconds) org-clock-auto-clockout-timer)\r\n+        (setq org-clock--auto-clockout-timer-obj\r\n+              (run-with-timer\r\n+               (- org-clock-auto-clockout-timer user-idle-seconds)\r\n+               nil #'org-clock--auto-clockout-maybe)))\r\n+       ;; Emacs is not idle.  Check again next time we are idle.\r\n+       (t\r\n+        (setq org-clock--auto-clockout-timer-obj\r\n+              (run-with-idle-timer\r\n+               org-clock-auto-clockout-timer nil #'org-clock--auto-clockout-maybe)))))))\r\n+\r\n (defun org-clock-auto-clockout ()\r\n   \"Clock out the currently clocked in task if Emacs is idle.\r\n See `org-clock-auto-clockout-timer' to set the idle time span.\r\n@@ -1500,9 +1527,11 @@ (defun org-clock-auto-clockout ()\r\n This is only effective when `org-clock-auto-clockout-insinuate'\r\n is present in the user configuration.\"\r\n   (when (and (numberp org-clock-auto-clockout-timer)\r\n-\t     org-clock-current-task)\r\n-    (run-with-idle-timer\r\n-     org-clock-auto-clockout-timer nil #'org-clock-out)))\r\n+\t     org-clock-current-task\r\n+             (not (timerp org-clock--auto-clockout-timer-obj)))\r\n+    (setq org-clock--auto-clockout-timer-obj\r\n+          (run-with-idle-timer\r\n+           org-clock-auto-clockout-timer nil #'org-clock--auto-clockout-maybe))))\r\n \r\n ;;;###autoload\r\n (defun org-clock-toggle-auto-clockout ()\r\n-- \r\n2.42.0\r\n\r\n","subject":"Re: [BUG] org-clock-auto-clockout does not actually use x11idle on X11 [9.6.8 (release_9.6.8-3-g21171d @ \/usr\/share\/emacs\/30.0.50\/lisp\/org\/)]"},{"date":"2023-11-30T21:06:57.444Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/4b7a6896122c1a8e84b812d7c8314143@posteo.de","message-id":"4b7a6896122c1a8e84b812d7c8314143@posteo.de","config":false,"refs-count":3,"username":"","related-refs":["4b7a6896122c1a8e84b812d7c8314143@posteo.de"],"from":"lukeflo@posteo.de","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Get \"Args out of range\" when trying to link heading with completion from inside a footnote"},{"date":"2023-11-11T08:57:41.835Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87sf5cr7na.fsf@gmail.com","message-id":"87sf5cr7na.fsf@gmail.com","config":false,"refs-count":8,"username":"Ilya Chernyshov","references":["87y1ilitzo.fsf@localhost","875y4viv14.fsf@localhost","87cz0xndem.fsf@gmail.com","87cz0wyw9m.fsf@localhost","878r78ftvs.fsf@localhost","87fs3zybvj.fsf@gmail.com"],"related-refs":["87sf5cr7na.fsf@gmail.com","871q9laku3.fsf@gmail.com","87wmrpu27p.fsf@localhost","87il3kw91t.fsf@gmail.com","874jeznz82.fsf@gmail.com","87cz0xndem.fsf@gmail.com","871qa4fcs5.fsf@localhost"],"from":"ichernyshovvv@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87sf5cr7na.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 3b38450f7de8bd168d8795728454d9f4db720843 Mon Sep 17 00:00:00 2001\r\nFrom: Ilya Chernyshov <ichernyshovvv@gmail.com>\r\nDate: Tue, 5 Sep 2023 22:40:59 +0700\r\nSubject: [PATCH] testing: Add testing\/lisp\/test-deduplicator.el\r\n\r\n* testing\/lisp\/test-deduplicator.el: Add test unit that checks for\r\nduplicate forms in ert tests.\r\n\r\n* testing\/lisp\/test-ob-lob.el (test-ob-lob\/caching-call-line,\r\ntest-ob-lob\/named-caching-call-line, test-ob\/just-one-results-block):\r\nIgnore duplicate forms via `org-test-ignore-duplicate'\r\n\r\n* testing\/lisp\/test-ob.el (test-ob\/just-one-results-block): Ignore\r\nduplicate forms via `org-test-ignore-duplicate'\r\n\r\n* testing\/lisp\/test-org.el (test-org\/goto-sibling,\r\ntest-org\/backward-element, test-org\/up-element): Ignore duplicate\r\nforms via `org-test-ignore-duplicate'\r\n---\r\n testing\/lisp\/test-deduplicator.el | 224 ++++++++++++++++++++++++++++++\r\n testing\/lisp\/test-ob-lob.el       |  10 +-\r\n testing\/lisp\/test-ob.el           |   3 +-\r\n testing\/lisp\/test-org.el          |  81 ++++++-----\r\n 4 files changed, 275 insertions(+), 43 deletions(-)\r\n create mode 100644 testing\/lisp\/test-deduplicator.el\r\n\r\ndiff --git a\/testing\/lisp\/test-deduplicator.el b\/testing\/lisp\/test-deduplicator.el\r\nnew file mode 100644\r\nindex 000000000..28b5d66f0\r\n--- \/dev\/null\r\n+++ b\/testing\/lisp\/test-deduplicator.el\r\n@@ -0,0 +1,224 @@\r\n+;;; test-deduplicator.el --- Tests for finding duplicates in Org tests  -*- lexical-binding: t; -*-\r\n+\r\n+;; Copyright (C) 2023  Ilya Chernyshov\r\n+;; Authors: Ilya Chernyshov <ichernyshovvv@gmail.com>\r\n+\r\n+;; This file is not part of GNU Emacs.\r\n+\r\n+;; This program is free software; you can redistribute it and\/or modify\r\n+;; it under the terms of the GNU General Public License as published by\r\n+;; the Free Software Foundation, either version 3 of the License, or\r\n+;; (at your option) any later version.\r\n+\r\n+;; This program is distributed in the hope that it will be useful,\r\n+;; but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n+;; GNU General Public License for more details.\r\n+\r\n+;; You should have received a copy of the GNU General Public License\r\n+;; along with this program.  If not, see <https:\/\/www.gnu.org\/licenses\/>.\r\n+;;\r\n+;;; Commentary:\r\n+\r\n+;; Unit tests that check for duplicate forms (including `should',\r\n+;; `should-not', `should-error') in all Org test files.  Forms are\r\n+;; considered duplicate if they are `equal-including-properties' and\r\n+;; nested at the same level.  To ignore a form or a group of forms,\r\n+;; wrap them in `org-test-ignore-duplicate'.\r\n+\r\n+;;; Code:\r\n+\r\n+(require 'org-test \"..\/testing\/org-test\")\r\n+\r\n+(defvar test-deduplicator-files\r\n+  (directory-files (expand-file-name \"lisp\" org-test-dir) t \"\\\\.el$\"))\r\n+\r\n+(defvar test-deduplicator-duplicate-forms nil\r\n+  \"A nested list of the form:\r\n+\r\n+  (((file test-name [(form-1 . numerical-order)\r\n+                     (form-2 . numerical-order) ...])\r\n+    (dup-form-1 . (numerical-order [numerical-order ...]))\r\n+  [ (dup-form-2 . (numerical-order [numerical-order ...]))\r\n+    (dup-form-3 . (numerical-order [numerical-order ...]))\r\n+     ...])\r\n+   \r\n+   ((file test-name [(form-1 . numerical-order)\r\n+                     (form-2 . numerical-order) ...])\r\n+    (dup-form-1 . (numerical-order [numerical-order ...]))\r\n+  [ (dup-form-2 . (numerical-order [numerical-order ...]))\r\n+    (dup-form-3 . (numerical-order [numerical-order ...]))\r\n+     ...])\r\n+\r\n+   ...\r\n+  )\r\n+\r\n+Where\r\n+\r\n+  (file test-name [(form-1 . numerical-order)\r\n+                   (form-2 . numerical-order) ...])\r\n+\r\n+is a path to duplicates.  For example, the path for the\r\n+duplicates in the following test:\r\n+\r\n+                                             test-ob-haskell-ghci.el\r\n+\r\n+  (ertdeftest ob-haskell\/session-named-none-means-one-shot-sessions ()\r\n+    \\\"When no session, use a new session.\r\n+  \\\"none\\\" is a special name that means `no session'.\\\"\r\n+    (let ((var-1 \\\"value\\\"))\r\n+     (when var-1\r\n+       (should-not (equal 2 (test-ob-haskell-ghci \\\":session \\\"none\\\"\\\" \\\"x\\\" nil)))\r\n+       (test-ob-haskell-ghci \\\":session none\\\" \\\"x=2\\\")\r\n+       (should-not (equal 2 (test-ob-haskell-ghci \\\":session \\\"none\\\"\\\" \\\"x\\\" nil)))\r\n+       (test-ob-haskell-ghci \\\":session none\\\" \\\"x=2\\\"))))\r\n+\r\n+would look like this:\r\n+\r\n+  (\\\"test-ob-haskell-ghci.el\\\"\r\n+    ob-haskell\/session-named-none-means-one-shot-sessions\r\n+    (let . 4) (when . 2))\r\n+\r\n+And the records about the duplicates would look like this:\r\n+\r\n+  ((test-ob-haskell-ghci \\\":session none\\\" \\\"x=2\\\") 5 3)\r\n+  ((should-not (equal 2 (test-ob-haskell-ghci \\\":session \\\"none\\\"\\\" \\\"x\\\" nil))) 4 2)\")\r\n+\r\n+(defvar test-deduplicator-forms nil\r\n+  \"Nested alist of found forms and paths to them (not filtered).\")\r\n+\r\n+(defmacro org-test-ignore-duplicate (&rest body)\r\n+  \"Eval BODY forms sequentially and return value of last one.\r\n+\r\n+The macro's body will be ignored by\r\n+`test-deduplicator\/detect-duplicate-tests' test to ignore\r\n+duplicate forms inside the body.\"\r\n+  (declare (indent 0))\r\n+  `(progn ,@body))\r\n+\r\n+(ert-deftest test-org-tests\/detect-duplicate-tests ()\r\n+  \"Try to find duplicate forms.\"\r\n+  \r\n+  (should-not (test-deduplicator-find-duplicates test-deduplicator-files)))\r\n+\r\n+(defun test-deduplicator-find-duplicates (files)\r\n+  \"Try to find duplicate forms in FILES.\r\n+\r\n+If duplicates are found, record them into\r\n+`test-deduplicator-duplicate-forms', `message' paths to them in a\r\n+human-readable format and return the value.\r\n+\r\n+Forms are considered duplicate if they are nested at the same\r\n+level.\"\r\n+  (setq test-deduplicator-forms nil)\r\n+  (dolist (file files)\r\n+    (with-current-buffer (find-file-noselect file)\r\n+      (save-excursion\r\n+        (goto-char (point-min))\r\n+        (while (search-forward \"(ert-deftest\" nil t)\r\n+          (goto-char (match-beginning 0))\r\n+          (ignore-errors\r\n+\t    (while-let ((form (or (read (current-buffer)) t)))\r\n+\t      (test-deduplicator-search-forms-recursively\r\n+               form (list file (cadr form)))))))))\r\n+  (setq test-deduplicator-duplicate-forms\r\n+        (seq-filter\r\n+         #'cdr (mapcar\r\n+                (lambda (file)\r\n+                  (cons\r\n+                   (car file)\r\n+                   (seq-filter #'caddr (cdr file))))\r\n+                test-deduplicator-forms)))\r\n+  (when test-deduplicator-duplicate-forms\r\n+    (let ((res (concat \"Found duplicates (To ignore duplicate forms,\\n\"\r\n+                       \"wrap them in `org-test-ignore-duplicate'):\\n\")))\r\n+      (dolist (path test-deduplicator-duplicate-forms)\r\n+        (let* ((file (file-relative-name (caar path)))\r\n+               (test-name (symbol-name (cadar path)))\r\n+               (path-inside-test (cddar path))\r\n+               (result \"\")\r\n+               (string-path (append (list file test-name)\r\n+                                    (mapcar (lambda (x)\r\n+                                              (symbol-name (car x)))\r\n+                                            path-inside-test)))\r\n+               (iter 0)\r\n+               (print-level 3))\r\n+          (dolist (x string-path)\r\n+            (cl-callf concat result\r\n+\t      (format \"%s%s\\n\" (make-string (* iter 2) ? ) x))\r\n+            (cl-incf iter))\r\n+          (cl-callf concat result\r\n+            (mapconcat\r\n+             (lambda (x) (format \"%s%S: %d times\\n\"\r\n+                                 (make-string (* iter 2) ? )\r\n+                                 (car x)\r\n+                                 (length (cdr x))))\r\n+             (cdr path)))\r\n+          (cl-callf concat res result)))\r\n+      (message \"%s\" res)))\r\n+  test-deduplicator-duplicate-forms)\r\n+\r\n+(defun test-deduplicator-search-forms-recursively (form form-path)\r\n+  \"Search for forms recursively in FORM.\r\n+\r\n+FORM-PATH is list of the form:\r\n+  (\\\"file-path\\\" ert-test-symbol\r\n+    (symbol-1 . sexp-order-1) (symbol-2 . sexp-order-2))\r\n+\r\n+Write each form to `test-deduplicator-forms'\"\r\n+  (dotimes (iter (length form))\r\n+    (pcase (car-safe (nth iter form))\r\n+      ((or `skip-unless `org-test-ignore-duplicate))\r\n+      ((pred (not null))\r\n+       (push iter (alist-get (nth iter form)\r\n+                             (alist-get form-path test-deduplicator-forms\r\n+                                        nil nil #'equal)\r\n+                             nil nil #'equal-including-properties))\r\n+       (unless (member (car-safe (nth iter form))\r\n+\t\t       '(should-not should should-error))\r\n+\t (test-deduplicator-search-forms-recursively\r\n+          (nth iter form)\r\n+          (append form-path (list (cons (car (nth iter form)) iter)))))))))\r\n+\r\n+;;; Tests\r\n+\r\n+(defvar test-deduplicator-file-path\r\n+  (expand-file-name \"test-deduplicator.el\"\r\n+                    (expand-file-name \"lisp\" org-test-dir)))\r\n+\r\n+(ert-deftest test-org-tests\/testing-test-deduplicator ()\r\n+  \"\"\r\n+  (should\r\n+   (equal\r\n+    (test-deduplicator-find-duplicates\r\n+     (list test-deduplicator-file-path))\r\n+    `(((,(expand-file-name \"lisp\/test-deduplicator.el\" org-test-dir)\r\n+        test-org-tests\/test-with-nested-duplicates)\r\n+       ((format \"%s\" \"string\") 7 5)\r\n+       ((let ((var \"string\")) (should (message \"123 %s\" var))) 6 4))\r\n+      (((expand-file-name \"lisp\/test-deduplicator.el\" org-test-dir)\r\n+        test-org-tests\/test-with-duplicates-at-root)\r\n+       ((should (message \"123\")) 6 4))))))\r\n+\r\n+;;; Tests with duplicate forms to check the deduplicator\r\n+\r\n+(ert-deftest test-org-tests\/test-with-duplicates-at-root ()\r\n+  \"Test with duplicates at the root.\"\r\n+  (should (message \"123\"))\r\n+  (format \"%s\" \"string\")\r\n+  (should\r\n+   (message \"123\")))\r\n+\r\n+(ert-deftest test-org-tests\/test-with-nested-duplicates ()\r\n+  \"Test with nested duplicates.\"\r\n+  (let ((var \"string\"))\r\n+    (should\r\n+     (message \"123 %s\" var)))\r\n+  (format \"%s\" \"string\")\r\n+  (let ((var \"string\"))\r\n+    (should (message \"123 %s\" var)))\r\n+  (format \"%s\" \"string\"))\r\n+\r\n+(provide 'test-deduplicator)\r\n+\r\n+;;; test-deduplicator.el ends here\r\ndiff --git a\/testing\/lisp\/test-ob-lob.el b\/testing\/lisp\/test-ob-lob.el\r\nindex 188fee4c0..66dfd0eab 100644\r\n--- a\/testing\/lisp\/test-ob-lob.el\r\n+++ b\/testing\/lisp\/test-ob-lob.el\r\n@@ -152,8 +152,9 @@ for export\r\n       (should\r\n        (eq (org-babel-execute-src-block nil (org-babel-lob-get-info)) 1))\r\n       ;; if cached, second evaluation will retain the t value\r\n-      (should\r\n-       (eq (org-babel-execute-src-block nil (org-babel-lob-get-info)) 1)))))\r\n+      (org-test-ignore-duplicate\r\n+        (should\r\n+         (eq (org-babel-execute-src-block nil (org-babel-lob-get-info)) 1))))))\r\n \r\n (ert-deftest test-ob-lob\/named-caching-call-line ()\r\n   (let ((temporary-value-for-test 0))\r\n@@ -170,8 +171,9 @@ for export\r\n       (should\r\n        (eq (org-babel-execute-src-block nil (org-babel-lob-get-info)) 1))\r\n       ;; if cached, second evaluation will retain the t value\r\n-      (should\r\n-       (eq (org-babel-execute-src-block nil (org-babel-lob-get-info)) 1)))))\r\n+      (org-test-ignore-duplicate\r\n+        (should\r\n+         (eq (org-babel-execute-src-block nil (org-babel-lob-get-info)) 1))))))\r\n \r\n (ert-deftest test-ob-lob\/assignment-with-newline ()\r\n   \"Test call lines with an argument containing a newline character.\"\r\ndiff --git a\/testing\/lisp\/test-ob.el b\/testing\/lisp\/test-ob.el\r\nindex 42c77ca56..0153de889 100644\r\n--- a\/testing\/lisp\/test-ob.el\r\n+++ b\/testing\/lisp\/test-ob.el\r\n@@ -645,7 +645,8 @@ duplicate results block.\"\r\n     (org-babel-execute-src-block)\r\n     (org-babel-execute-src-block)     ; second code block execution\r\n     (should (search-forward \"Hello\")) ; the string inside the source code block\r\n-    (should (search-forward \"Hello\")) ; the same string in the results block\r\n+    (org-test-ignore-duplicate\r\n+      (should (search-forward \"Hello\"))) ; the same string in the results block\r\n     (should-error (search-forward \"Hello\"))))\r\n \r\n (ert-deftest test-ob\/nested-code-block ()\r\ndiff --git a\/testing\/lisp\/test-org.el b\/testing\/lisp\/test-org.el\r\nindex 612bfa1e5..4e23488be 100644\r\n--- a\/testing\/lisp\/test-org.el\r\n+++ b\/testing\/lisp\/test-org.el\r\n@@ -2490,7 +2490,8 @@ Text.\r\n     (should-not (org-goto-sibling))\r\n     (should (org-goto-sibling 'previous))\r\n     (should (looking-at-p \"^\\\\*\\\\* Heading 2\"))\r\n-    (should (org-goto-sibling 'previous))\r\n+    (org-test-ignore-duplicate\r\n+      (should (org-goto-sibling 'previous)))\r\n     (should (looking-at-p \"^\\\\*\\\\* Heading 1\"))\r\n     (should-not (org-goto-sibling 'previous)))\r\n   ;; Inside heading.\r\n@@ -2533,7 +2534,8 @@ test <point>\r\n       (should-not (org-goto-sibling))\r\n       (should (org-goto-sibling 'previous))\r\n       (should (looking-at-p \"^\\\\*\\\\* Heading 2\"))\r\n-      (should (org-goto-sibling 'previous))\r\n+      (org-test-ignore-duplicate\r\n+        (should (org-goto-sibling 'previous)))\r\n       (should (looking-at-p \"^\\\\*\\\\* Heading 1\"))\r\n       (should-not (org-goto-sibling 'previous)))))\r\n \r\n@@ -5223,27 +5225,28 @@ Outside.\"\r\n     ;; 7.1. At beginning of sub-list: expected to move to the\r\n     ;;      paragraph before it.\r\n     (goto-line 4)\r\n-    (org-backward-element)\r\n-    (should (looking-at \"item1\"))\r\n-    ;; 7.2. At an item in a list: expected to move at previous item.\r\n-    (goto-line 8)\r\n-    (org-backward-element)\r\n-    (should (looking-at \"  - sub2\"))\r\n-    (goto-line 12)\r\n-    (org-backward-element)\r\n-    (should (looking-at \"- item1\"))\r\n-    ;; 7.3. At end of list\/sub-list: expected to move to list\/sub-list\r\n-    ;;      beginning.\r\n-    (goto-line 10)\r\n-    (org-backward-element)\r\n-    (should (looking-at \"  - sub1\"))\r\n-    (goto-line 15)\r\n-    (org-backward-element)\r\n-    (should (looking-at \"- item1\"))\r\n-    ;; 7.4. At blank-lines before list end: expected to move to top\r\n-    ;; item.\r\n-    (goto-line 14)\r\n-    (org-backward-element)\r\n+    (org-test-ignore-duplicate\r\n+      (org-backward-element)\r\n+      (should (looking-at \"item1\"))\r\n+      ;; 7.2. At an item in a list: expected to move at previous item.\r\n+      (goto-line 8)\r\n+      (org-backward-element)\r\n+      (should (looking-at \"  - sub2\"))\r\n+      (goto-line 12)\r\n+      (org-backward-element)\r\n+      (should (looking-at \"- item1\"))\r\n+      ;; 7.3. At end of list\/sub-list: expected to move to list\/sub-list\r\n+      ;;      beginning.\r\n+      (goto-line 10)\r\n+      (org-backward-element)\r\n+      (should (looking-at \"  - sub1\"))\r\n+      (goto-line 15)\r\n+      (org-backward-element)\r\n+      (should (looking-at \"- item1\"))\r\n+      ;; 7.4. At blank-lines before list end: expected to move to top\r\n+      ;; item.\r\n+      (goto-line 14)\r\n+      (org-backward-element))\r\n     (should (looking-at \"- item1\"))))\r\n \r\n (ert-deftest test-org\/up-element ()\r\n@@ -5281,21 +5284,23 @@ Outside.\"\r\n - item2\"\r\n     ;; 4.1. Within an item: move to the item beginning.\r\n     (goto-line 8)\r\n-    (org-up-element)\r\n-    (should (looking-at \"  - sub2\"))\r\n-    ;; 4.2. At an item in a sub-list: move to parent item.\r\n-    (goto-line 4)\r\n-    (org-up-element)\r\n-    (should (looking-at \"- item1\"))\r\n-    ;; 4.3. At an item in top list: move to beginning of whole list.\r\n-    (goto-line 10)\r\n-    (org-up-element)\r\n-    (should (looking-at \"- item1\"))\r\n-    ;; 4.4. Special case.  At very top point: should move to parent of\r\n-    ;;      list.\r\n-    (goto-line 2)\r\n-    (org-up-element)\r\n-    (should (looking-at \"\\\\* Top\"))))\r\n+    (org-test-ignore-duplicate\r\n+      (org-up-element)\r\n+      (should (looking-at \"  - sub2\"))\r\n+      ;; 4.2. At an item in a sub-list: move to parent item.\r\n+      (goto-line 4)\r\n+      (org-up-element)\r\n+      (should (looking-at \"- item1\"))\r\n+      ;; 4.3. At an item in top list: move to beginning of whole list.\r\n+      (goto-line 10)\r\n+      (org-up-element)\r\n+      (org-test-ignore-duplicate\r\n+        (should (looking-at \"- item1\")))\r\n+      ;; 4.4. Special case.  At very top point: should move to parent of\r\n+      ;;      list.\r\n+      (goto-line 2)\r\n+      (org-up-element)\r\n+      (should (looking-at \"\\\\* Top\")))))\r\n \r\n (ert-deftest test-org\/down-element ()\r\n   \"Test `org-down-element' specifications.\"\r\n-- \r\n2.41.0\r\n\r\n","subject":"Re: [PATCH] testing: Delete duplicate tests"},{"date":"2023-11-10T09:56:13.160Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87leb60w98.fsf@gmail.com","message-id":"87leb60w98.fsf@gmail.com","config":false,"refs-count":12,"username":"Mehmet Tekman","references":["87tttkghou.fsf@localhost","87wmyc1sud.fsf@localhost","CAHHeYzL1VyFVOrfBCG+k5-YWPkYa+U77s457YDGxtn8xqgCGwg@mail.gmail.com","CAHHeYzJ6koLOr9=K82bjGX3fo6RHRJcvgdhJ6Ym08uPavuXnXQ@mail.gmail.com","CAHHeYz+_HGfZR=A3-P16+yt+D0JR0T1NO67Urvo0XRGKiFmEmA@mail.gmail.com","CAHHeYzLZ7nVT8t=uzCjfWOUcXDNApWOtyc4cF9JSWdQFRhNz6w@mail.gmail.com","CAHHeYzK27g=Z_-DtC3osxTcdqAtOspRPnZi5U9tcpHc7Sqne8g@mail.gmail.com","87o7k48jcf.fsf@localhost","CAHHeYzJSODxNiX4TiZCawKxvotBFyAc-Wzt=cYBQ8FCwEN3V7g@mail.gmail.com","87r0ok1qx4.fsf@localhost","CAHHeYzJfBmhqmv-kgxeiquOMG79yJAp82pm1zRBT=ukvVijhqA@mail.gmail.com","CAHHeYzKQ0e-h6ddR3xkXkVeyNxfGERRuypXENQX3Xis9QDoxzw@mail.gmail.com","87o7jo1q2s.fsf@localhost","87o7jlzxgn.fsf@localhost","CAHHeYz+f5Va7epdu-ywacvuqs5zOYCdzs+ApSB-o=CHNJc4Lcg@mail.gmail.com","CAHHeYz+jk9AuFxxeaZ8BByev47F7NoD2z4-RCnQT+e90-MFJjA@mail.gmail.com","87pm43kz3i.fsf@localhost","87fs1e0wue.fsf@localhost","CAHHeYzL6Z5_gGbTUrNzKDh5swgCSQiYsSj3Cs0gFy_d=eXbSBA@mail.gmail.com","87v8e8m0ao.fsf@localhost","CAHHeYzLx3sVuE=9mgwwRFzop5J=vOb-EeQ0bBb2ipZ2LWOjNWw@mail.gmail.com"],"related-refs":["87leb60w98.fsf@gmail.com"],"from":"mtekman89@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87leb60w98.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 9ba64d149aac6c807e233e34474ffe022488efe6 Mon Sep 17 00:00:00 2001\r\nFrom: Mehmet Tekman <mtekman89@gmail.com>\r\nDate: Wed, 20 Sep 2023 11:35:00 +0200\r\nSubject: [PATCH] header refs\r\n\r\n---\r\n lisp\/ob-core.el | 48 ++++++++++++++++++++++++++++++++++++++++++++++--\r\n 1 file changed, 46 insertions(+), 2 deletions(-)\r\n\r\ndiff --git a\/lisp\/ob-core.el b\/lisp\/ob-core.el\r\nindex a7c4f2cab..0b0d1c18c 100644\r\n--- a\/lisp\/ob-core.el\r\n+++ b\/lisp\/ob-core.el\r\n@@ -1753,6 +1753,42 @@ HEADER-ARGUMENTS is alist of all the arguments.\"\r\n \t  header-arguments)\r\n     (nreverse results)))\r\n \r\n+\r\n+(defun org-babel--split-str-quoted (str)\r\n+  \"Splits a string that may or may not contain quotes.\"\r\n+  (let (result pos)\r\n+    (while (string-match (rx (or (seq \"\\\"\" (group (* (not \"\\\"\"))) \"\\\"\")\r\n+                                 (group (+ (not space)))))\r\n+                         str pos)\r\n+      (let ((match-str1 (match-string 1 str))\r\n+            (match-str2 (match-string 2 str)))\r\n+        (if match-str1\r\n+            (progn\r\n+              (push match-str1 result)\r\n+              (setq pos (1+ (match-end 1))))\r\n+          (push match-str2 result)\r\n+          (setq pos (match-end 2)))))\r\n+    (nreverse result)))\r\n+\r\n+(defun org-babel--tangle-split (raw-tangle)\r\n+  \"Split a :tangle headerby filename and sync action.\"\r\n+  (let* ((valid-sync-actions '(\"import\" \"export\" \"sync\"))\r\n+         (file-action (org-babel--split-str-quoted raw-tangle))\r\n+         (file (car file-action))\r\n+         (action (nth (1- (length file-action)) file-action)))\r\n+    (if (member action valid-sync-actions)\r\n+        ;; If last word matches, assume the previous are all part of\r\n+        ;; the filename\r\n+        (setq file (mapconcat #'identity (nreverse (cdr (nreverse file-action))) \" \"))\r\n+      ;; Otherwise set the default action and assume that the full\r\n+      ;; string has no action\r\n+      (if (or file action)\r\n+          (setq action \"export\"\r\n+                file (read-char raw-tangle))))\r\n+    (if (or file action)\r\n+        (list file action)\r\n+      (list nil))))\r\n+\r\n (defun org-babel-process-params (params)\r\n   \"Expand variables in PARAMS and add summary parameters.\"\r\n   (let* ((processed-vars (mapcar (lambda (el)\r\n@@ -1775,7 +1811,13 @@ HEADER-ARGUMENTS is alist of all the arguments.\"\r\n \t\t\t\t\t    raw-result\r\n                                           ;; FIXME: Arbitrary code evaluation.\r\n \t\t\t\t\t  (eval raw-result t)))\r\n-\t\t\t  (cdr (assq :result-params params))))))\r\n+\t\t\t  (cdr (assq :result-params params)))))\r\n+         (raw-tangle (or (cdr (assq :tangle params)) \"\"))\r\n+         (tangle-params (delete-dups\r\n+\t        \t (append\r\n+\t        \t  (org-babel--tangle-split raw-tangle)\r\n+\t        \t  (cdr (assq :tangle-params params)))))\r\n+         )\r\n     (append\r\n      (mapcar (lambda (var) (cons :var var)) (car vars-and-names))\r\n      (list\r\n@@ -1786,7 +1828,9 @@ HEADER-ARGUMENTS is alist of all the arguments.\"\r\n       (cons :result-params result-params)\r\n       (cons :result-type  (cond ((member \"output\" result-params) 'output)\r\n \t\t\t\t((member \"value\" result-params) 'value)\r\n-\t\t\t\t(t 'value))))\r\n+\t\t\t\t(t 'value)))\r\n+      (cons :tangle-params tangle-params)\r\n+      )\r\n      (cl-remove-if\r\n       (lambda (x) (memq (car x) '(:colname-names :rowname-names :result-params\r\n \t\t\t\t\t         :result-type :var)))\r\n-- \r\n2.42.1\r\n\r\n","subject":"Re: [ANN] lisp\/ob-tangle-sync.el"},{"date":"2023-11-08T14:27:44.411Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87a5ropbj6.fsf@trigram.no","message-id":"87a5ropbj6.fsf@trigram.no","config":false,"refs-count":4,"username":"","related-refs":["87a5ropbj6.fsf@trigram.no"],"from":"unhammer@fsfe.org","source-id":"emacs-orgmode@gnu.org","subject":"[FR] STARTUP: hidechecked"},{"date":"2023-11-05T11:52:23.557Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87jzqw5sew.fsf@localhost","message-id":"87jzqw5sew.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["CADQMGARMYNkwX23A2y4iDFvNOmcBhsbtYus5JckyCU_f8SiATw@mail.gmail.com"],"related-refs":["87jzqw5sew.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[TASK] Re: Link translation & relative path export_file_name"},{"date":"2023-10-26T12:04:27.493Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/878r7piodx.fsf@gmail.com","message-id":"878r7piodx.fsf@gmail.com","config":false,"refs-count":3,"username":"Ken Mankoff","related-refs":["878r7piodx.fsf@gmail.com"],"from":"mankoff@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Undo eats buffer [9.7-pre (release_9.6.10-888-g098f08 @ \/home\/kdm\/local\/src\/org-mode\/lisp\/)]"},{"date":"2023-10-24T09:01:47.144Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871qdk8kd9.fsf@localhost","message-id":"871qdk8kd9.fsf@localhost","config":false,"refs-count":5,"username":"Ihor Radchenko","references":["87h6mia9se.fsf@localhost","87lebtije9.fsf@mat.ucm.es","878r7tagzp.fsf@localhost","87sf62lm03.fsf@mat.ucm.es","87mswaboqy.fsf@mat.ucm.es","87pm16oahw.fsf@mat.ucm.es","87edhma7xm.fsf@localhost","87y1ftilf3.fsf@mat.ucm.es","878r7uo3bh.fsf@mat.ucm.es","65354b3c.df0a0220.36680.b681@mx.google.com","87il6x8qoy.fsf@localhost"],"related-refs":["871qdk8kd9.fsf@localhost","87bkco6zzv.fsf@localhost","87il6x8qoy.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/871qdk8kd9.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From c82ec6139269cfc5dabf0e2e4d3601143843c782 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <c82ec6139269cfc5dabf0e2e4d3601143843c782.1698137891.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Mon, 23 Oct 2023 15:30:42 +0300\r\nSubject: [PATCH v2] * doc\/org-manual.org: Improve documentation for\r\n #+SELECT_TAGS and #+EXCLUDE_TAGS\r\n\r\n(Export Settings): Clarify how to define multiple tags per-document.  Reword.\r\n\r\nLink: https:\/\/orgmode.org\/list\/87y1ftilf3.fsf@mat.ucm.es\r\n---\r\n doc\/org-manual.org | 38 +++++++++++++++++++++++++++-----------\r\n 1 file changed, 27 insertions(+), 11 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex c0e9c8d7e..7e4553668 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -12053,22 +12053,38 @@ ** Export Settings\r\n \r\n   #+cindex: @samp{SELECT_TAGS}, keyword\r\n   #+vindex: org-export-select-tags\r\n-  The default value is =(\"export\")=.  When a tree is tagged with\r\n-  =export= (~org-export-select-tags~), Org selects that tree and its\r\n-  subtrees for export.  Org excludes trees with =noexport= tags, see\r\n-  below.  When selectively exporting files with =export= tags set, Org\r\n-  does not export any text that appears before the first headline.\r\n+  List of tags that will *only* be selected for export.  The default\r\n+  value is ~org-export-select-tags~ =(\"export\")=.  When a tree is\r\n+  tagged with =export=, Org selects that tree and its subtrees for\r\n+  export, ignoring all the other sections that do not possess the\r\n+  =export= tag.\r\n+\r\n+  When selectively exporting files with =export= tags set, Org does\r\n+  not export any text that appears before the first headline.\r\n+\r\n+  Note that a file without the =export= or the =noexport= tag will\r\n+  export all its sections.\r\n+\r\n+  To select non-default tags for export, customize\r\n+  ~org-export-select-tags~ (globally) or add =#+SELECT_TAGS: tag1\r\n+  tag2= to the document.\r\n \r\n - =EXCLUDE_TAGS= ::\r\n \r\n   #+cindex: @samp{EXCLUDE_TAGS}, keyword\r\n   #+vindex: org-export-exclude-tags\r\n-  The default value is =(\"noexport\")=.  When a tree is tagged with\r\n-  =noexport= (~org-export-exclude-tags~), Org excludes that tree and\r\n-  its subtrees from export.  Entries tagged with =noexport= are\r\n-  unconditionally excluded from the export, even if they have an\r\n-  =export= tag.  Even if a subtree is not exported, Org executes any\r\n-  code blocks contained there.\r\n+  List o tags that will be excluded from export.  The default value is\r\n+  ~org-export-exclude-tags~ =(\"noexport\")=.  When a tree is tagged\r\n+  with =noexport=, Org excludes that tree and its subtrees from\r\n+  export.\r\n+\r\n+  Entries tagged with =noexport= are unconditionally excluded from the\r\n+  export, even if they have an =export= tag.  Even if a subtree is not\r\n+  exported, Org executes any code blocks contained there.\r\n+\r\n+  To select non-default tags for the exclusion, customize\r\n+  ~org-export-exclude-tags~ (globally) or add =#+EXCLUDE_TAGS: tag1\r\n+  tag2= to the document.\r\n \r\n - =TITLE= ::\r\n \r\n-- \r\n2.42.0\r\n\r\n","subject":"Re: the opposite of the noexport tag"},{"date":"2023-10-21T21:37:03.700Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ttqjirrv.fsf@","message-id":"87ttqjirrv.fsf@","config":false,"refs-count":1,"username":"Bj\u00f6rn Bidar","related-refs":["87ttqjirrv.fsf@"],"from":"bjorn.bidar@thaodan.de","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-icalendar-include-todo keyword doesn't include entries with keyword [9.7-pre (release_9.6.8-785-g72bbf8.dirty @ \/home\/bidar\/.local\/private\/etc\/emacs\/lib\/org\/lisp\/)]"},{"date":"2023-10-21T08:57:15.218Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87y1fwtkth.fsf@localhost","message-id":"87y1fwtkth.fsf@localhost","config":false,"refs-count":13,"username":"Ihor Radchenko","references":["871qdo5sdh.fsf@web.de","ZTEML8zWrB6kQflk@toolbox","87wmvhnr8b.fsf@t14.reltub.ca","ZTLzpmF0rsy9cr52@toolbox"],"related-refs":["87y1fwtkth.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[TASK] Allow customizeable ditaa executable in ob-ditaa.el (was: org-ditaa woes)"},{"date":"2023-10-16T05:56:45.543Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/20098246-e3dc-40f6-8ad3-964dd88b453b@gmail.com","message-id":"20098246-e3dc-40f6-8ad3-964dd88b453b@gmail.com","config":false,"refs-count":3,"username":"Matthew Nelson Hendryx","related-refs":["20098246-e3dc-40f6-8ad3-964dd88b453b@gmail.com"],"from":"matt.hendryx@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] error that came up that freezes the cycle of opening subtrees [9.6.6 (release_9.6.6 @ \/snap\/emacs\/current\/usr\/share\/emacs\/29.1\/lisp\/org\/)]"},{"date":"2023-10-14T14:58:17.646Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/ed890eef-fdfa-4f5e-9e76-89d4482b8c12@pobox.com","message-id":"ed890eef-fdfa-4f5e-9e76-89d4482b8c12@pobox.com","config":false,"refs-count":6,"username":"Daniel Ortmann","related-refs":["ed890eef-fdfa-4f5e-9e76-89d4482b8c12@pobox.com"],"from":"dortmann31415@pobox.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org agenda showing current time - not task time when closing repeatedly-scheduled task [9.7-pre (release_9.6.10-840-g9fcbd1 @ \/home\/d\/src\/git-org-mode\/lisp\/)]"},{"date":"2023-10-10T16:34:05.961Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87jzru8mjt.fsf@localhost","message-id":"87jzru8mjt.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","references":["CAPHku6PrLE-N9bYZiR=a9==WkTAbOYGr9LyCPSOURHp7OLd1_w@mail.gmail.com","87y1ga8olw.fsf@localhost","CAPHku6OuWFCpVNjdmdi9tFJxBB7ZwcgKiF014MhE+kaTA6L5_w@mail.gmail.com"],"related-refs":["87jzru8mjt.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Inactive interval is not correctly displayed in agenda view (was: [BUG?] Org-agenda doesn't work with this error : Search failed: \"\\<SCHEDULED: *<\\([^>]+\\)>\")"},{"date":"2023-10-07T09:56:38.139Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87v8bizrh2.fsf@localhost","message-id":"87v8bizrh2.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87pm1sx6zb.fsf@mat.ucm.es"],"related-refs":["87v8bizrh2.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Auto-adjusting table formulas in org-table-transpose-table-at-point"},{"date":"2023-10-06T15:55:58.971Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/m2v8bjvjat.fsf@ego.team","message-id":"m2v8bjvjat.fsf@ego.team","config":false,"refs-count":5,"username":"YE","related-refs":["6523f0cd.5d0a0220.2bb6e.3bfc@mx.google.com","m2v8bjvjat.fsf@ego.team","87lecaafjk.fsf@localhost"],"from":"yet@ego.team","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] No newline at end of exported HTML file [9.6.6 (release_9.6.6 @ \/Applications\/MacPorts\/Emacs.app\/Contents\/Resources\/lisp\/org\/)]"},{"date":"2023-10-02T13:17:21.806Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cyxxw4dw.fsf@localhost","message-id":"87cyxxw4dw.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["722262403.86159.1696235564094@ichabod.co-bxl"],"related-refs":["87cyxxw4dw.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Re: language-specific org-babel-noweb-wrap-start?"},{"date":"2023-10-01T21:49:37.847Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/DU0P189MB19578739B821B5817E124158BCC6A@DU0P189MB1957.EURP189.PROD.OUTLOOK.COM","message-id":"DU0P189MB19578739B821B5817E124158BCC6A@DU0P189MB1957.EURP189.PROD.OUTLOOK.COM","config":false,"refs-count":4,"username":"Jingcheng Xu","related-refs":["DU0P189MB19578739B821B5817E124158BCC6A@DU0P189MB1957.EURP189.PROD.OUTLOOK.COM"],"from":"jingchengxu@outlook.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-refile doesn't work when target is immediately above"},{"date":"2023-09-26T16:52:15.734Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87fs30ani0.fsf@no.lan","message-id":"87fs30ani0.fsf@no.lan","config":false,"refs-count":2,"username":"Gregor Zattler","related-refs":["87fs30ani0.fsf@no.lan"],"from":"telegraph@gmx.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Warning (org-element-cache): org-element--cache: Warning(Checkliste-Updates.txt): Org parser error in Checkliste-Updates.txt [9.7-pre (release_9.6.9-790-ge42b7a @ \/home\/grfz\/src\/org-mode\/lisp\/)]"},{"date":"2023-09-22T18:13:13.151Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CAM9ALR-fMyiic9Yqw-Ebai5Ctb38iMHZQmUXrvg0aCT3AKUsOw@mail.gmail.com","message-id":"CAM9ALR-fMyiic9Yqw-Ebai5Ctb38iMHZQmUXrvg0aCT3AKUsOw@mail.gmail.com","config":false,"refs-count":5,"username":"Gustavo Barros","related-refs":["CAM9ALR-fMyiic9Yqw-Ebai5Ctb38iMHZQmUXrvg0aCT3AKUsOw@mail.gmail.com"],"from":"gusbrs.2016@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-element-context doesn't recognize link inside property drawer [9.6.6 (release_9.6.6 @ \/usr\/local\/share\/emacs\/29.1\/lisp\/org\/)]"},{"date":"2023-09-20T20:57:13.648Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87led01s5s.fsf@gmail.com","message-id":"87led01s5s.fsf@gmail.com","config":false,"refs-count":1,"username":"Suhail Singh","references":["x1-6cTTUwmKWZxHNPpNVJOTVkwgKgg@gwene.org"],"related-refs":["87led01s5s.fsf@gmail.com"],"from":"suhailsingh247@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Make notion of \"modification time\" configurable during publishing"},{"date":"2023-09-01T14:36:27.754Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/874jkemrk2.fsf@laptop.lockywolf.net","message-id":"874jkemrk2.fsf@laptop.lockywolf.net","config":false,"refs-count":22,"username":"Lockywolf","related-refs":["874jkemrk2.fsf@laptop.lockywolf.net"],"from":"for_org-bugs_2023-09-01@lockywolf.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Consider replacing bachload with batch in ob-maxima. [9.6.6 (release_9.6.6 @ \/usr\/share\/emacs\/30.0.50\/lisp\/org\/)]"},{"date":"2023-08-31T16:49:55.238Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87il8v2q00.fsf@riseup.net","message-id":"87il8v2q00.fsf@riseup.net","config":false,"refs-count":42,"username":"Csepp","related-refs":["8734u6apgp.fsf@localhost","87r0m5phrc.fsf@localhost","ucv85e$11hl$1@ciao.gmane.io","87il8v2q00.fsf@riseup.net"],"from":"raingloom@riseup.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] URI handling is overly complicated and nonstandard [9.6.7 (N\/A @ \/gnu\/store\/mg7223g8mw90lccp6mm5g6f3mpjk70si-emacs-org-9.6.7\/share\/emacs\/site-lisp\/org-9.6.7\/)]"},{"date":"2023-08-26T12:47:01.196Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/873506j7ky.fsf@localhost","message-id":"873506j7ky.fsf@localhost","config":false,"refs-count":10,"username":"Ihor Radchenko","related-refs":["873506j7ky.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] FAILED test-ob-python\/session-multiline"},{"date":"2023-08-24T11:18:21.558Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/63b5fb05-894c-d02b-de09-911c6384d356@vodafonemail.de","message-id":"63b5fb05-894c-d02b-de09-911c6384d356@vodafonemail.de","config":false,"refs-count":4,"username":"Jens Schmidt","related-refs":["63b5fb05-894c-d02b-de09-911c6384d356@vodafonemail.de"],"from":"jschmidt4gnu@vodafonemail.de","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Compilation warnings when making main @ d5ee33fed8dd80d3f9f9811d86a73827fde80780"},{"date":"2023-08-23T09:15:34.376Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87y1i26rzu.fsf@localhost","message-id":"87y1i26rzu.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","references":["87jztm6hhb.fsf@localhost","877cpmkds1.fsf@t14.reltub.ca","87edjvj56r.fsf@t14.reltub.ca"],"related-refs":["87y1i26rzu.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87y1i26rzu.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 39b503301fc7a3ea68733dfd9e4391e3f84efec8 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <39b503301fc7a3ea68733dfd9e4391e3f84efec8.1692781998.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Wed, 23 Aug 2023 12:12:13 +0300\r\nSubject: [PATCH] oc-basic: Fix detecting changes in symlinked bibliography\r\n\r\n* lisp\/oc-basic.el (org-cite-basic--parse-bibliography): Use\r\n`file-truename' to follow symlinks first before checking bibliography\r\nfile change times.\r\n\r\nReported-by: Leo Butler <Leo.Butler@umanitoba.ca>\r\nLink: https:\/\/orgmode.org\/list\/877cpmkds1.fsf@t14.reltub.ca\r\n---\r\n lisp\/oc-basic.el | 3 +++\r\n 1 file changed, 3 insertions(+)\r\n\r\ndiff --git a\/lisp\/oc-basic.el b\/lisp\/oc-basic.el\r\nindex 84d9492ea..c4468e5a8 100644\r\n--- a\/lisp\/oc-basic.el\r\n+++ b\/lisp\/oc-basic.el\r\n@@ -272,6 +272,9 @@ (defun org-cite-basic--parse-bibliography (&optional info)\r\n       (plist-get info :cite-basic\/bibliography)\r\n     (let ((results nil))\r\n       (dolist (file (org-cite-list-bibliography-files))\r\n+        ;; Follow symlinks, to look into modification time of the\r\n+        ;; actual file, not its symlink.\r\n+        (setq file (file-truename file))\r\n         (when (file-readable-p file)\r\n           (with-temp-buffer\r\n             (when (or (org-file-has-changed-p file)\r\n-- \r\n2.41.0\r\n\r\n","subject":"Re: org-cite: how to force a reparsing of the .bib file"},{"date":"2023-08-21T07:06:05.533Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87h6os6fm6.fsf@localhost","message-id":"87h6os6fm6.fsf@localhost","config":false,"refs-count":5,"username":"Ihor Radchenko","references":["87o7j43921.fsf@localhost","ubpllb$c7n$1@ciao.gmane.io","ub549k$q11$1@ciao.gmane.io","ublgqr$4j7$1@ciao.gmane.io","87zg2vl6qc.fsf@localhost","87cyzkpwp4.fsf@localhost","ubnipq$7qr$1@ciao.gmane.io"],"related-refs":["87h6os6fm6.fsf@localhost","87y1i31kb3.fsf@localhost","ub549k$q11$1@ciao.gmane.io","87ledu1dkq.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87h6os6fm6.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From dfc03c0330b96ff4fbe14df39ba895427b8fd004 Mon Sep 17 00:00:00 2001\r\nMessage-ID: <dfc03c0330b96ff4fbe14df39ba895427b8fd004.1692601432.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Mon, 21 Aug 2023 09:57:50 +0300\r\nSubject: [PATCH 1\/2] org-macs: New common API function to quote shell\r\n arguments\r\n\r\n* lisp\/org-macs.el (org-shell-arg-literal): New auxiliary constant.\r\n(org-make-shell-command): New function that returns shell command\r\nbuilt from individual shell arguments, escaping them to prevent\r\nmalicious code execution.\r\n\r\nLink: https:\/\/orgmode.org\/list\/ub549k$q11$1@ciao.gmane.io\r\n---\r\n lisp\/org-macs.el | 31 +++++++++++++++++++++++++++++++\r\n 1 file changed, 31 insertions(+)\r\n\r\ndiff --git a\/lisp\/org-macs.el b\/lisp\/org-macs.el\r\nindex 907e8bed7..95af9e45e 100644\r\n--- a\/lisp\/org-macs.el\r\n+++ b\/lisp\/org-macs.el\r\n@@ -1593,6 +1593,37 @@ (defun org-sxhash-safe (obj &optional counter)\r\n \t  (puthash hash obj org-sxhash-objects)\r\n \t  (puthash obj hash org-sxhash-hashes)))))\r\n \r\n+(defconst org-shell-arg-literal (gensym \"literal\")\r\n+  \"Symbol to be used to mark shell arguments that should not be escaped.\r\n+See `org-make-shell-command'.\")\r\n+(defun org-make-shell-command (command &rest args)\r\n+  \"Build safe shell command string to run COMMAND with ARGS.\r\n+\r\n+The resulting shell command is safe against malicious shell expansion.\r\n+\r\n+ARGS can be nil, strings, (LITERAL STRING), or a list of\r\n+such elements.  LITERAL must be the value of `org-shell-arg-literal'.\r\n+\r\n+Strings will be quoted with `shell-quote-argument' while \\(literal\r\n+STRING) will be used without quoting.  nil values will be ignored.\"\r\n+  (concat\r\n+   command (when command \" \")\r\n+   (mapconcat\r\n+    #'identity\r\n+    (delq\r\n+     nil\r\n+     (mapcar\r\n+      (lambda (str-def)\r\n+        (pcase str-def\r\n+          (`(or nil \"\") nil)\r\n+          ((pred stringp) (shell-quote-argument str-def))\r\n+          (`(,(pred (eq org-shell-arg-literal)) ,(and (pred stringp) str))\r\n+           str)\r\n+          ((pred listp) (apply #'org-make-shell-command nil str-def))\r\n+          (_ (error \"Unknown ARG specification: %S\" str-def))))\r\n+      args))\r\n+    \" \")))\r\n+\r\n (defun org-compile-file (source process ext &optional err-msg log-buf spec)\r\n   \"Compile a SOURCE file using PROCESS.\r\n \r\n-- \r\n2.41.0\r\n\r\n","subject":"Re: [BUG][SECURITY] ob-sqlite header args allows execution of arbitrary shell commands"},{"date":"2023-08-20T06:52:11.533Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87pm3idx6m.fsf@localhost","message-id":"87pm3idx6m.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["18a0cc766d5.1225f3b5d20967.1696636613529078466@zoho.com"],"related-refs":["87pm3idx6m.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow customizing blank lines in-between when creating footnote definitions (was: \"Footnote\" section line spacing is weird)"},{"date":"2023-08-18T13:31:53.400Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/1650384805.753459.1692364837267@ichabod.co-bxl","message-id":"1650384805.753459.1692364837267@ichabod.co-bxl","config":false,"refs-count":18,"username":"Edgar Lux","related-refs":["1650384805.753459.1692364837267@ichabod.co-bxl"],"from":"edgarlux@mailfence.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Warning when creating preview"},{"date":"2023-08-17T17:52:55.393Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87msyppnge.fsf@localhost","message-id":"87msyppnge.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["CAP7OBxJEFL6N906cthxpTXrR5-kbn495xrQJ8N8SwbZqxP4dvQ@mail.gmail.com","877cpvqkcb.fsf@localhost","CAP7OBxJQrNDxVHdyYApg1q-yj+Rz0F-M2kUipLbWvuy6_XwxJQ@mail.gmail.com","CAP7OBxJpjA-oJwUEd8jcm4uD47_3d-OCanr1qoSnPNurraCuTQ@mail.gmail.com","87jztvou08.fsf@localhost","87fs4hrjmn.fsf@localhost","CAP7OBxKF4X-oux2w9dvbt-meScvVw-92NX-Zr8pVsT79v2f2NA@mail.gmail.com","871qg3qj8q.fsf@localhost","CAP7OBxJeP5kK62-SzczefpQK+jqMV-8uS0YDgG6P6V6=6Z8acA@mail.gmail.com","CAP7OBxKLZ7GqZ36LP4XjJD3K4-KT4s0xC_8OS+arwiu7feSAwQ@mail.gmail.com"],"related-refs":["87msyppnge.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Should org-copy\/cut\/paste-special handle inlinetasks specially? (was: BUG: org-cut-special on inlinetask kill until point-max)"},{"date":"2023-08-16T13:04:26.629Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871qg3w37r.fsf@autistici.org","message-id":"871qg3w37r.fsf@autistici.org","config":false,"refs-count":2,"username":"Jonathan Gregory","references":["87r0p1pk2y.fsf@autistici.org","87y1iit5z9.fsf@localhost","87ila4fpw5.fsf@localhost","87pm4bp4qu.fsf@localhost","87fs54b69g.fsf@autistici.org","87pm3xit7c.fsf@localhost","875y65cy0r.fsf@autistici.org","87r0obnomm.fsf@autistici.org","878rb990n5.fsf@localhost","87ila696wu.fsf@autistici.org","87jzus8ive.fsf@localhost","87bl9rq29m.fsf@gnu.org","875y60i97y.fsf@localhost","87o7jwazmn.fsf@autistici.org","87mszj99n0.fsf@autistici.org","878rbchyt9.fsf@autistici.org","87edl3xdhe.fsf@localhost","87a5vh95wg.fsf@localhost","87edkvm6kv.fsf@localhost","87tttyjw6b.fsf@autistici.org","87jzugb914.fsf@autistici.org"],"related-refs":["878rbchyt9.fsf@autistici.org","871qg3w37r.fsf@autistici.org","87tttyjw6b.fsf@autistici.org"],"from":"jgrg@autistici.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/871qg3w37r.fsf@autistici.org","source-id":"emacs-orgmode@gnu.org","patch-body":"commit 8916c9ebbefb1b1d448e0e39998f9b9a3b054680\r\nAuthor: Jonathan Gregory <jgrg@autistici.org>\r\nDate:   Wed Aug 16 09:47:09 2023 -0300\r\n\r\n    lisp\/ob-lilypond.el: Prevent full page results in basic-mode\r\n    \r\n    * ob-lilypond.el (org-babel-lilypond-paper-settings): New variable.\r\n    Link: https:\/\/list.orgmode.org\/87a5w15jur.fsf@localhost\/\r\n    \r\n    TINYCHANGE\r\n\r\ndiff --git a\/lisp\/ob-lilypond.el b\/lisp\/ob-lilypond.el\r\nindex 9693b89e2..ad8371c5f 100644\r\n--- a\/lisp\/ob-lilypond.el\r\n+++ b\/lisp\/ob-lilypond.el\r\n@@ -175,31 +175,51 @@ specific arguments to =org-babel-tangle=.\"\r\n   (if (org-babel-tangle nil \"yes\" \"lilypond\")\r\n       (org-babel-lilypond-execute-tangled-ly) nil))\r\n \r\n+;; https:\/\/lilypond.org\/doc\/v2.24\/Documentation\/usage\/other-programs\r\n+(defvar org-babel-lilypond-paper-settings\r\n+  \"#(if (ly:get-option 'use-paper-size-for-page)\r\n+            (begin (ly:set-option 'use-paper-size-for-page #f)\r\n+                   (ly:set-option 'tall-page-formats '%s)))\r\n+\\\\paper {\r\n+  indent=0\\\\mm\r\n+  tagline=\\\"\\\"\r\n+  oddFooterMarkup=##f\r\n+  oddHeaderMarkup=##f\r\n+  bookTitleMarkup=##f\r\n+  scoreTitleMarkup=##f\r\n+}\\n\"\r\n+  \"The paper settings required to generate music fragments.\r\n+They are needed for mixing music and text in basic-mode.\")\r\n+\r\n (defun org-babel-lilypond-process-basic (body params)\r\n   \"Execute a lilypond block in basic mode.\"\r\n   (let* ((out-file (cdr (assq :file params)))\r\n+         (file-type (file-name-extension out-file))\r\n \t (cmdline (or (cdr (assq :cmdline params))\r\n \t\t      \"\"))\r\n \t (in-file (org-babel-temp-file \"lilypond-\")))\r\n \r\n     (with-temp-file in-file\r\n-      (insert (org-babel-expand-body:generic body params)))\r\n+      (insert\r\n+       (format org-babel-lilypond-paper-settings file-type)\r\n+       (org-babel-expand-body:generic body params)))\r\n     (org-babel-eval\r\n      (concat\r\n       org-babel-lilypond-ly-command\r\n       \" -dbackend=eps \"\r\n       \"-dno-gs-load-fonts \"\r\n       \"-dinclude-eps-fonts \"\r\n-      (or (cdr (assoc (file-name-extension out-file)\r\n-\t\t      '((\"pdf\" . \"--pdf \")\r\n-\t\t\t(\"ps\" . \"--ps \")\r\n-\t\t\t(\"png\" . \"--png \"))))\r\n+      (or (assoc-default file-type\r\n+                         '((\"pdf\" . \"--pdf \")\r\n+\t\t\t   (\"eps\" . \"--eps \")))\r\n \t  \"--png \")\r\n       \"--output=\"\r\n       (file-name-sans-extension out-file)\r\n       \" \"\r\n       cmdline\r\n-      in-file) \"\")) nil)\r\n+      in-file)\r\n+     \"\"))\r\n+  nil)\r\n \r\n (defun org-babel-prep-session:lilypond (_session _params)\r\n   \"Return an error because LilyPond exporter does not support sessions.\"\r\n","subject":"Re: [BUG] WORG example for ob-lilypond is no longer working as described (was: Moving some lisp\/ob-*.el files to org-contrib - your advice?)"},{"date":"2023-08-16T12:40:54.748Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/20230813082753.1428930-1-me@valentin-herrmann.de","message-id":"20230813082753.1428930-1-me@valentin-herrmann.de","config":false,"refs-count":1,"username":"Valentin Herrmann via General discussions about Org-mode.","related-refs":["20230813082753.1428930-1-me@valentin-herrmann.de"],"from":"emacs-orgmode@gnu.org","source-id":"emacs-orgmode@gnu.org","subject":"[PATCH] org.el: Respect org-extend-today-until in timestamps with ++"},{"date":"2023-08-08T19:52:48.084Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/76ae8a09-0f84-b857-12d6-c07407fac797@vodafonemail.de","message-id":"76ae8a09-0f84-b857-12d6-c07407fac797@vodafonemail.de","config":false,"refs-count":3,"username":"Jens Schmidt","related-refs":["76ae8a09-0f84-b857-12d6-c07407fac797@vodafonemail.de"],"from":"jschmidt4gnu@vodafonemail.de","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] `org-open-at-point' surprisingly asks for tags table [9.7-pre (release_9.6.7-640-ga18ebc @ \/home\/jschmidt\/work\/org-mode\/lisp\/)]"},{"date":"2023-08-06T12:06:42.428Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87tttcml75.fsf@posteo.net","message-id":"87tttcml75.fsf@posteo.net","config":false,"refs-count":22,"username":"Juan Manuel Mac\u00edas","related-refs":["87ttt59zsx.fsf@posteo.net","87edk5crle.fsf@posteo.net","877cpta0f7.fsf@posteo.net","87bkf7qdrk.fsf@posteo.net","87tttcml75.fsf@posteo.net"],"from":"maciaschain@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87tttcml75.fsf@posteo.net","source-id":"emacs-orgmode@gnu.org","patch-body":"From 0c8a352567333d0d743b5235b68e9cd5d513f615 Mon Sep 17 00:00:00 2001\r\nFrom: Juan Manuel Macias <maciaschain@posteo.net>\r\nDate: Sun, 6 Aug 2023 12:42:36 +0200\r\nSubject: [PATCH] lisp\/ox-latex.el: fix blank lines behavior in verse block\r\n export.\r\n\r\n* (org-latex-verse-block): now the treatment of blank lines is\r\nconsistent with the syntax of the LaTeX `verse' environment, and the\r\none provided by the `verse' package.\r\n---\r\n lisp\/ox-latex.el | 18 +++++++++++++-----\r\n 1 file changed, 13 insertions(+), 5 deletions(-)\r\n\r\ndiff --git a\/lisp\/ox-latex.el b\/lisp\/ox-latex.el\r\nindex 31cad1dc4..26827537a 100644\r\n--- a\/lisp\/ox-latex.el\r\n+++ b\/lisp\/ox-latex.el\r\n@@ -4128,20 +4128,28 @@ contextual information.\"\r\n       verse-block\r\n       ;; In a verse environment, add a line break to each newline\r\n       ;; character and change each white space at beginning of a line\r\n-      ;; into a space of 1 em.  Also change each blank line with\r\n-      ;; a vertical space of 1 em.\r\n+      ;; into a space of 1 em.  One or more blank lines between lines\r\n+      ;; are exported as a single blank line.\r\n       (format \"%s\\\\begin{verse}%s\\n%s\\\\end{verse}%s\"\r\n \t      vwidth\r\n \t      attr\r\n \t      (replace-regexp-in-string\r\n \t       \"^[ \\t]+\" (lambda (m) (format \"\\\\hspace*{%dem}\" (length m)))\r\n \t       (replace-regexp-in-string\r\n-                (concat \"^[ \\t]*\" (regexp-quote org-latex-line-break-safe) \"$\")\r\n-\t        \"\\\\vspace*{1em}\"\r\n+\t\t(concat \"\\\\(\"\r\n+\t\t\t(regexp-quote org-latex-line-break-safe)\r\n+\t\t\t\"\\n\\\\)\"\r\n+\t\t\t\"\\\\(^[ \\t]*\"\r\n+\t\t\t(regexp-quote org-latex-line-break-safe)\r\n+\t\t\t\"\\n\"\r\n+\t\t\t\"\\\\)+\")\r\n+\t\t(if lin \"\\\\\\\\!\\n\\n\" \"\\n\\n\")\r\n \t        (replace-regexp-in-string\r\n \t         \"\\\\([ \\t]*\\\\\\\\\\\\\\\\\\\\)?[ \\t]*\\n\"\r\n                  (concat org-latex-line-break-safe \"\\n\")\r\n-\t         contents nil t)\r\n+\t         ;; Remove any blank lines before and after CONTENTS.\r\n+\t\t (concat (org-trim contents t) \"\\n\")\r\n+\t\t nil t)\r\n                 nil t)\r\n                nil t)\r\n               linreset)\r\n-- \r\n2.41.0\r\n\r\n","subject":"ox-latex.el: fix blank lines behavior in verse block"},{"date":"2023-07-28T19:08:11.688Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/878rb1v3f8.fsf@lipklim.org","message-id":"878rb1v3f8.fsf@lipklim.org","config":false,"refs-count":2,"username":"Evgenii Klimov","related-refs":["878rb1v3f8.fsf@lipklim.org"],"from":"eugene.dev@lipklim.org","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Add an option to use ID links during tangling"},{"date":"2023-07-27T08:41:51.958Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87r0ot7pft.fsf@localhost","message-id":"87r0ot7pft.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["87bkqmdhqz.fsf@gmail.com","87a64jd8w4.fsf@localhost","DS7PR20MB46713099F881B17E85CCC6B2BE0D9@DS7PR20MB4671.namprd20.prod.outlook.com","87o7szidis.fsf@localhost","87sficbccx.fsf@gmail.com"],"related-refs":["87r0ot7pft.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[TASK] Making org-src buffers sync with real files to allow LSP and other dev tools integration (was: [PATCH] LSP support in org-src buffers)"},{"date":"2023-07-26T15:26:36.555Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/875y66906s.fsf@lipklim.org","message-id":"875y66906s.fsf@lipklim.org","config":false,"refs-count":2,"username":"Evgenii Klimov","references":["87cz0wcbtt.fsf@lipklim.org","87h6q8d9lz.fsf@lipklim.org","87lefkd9tb.fsf@lipklim.org","87ttu6j2zr.fsf@localhost","871qgwgcc9.fsf@lipklim.org","87bkg1h4q3.fsf@lipklim.org","87fs5c79ss.fsf@localhost","87mszjm94g.fsf@localhost"],"related-refs":["875y66906s.fsf@lipklim.org","87bkg1h4q3.fsf@lipklim.org"],"from":"eugene.dev@lipklim.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/875y66906s.fsf@lipklim.org","source-id":"emacs-orgmode@gnu.org","patch-body":"From f1bf00592b1ee2bb27148fe93316cc6c1a192179 Mon Sep 17 00:00:00 2001\r\nFrom: Evgenii Klimov <eugene.dev@lipklim.org>\r\nDate: Fri, 21 Jul 2023 22:40:06 +0100\r\nSubject: [PATCH v5 1\/2] testing\/lisp\/test-ob-tangle.el: Test block collection\r\n into groups for tangling\r\n\r\n* testing\/lisp\/test-ob-tangle.el (ob-tangle\/collect-blocks): Test\r\nblock collection into groups for tangling.\r\n---\r\n testing\/lisp\/test-ob-tangle.el | 116 +++++++++++++++++++++++++++++++++\r\n 1 file changed, 116 insertions(+)\r\n\r\ndiff --git a\/testing\/lisp\/test-ob-tangle.el b\/testing\/lisp\/test-ob-tangle.el\r\nindex 07e75f4d3..ad0e1c29c 100644\r\n--- a\/testing\/lisp\/test-ob-tangle.el\r\n+++ b\/testing\/lisp\/test-ob-tangle.el\r\n@@ -569,6 +569,122 @@ another block\r\n         (set-buffer-modified-p nil))\r\n       (kill-buffer buffer))))\r\n \r\n+(ert-deftest ob-tangle\/collect-blocks ()\r\n+  \"Test block collection into groups for tangling.\"\r\n+  (org-test-with-temp-text-in-file \"\" ; filled below, it depends on temp file name\r\n+    (let* ((org-file (buffer-file-name))\r\n+           (test-dir (file-name-directory org-file))\r\n+           (el-file-abs (concat (file-name-sans-extension org-file) \".el\"))\r\n+           (el-file-rel (file-name-nondirectory el-file-abs)))\r\n+      (insert (format \"* H1 with :tangle in properties\r\n+:PROPERTIES:\r\n+:header-args: :tangle relative.el\r\n+:END:\r\n+\r\n+#+begin_src emacs-lisp\r\n+\\\"H1: inherited :tangle relative.el in properties\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle yes\r\n+\\\"H1: :tangle yes\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle no\r\n+\\\"H1: should be ignored\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle %s\r\n+\\\"H1: absolute org-file.lang-ext :tangle %s\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle relative.el\r\n+\\\"H1: :tangle relative.el\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle .\/relative.el\r\n+\\\"H1: :tangle .\/relative.el\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle \/tmp\/absolute.el\r\n+\\\"H1: :tangle \/tmp\/absolute.el\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle ~\/..\/..\/tmp\/absolute.el\r\n+\\\"H1: :tangle ~\/..\/..\/tmp\/absolute.el\\\"\r\n+#+end_src\r\n+\r\n+* H2 without :tangle in properties\r\n+\r\n+#+begin_src emacs-lisp\r\n+\\\"H2: without :tangle\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle yes\r\n+\\\"H2: :tangle yes\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle no\r\n+\\\"H2: should be ignored\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle %s\r\n+\\\"H2: relative org-file.lang-ext :tangle %s\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle relative.el\r\n+\\\"H2: :tangle relative.el\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle .\/relative.el\r\n+\\\"H2: :tangle .\/relative.el\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle \/tmp\/absolute.el\r\n+\\\"H2: :tangle \/tmp\/absolute.el\\\"\r\n+#+end_src\r\n+\r\n+#+begin_src emacs-lisp :tangle ~\/..\/..\/tmp\/absolute.el\r\n+\\\"H2: :tangle ~\/..\/..\/tmp\/absolute.el\\\"\r\n+#+end_src\" el-file-abs el-file-abs el-file-rel el-file-rel))\r\n+      (letrec ((sort-fn (lambda (lst) (seq-sort-by #'car #'string-lessp lst)))\r\n+               (normalize-expected-targets-alist\r\n+                (lambda (blocks-per-target-alist)\r\n+                  \"Convert to absolute file names and sort expected targets\"\r\n+                  (funcall sort-fn\r\n+                           (map-apply (lambda (file nblocks)\r\n+                                        (cons (expand-file-name file test-dir) nblocks))\r\n+                                      blocks-per-target-alist))))\r\n+               (count-blocks-in-target-files\r\n+                (lambda (collected-blocks)\r\n+                  \"Get sorted alist of target file names with number of blocks in each\"\r\n+                  (funcall sort-fn (map-apply (lambda (file blocks)\r\n+                                                (cons file (length blocks)))\r\n+                                              collected-blocks)))))\r\n+        (should (equal (funcall normalize-expected-targets-alist\r\n+                                `((\"\/tmp\/absolute.el\" . 4)\r\n+                                  (\"relative.el\" . 5)\r\n+                                  ;; file name differs between tests\r\n+                                  (,el-file-abs . 4)))\r\n+                       (funcall count-blocks-in-target-files\r\n+                                (org-babel-tangle-collect-blocks))))\r\n+        ;; Simulate TARGET-FILE to test as `org-babel-tangle' and\r\n+        ;; `org-babel-load-file' would call\r\n+        ;; `org-babel-tangle-collect-blocks'.\r\n+        (let ((org-babel-default-header-args\r\n+               (org-babel-merge-params\r\n+                org-babel-default-header-args\r\n+                (list (cons :tangle el-file-abs)))))\r\n+          (should (equal\r\n+                   (funcall normalize-expected-targets-alist\r\n+                            `((\"\/tmp\/absolute.el\" . 4)\r\n+                              (\"relative.el\" . 5)\r\n+                              ;; Default :tangle header now also\r\n+                              ;; points to the file name derived from the name of\r\n+                              ;; the Org file, so 5 blocks should go there.\r\n+                              (,el-file-abs . 5)))\r\n+                   (funcall count-blocks-in-target-files\r\n+                            (org-babel-tangle-collect-blocks)))))))))\r\n+\r\n (provide 'test-ob-tangle)\r\n \r\n ;;; test-ob-tangle.el ends here\r\n-- \r\n2.34.1\r\n\r\n","subject":"[PATCH v5] ob-tangle.el: Blocks overwrite each other when grouping before tangling"},{"date":"2023-07-21T11:06:38.264Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CANyca0-hwRZf5DH-dkU8RF_S0PKk6f4sSjpPUtFgoArbvKzo9A@mail.gmail.com","message-id":"CANyca0-hwRZf5DH-dkU8RF_S0PKk6f4sSjpPUtFgoArbvKzo9A@mail.gmail.com","config":false,"refs-count":3,"username":"Ilja Kocken","related-refs":["CANyca0-hwRZf5DH-dkU8RF_S0PKk6f4sSjpPUtFgoArbvKzo9A@mail.gmail.com"],"from":"iljakocken@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-element--cache parser error [9.6.6 (release_9.6.6 @ \/usr\/share\/emacs\/30.0.50\/lisp\/org\/)]"},{"date":"2023-07-21T07:43:38.128Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/875y6d90cz.fsf@localhost","message-id":"875y6d90cz.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["b1a39579-a321-c7ec-0465-4685e431a625@gmail.com","b662de2f-693d-cf06-82a7-11f29c83943e@gmail.com","87r0p28l2b.fsf@localhost"],"related-refs":["875y6d90cz.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Respect `org-bibtex-headline-format-function' in `org-bibtex-create' (was: org-bibtex manual)"},{"date":"2023-07-19T12:29:03.801Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/878rbchyt9.fsf@autistici.org","message-id":"878rbchyt9.fsf@autistici.org","config":false,"refs-count":27,"username":"Jonathan Gregory","references":["87a5w0yvhf.fsf@localhost","87zg3uxyba.fsf@autistici.org","877cr2id09.fsf@localhost","87bl9rq29m.fsf@gnu.org","875yzzilq0.fsf@cnrs.fr","87ilam3bv1.fsf@autistici.org","871ram4x83.fsf@web.de","87a5w15jur.fsf@localhost","87fs5svjqb.fsf@autistici.org","87sf9lv9ta.fsf@localhost"],"related-refs":["878rbchyt9.fsf@autistici.org","871qg3w37r.fsf@autistici.org","87tttyjw6b.fsf@autistici.org","87a5w15jur.fsf@localhost"],"from":"jgrg@autistici.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/878rbchyt9.fsf@autistici.org","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/lisp\/ob-lilypond.el b\/lisp\/ob-lilypond.el\r\nindex 9693b89e2..3cbdd2b27 100644\r\n--- a\/lisp\/ob-lilypond.el\r\n+++ b\/lisp\/ob-lilypond.el\r\n@@ -183,6 +183,12 @@ specific arguments to =org-babel-tangle=.\"\r\n \t (in-file (org-babel-temp-file \"lilypond-\")))\r\n \r\n     (with-temp-file in-file\r\n+      ;; To create music fragments suitable for mixing music and text,\r\n+      ;; newer versions of lilypond require setting at least the\r\n+      ;; following two variables introduced in version 2.22.\r\n+      (insert \"#(if (ly:get-option 'use-paper-size-for-page)\r\n+(begin (ly:set-option 'use-paper-size-for-page #f)\r\n+(ly:set-option 'tall-page-formats 'pdf)))\\n\")\r\n       (insert (org-babel-expand-body:generic body params)))\r\n     (org-babel-eval\r\n      (concat\r\n@@ -199,7 +205,9 @@ specific arguments to =org-babel-tangle=.\"\r\n       (file-name-sans-extension out-file)\r\n       \" \"\r\n       cmdline\r\n-      in-file) \"\")) nil)\r\n+      in-file)\r\n+     \"\"))\r\n+  nil)\r\n \r\n (defun org-babel-prep-session:lilypond (_session _params)\r\n   \"Return an error because LilyPond exporter does not support sessions.\"\r\n","subject":"Re: [BUG] WORG example for ob-lilypond is no longer working as described (was: Moving some lisp\/ob-*.el files to org-contrib - your advice?)"},{"date":"2023-07-19T06:55:48.336Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87edl41jf0.fsf@localhost","message-id":"87edl41jf0.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["8b691a7f-6b62-d573-e5a8-80fac3dc9bc6@vodafonemail.de","87ilag1pth.fsf@localhost","87edl53ae3.fsf@localhost","e6e67b8d-53ac-d77f-4ab6-43823affbbc7@vodafonemail.de"],"related-refs":["8b691a7f-6b62-d573-e5a8-80fac3dc9bc6@vodafonemail.de","87edl41jf0.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Emphasis markers should be considered word constituents (was: [BUG] SPACE jumps to tag in header line after hidden emphasis marker [9.7-pre (release_9.6.7-562-g5b6268 @ \/home\/jschmidt\/work\/org-mode\/lisp\/)])"},{"date":"2023-07-16T09:20:56.054Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87lefgi58c.fsf@localhost","message-id":"87lefgi58c.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","references":["878rbib4su.fsf@gmail.com","mailman.49.1689350420.11515.emacs-orgmode@gnu.org","87ilamf91l.fsf@tsdye.online","87bkgdh9ud.fsf@localhost","87edl9f4qq.fsf@tsdye.online","87v8emb2rx.fsf@lipklim.org"],"related-refs":["87lefgi58c.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[TASK] Ensure built-in babel backend consistency (standard header support) and ad documentation to the manual (was: [Pre-PATCH v2] Add the capability to specify lexical scope in tangled files (was: Add new :lexical header argument))"},{"date":"2023-07-12T13:42:24.969Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87a5w15jur.fsf@localhost","message-id":"87a5w15jur.fsf@localhost","config":false,"refs-count":33,"username":"Ihor Radchenko","references":["87bl9rq29m.fsf@gnu.org","875yzzilq0.fsf@cnrs.fr","871ram4x83.fsf@web.de"],"related-refs":["878rbchyt9.fsf@autistici.org","87tttyjw6b.fsf@autistici.org","87a5w15jur.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] WORG example for ob-lilypond is no longer working as described (was: Moving some lisp\/ob-*.el files to org-contrib - your advice?)"},{"date":"2023-07-06T02:51:52.478Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87sfa121q1.fsf@gmail.com","message-id":"87sfa121q1.fsf@gmail.com","config":false,"refs-count":7,"username":"Jack Kamm","references":["877crfvrsf.fsf@localhost","875y71fcic.fsf@localhost","87y1ju8vpp.fsf@localhost","877crh8htb.fsf@localhost","CAOQTW-M3BUVKFaiQYJms2kuK4usf_TwCr=QNVdLDYfj8LdHc6w@mail.gmail.com","CAOQTW-Oh=2_0qKAFrawMJqWQk+ZWWfx0m08YvLoVypWZdyhauQ@mail.gmail.com","87v8ez0w41.fsf@gmail.com","CAOQTW-PHT1mFgUUbm8YcfqZ18Fnxq9MxUuGF66dthCyt79QFOQ@mail.gmail.com"],"related-refs":["87sfa121q1.fsf@gmail.com"],"from":"jackkamm@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87sfa121q1.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 538c464ca88c8a1646a1b80352f0c8fb9f114f08 Mon Sep 17 00:00:00 2001\r\nFrom: Jack Kamm <jackkamm@gmail.com>\r\nDate: Wed, 5 Jul 2023 19:02:25 -0700\r\nSubject: [PATCH] doc\/org-manual: Clarify undocumented uses of :results file\r\n\r\n(Type):\r\n(Format): Document that :results file is using the source block result\r\nas file path when :file header argument is not present.  Document that\r\nsome Babel languages require :results graphics for plotting.\r\n---\r\n doc\/org-manual.org | 37 ++++++++++++++++++++++++++++++-------\r\n 1 file changed, 30 insertions(+), 7 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 71ad4d9e8..3bf1c7d7f 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -18558,11 +18558,7 @@ described in the documentation for individual languages.  See\r\n   #+cindex: @samp{file-ext}, header argument\r\n   If =file= header argument is missing, Org generates the base name of\r\n   the output file from the name of the code block, and its extension\r\n-  from the =file-ext= header argument.  In that case, both the name\r\n-  and the extension are mandatory.\r\n-\r\n-  Result can also be interpreted as path to file.  See =:results\r\n-  link=.\r\n+  from the =file-ext= header argument.\r\n \r\n   #+begin_example\r\n   ,#+name: circle\r\n@@ -18572,6 +18568,30 @@ described in the documentation for individual languages.  See\r\n   ,#+END_SRC\r\n   #+end_example\r\n \r\n+  If both =file= and =file-ext= header arguments are missing, then\r\n+  result is interpreted as path to file.\r\n+\r\n+  #+begin_example\r\n+  ,#+BEGIN_SRC python :results file\r\n+  import matplotlib.pyplot as plt\r\n+  import numpy as np\r\n+\r\n+  fname = \"path\/to\/file.png\"\r\n+\r\n+  plt.plot(np.arange(5))\r\n+  plt.savefig(fname)\r\n+\r\n+  return fname # return filename to org-mode\r\n+  ,#+END_SRC\r\n+  #+end_example\r\n+\r\n+  When =file= or =file-ext= header arguments are present, you can\r\n+  prevent Org from directly writing to that file by using =:results\r\n+  link= or =:results graphics=.  This might be desirable if you write\r\n+  to the file within the code block itself.  Some Babel languages also\r\n+  require these extra header arguments for plotting.  See =:results\r\n+  link= for more details.\r\n+\r\n   #+cindex: @samp{file-desc}, header argument\r\n   The =file-desc= header argument defines the description (see [[*Link\r\n   Format]]) for the link.  If =file-desc= is present but has no value,\r\n@@ -18644,8 +18664,11 @@ follows from the type specified above.\r\n   [[file:org-mode-unicorn.svg]]\r\n   #+end_example\r\n \r\n-  If =:file= header argument is omitted, interpret source block result\r\n-  as the file path.\r\n+  =:results file graphics= is also needed by some languages for\r\n+  plotting, such as ob-R, ob-julia, and ob-octave, because they save\r\n+  plots to file via wrapper code in their respective languages rather\r\n+  than via elisp.  Consult the documentation for the respective Babel\r\n+  languages for more details.\r\n \r\n - =org= ::\r\n \r\n-- \r\n2.41.0\r\n\r\n","subject":"Re: [PATCH] ob-python: support header argument `:results file graphics'"},{"date":"2023-07-05T20:09:32.265Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/hur743att6vbcxwq5yqlay5firklobhez5iji2a7t663ztoej7@nite3p4diuka","message-id":"hur743att6vbcxwq5yqlay5firklobhez5iji2a7t663ztoej7@nite3p4diuka","config":false,"refs-count":1,"username":"fluentpwn","related-refs":["hur743att6vbcxwq5yqlay5firklobhez5iji2a7t663ztoej7@nite3p4diuka"],"from":"civeax@inventati.org","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-indent-mode breaks source block indent"},{"date":"2023-07-05T17:21:58.842Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CAOn=hbeg0ovxY8V-oL9UYGWEF89Hr=1C=U+hJy+-+OLyBeh=HA@mail.gmail.com","message-id":"CAOn=hbeg0ovxY8V-oL9UYGWEF89Hr=1C=U+hJy+-+OLyBeh=HA@mail.gmail.com","config":false,"refs-count":3,"username":"Bhavin Gandhi","related-refs":["CAOn=hbeg0ovxY8V-oL9UYGWEF89Hr=1C=U+hJy+-+OLyBeh=HA@mail.gmail.com"],"from":"bhavin7392@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Warning (org-element-cache): Org parser error (error \"Invalid search bound (wrong side of point)\")"},{"date":"2023-06-30T12:00:50.590Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/49c5dcf6-26fa-5fe1-1778-c932d056eadb@hackyon.net","message-id":"49c5dcf6-26fa-5fe1-1778-c932d056eadb@hackyon.net","config":false,"refs-count":1,"username":"Paul Rubin","related-refs":["49c5dcf6-26fa-5fe1-1778-c932d056eadb@hackyon.net"],"from":"paulr@hackyon.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] manual should explain how to insert literal dollar sign"},{"date":"2023-06-30T11:59:13.160Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/708F85C7-6769-4C16-9C47-7B620A9682B2@gmail.com","message-id":"708F85C7-6769-4C16-9C47-7B620A9682B2@gmail.com","config":false,"refs-count":3,"username":"Mariusz Klochowicz","related-refs":["708F85C7-6769-4C16-9C47-7B620A9682B2@gmail.com"],"from":"mariusz.klochowicz@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org parser error in org-ai [9.6.5 (release_9.6.5-3-g2993f4 @ \/usr\/local\/Cellar\/emacs-plus@29\/29.0.90\/share\/emacs\/29.0.90\/lisp\/org\/)]"},{"date":"2023-06-30T11:59:06.973Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/20230629223129.17191-3-eugene.dev@lipklim.org","message-id":"20230629223129.17191-3-eugene.dev@lipklim.org","config":false,"refs-count":1,"username":"Evgenii Klimov","references":["20230629223129.17191-1-eugene.dev@lipklim.org"],"related-refs":["20230629223129.17191-3-eugene.dev@lipklim.org"],"from":"eugene.dev@lipklim.org","source-id":"emacs-orgmode@gnu.org","subject":"[PATCH 2\/3] lisp\/org.el: Fix docstring for S-cursor commands"},{"date":"2023-06-20T08:58:28.415Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/e625df0a-0f9a-e986-4a9f-a9fac5533791@protonmail.com","message-id":"e625df0a-0f9a-e986-4a9f-a9fac5533791@protonmail.com","config":false,"refs-count":3,"username":"Okamsn","related-refs":["e625df0a-0f9a-e986-4a9f-a9fac5533791@protonmail.com"],"from":"okamsn@protonmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] `org-delete-char` and `org-delete-backward-char` don't respect `delete-active-region`"},{"date":"2023-06-17T12:31:15.840Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87zg4yjmj6.fsf@localhost","message-id":"87zg4yjmj6.fsf@localhost","config":false,"refs-count":6,"username":"Ihor Radchenko","references":["SJ0PR03MB5455EC7D995A2AA38C2FE21AA25AA@SJ0PR03MB5455.namprd03.prod.outlook.com","SJ0PR03MB5455C08FAD47C64F6EA7054CA252A@SJ0PR03MB5455.namprd03.prod.outlook.com","SJ0PR03MB5455A5A7D5C3254EF5C0DEABA25BA@SJ0PR03MB5455.namprd03.prod.outlook.com","87zg528fzv.fsf@localhost","87v8fvtz1u.fsf@localhost","SJ0PR03MB54550E0DB4C0D1DC2DB3AB01A250A@SJ0PR03MB5455.namprd03.prod.outlook.com","875y7y2qga.fsf@localhost","87legplzck.fsf@localhost","87a5x6tjr3.fsf@localhost","SJ0PR03MB5455CA3B7B621161F628014FA25BA@SJ0PR03MB5455.namprd03.prod.outlook.com","SJ0PR03MB54552C87A5C5AC7878F952BCA24DA@SJ0PR03MB5455.namprd03.prod.outlook.com","SJ0PR03MB5455693CA8266256D46BA594A259A@SJ0PR03MB5455.namprd03.prod.outlook.com","87h6rh140j.fsf@localhost","87ilc1ktrx.fsf@localhost","87h6r9rnkz.fsf@localhost","87fs6vwvfs.fsf@localhost","SJ0PR03MB545597ACE859EEAD89055113A254A@SJ0PR03MB5455.namprd03.prod.outlook.com","SJ0PR03MB5455E2524BD6FEE8EBC3E8E2A254A@SJ0PR03MB5455.namprd03.prod.outlook.com","SJ0PR03MB54552FB5BA0B5656EF24886EA257A@SJ0PR03MB5455.namprd03.prod.outlook.com","87cz1vkaqq.fsf@localhost","DS7PR03MB54479DC689678CB7333420D2A256A@DS7PR03MB5447.namprd03.prod.outlook.com"],"related-refs":["875y7y2qga.fsf@localhost","SJ0PR03MB5455CA3B7B621161F628014FA25BA@SJ0PR03MB5455.namprd03.prod.outlook.com","87zg4yjmj6.fsf@localhost","SJ0PR03MB5455693CA8266256D46BA594A259A@SJ0PR03MB5455.namprd03.prod.outlook.com"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87zg4yjmj6.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 17e8902e8d6f3c23a9226d697e51169c24b5414a Mon Sep 17 00:00:00 2001\r\nMessage-ID: <17e8902e8d6f3c23a9226d697e51169c24b5414a.1687004884.git.yantar92@posteo.net>\r\nFrom: David Masterson <dsmasterson@gmail.com>\r\nDate: Sat, 17 Jun 2023 15:26:55 +0300\r\nSubject: [PATCH] org-manual, org-guide: Improve timestamp documentation\r\n\r\n* doc\/org-manual.org (Dates and Times): Explain the purpose of\r\ntimestamps in the opening paragraphs.\r\n(Timestamps): Mention that time range.  Clarify that an entry may\r\ncontain multiple timestamps, providing an example.  Explain formal\r\ntime range meaning, with example.  Add cindex entry \"time range\".  Add\r\ndate range example.\r\n* doc\/org-guide.org: Syncronoize changes with org-manual, adding some\r\nmissing pieces.\r\n(Timestamps): Remove useless cindex entries (org-guide does not\r\nproduce index).\r\n\r\nCo-authored-by: Ihor Radchenko <yantar92@posteo.net>\r\nLink: https:\/\/orgmode.org\/list\/SJ0PR03MB5455693CA8266256D46BA594A259A@SJ0PR03MB5455.namprd03.prod.outlook.com\r\n\r\nTINYCHANGE\r\n---\r\n doc\/org-guide.org  | 33 +++++++++++++++++++++++++++----\r\n doc\/org-manual.org | 49 +++++++++++++++++++++++++++++++---------------\r\n 2 files changed, 62 insertions(+), 20 deletions(-)\r\n\r\ndiff --git a\/doc\/org-guide.org b\/doc\/org-guide.org\r\nindex 828bdd872..a6d4e7c3d 100644\r\n--- a\/doc\/org-guide.org\r\n+++ b\/doc\/org-guide.org\r\n@@ -1081,7 +1081,15 @@ * Dates and Times\r\n \r\n To assist project planning, TODO items can be labeled with a date\r\n and\/or a time.  The specially formatted string carrying the date and\r\n-time information is called a \/timestamp\/ in Org mode.\r\n+time information is called a \/timestamp\/ in Org mode.  This may be\r\n+a little confusing because timestamp is often used as indicating when\r\n+something was created or last changed.  However, in Org mode this term\r\n+is used in a much wider sense.\r\n+\r\n+Timestamps can be used to plan appointments, schedule tasks, set\r\n+deadlines, track time, and more.  The following sections describe\r\n+the timestamp format and tooling that Org mode provides for common\r\n+use cases dealing with time and time intervals.\r\n \r\n ** Timestamps\r\n :PROPERTIES:\r\n@@ -1099,12 +1107,16 @@ ** Timestamps\r\n \r\n   A simple timestamp just assigns a date\/time to an item.  This is\r\n   just like writing down an appointment or event in a paper agenda.\r\n+  There can be multiple timestamps in an item.\r\n \r\n   #+begin_example\r\n   ,* Meet Peter at the movies\r\n     <2006-11-01 Wed 19:15>\r\n   ,* Discussion on climate change\r\n     <2006-11-02 Thu 20:00-22:00>\r\n+  ,* My days off\r\n+    <2006-11-03 Fri>\r\n+    <2006-11-06 Mon>\r\n   #+end_example\r\n \r\n - Timestamp with repeater interval ::\r\n@@ -1121,8 +1133,6 @@ ** Timestamps\r\n \r\n - Diary-style expression entries ::\r\n \r\n-  #+cindex: diary style timestamps\r\n-  #+cindex: sexp timestamps\r\n   For more complex date specifications, Org mode supports using the\r\n   special expression diary entries implemented in the Emacs Calendar\r\n   package.  For example, with optional time:\r\n@@ -1132,13 +1142,28 @@ ** Timestamps\r\n     <%%(diary-float t 4 2)>\r\n   #+end_example\r\n \r\n+- Time range\r\n+\r\n+  Time range is a timestamp having two time units connected by =-=\r\n+\r\n+  #+begin_example\r\n+  ,* Discussion on climate change\r\n+    <2006-11-02 Thu 10:00-12:00>\r\n+  #+end_example\r\n+\r\n - Time\/Date range ::\r\n \r\n-  Two timestamps connected by =--= denote a range.\r\n+  Two timestamps connected by =--= denote a range.  In the agenda, the\r\n+  headline is shown on the first and last day of the range, and on any\r\n+  dates that are displayed and fall in the range.  The first example\r\n+  specifies just the dates of the range while the second example\r\n+  specifies a time range for each date.\r\n \r\n   #+begin_example\r\n   ,** Meeting in Amsterdam\r\n      <2004-08-23 Mon>--<2004-08-26 Thu>\r\n+  ,** This weeks committee meetings\r\n+     <2004-08-23 Mon 10:00-11:00>--<2004-08-26 Thu 10:00-11:00>\r\n   #+end_example\r\n \r\n - Inactive timestamp ::\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex c11694849..4b00d1e6f 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -5987,6 +5987,11 @@ * Dates and Times\r\n something was created or last changed.  However, in Org mode this term\r\n is used in a much wider sense.\r\n \r\n+Timestamps can be used to plan appointments, schedule tasks, set\r\n+deadlines, track time, and more.  The following sections describe\r\n+the timestamp format and tooling that Org mode provides for common\r\n+use cases dealing with time and time intervals.\r\n+\r\n ** Timestamps\r\n :PROPERTIES:\r\n :DESCRIPTION: Assigning a time to a tree entry.\r\n@@ -5997,12 +6002,12 @@ ** Timestamps\r\n #+cindex: deadlines\r\n #+cindex: scheduling\r\n \r\n-A timestamp is a specification of a date (possibly with a time) in a\r\n-special format, either =<2003-09-16 Tue>= or\r\n-=<2003-09-16 Tue 09:39>=[fn:19].  A timestamp can appear anywhere in\r\n-the headline or body of an Org tree entry.  Its presence causes\r\n-entries to be shown on specific dates in the agenda (see [[*Weekly\/daily\r\n-agenda]]).  We distinguish:\r\n+A timestamp is a specification of a date---possibly with a time or\r\n+time range---in a special format, either =<2003-09-16 Tue>= or\r\n+=<2003-09-16 Tue 09:39>= or =<2003-09-16 Tue 12:00-12:30>=[fn:19].\r\n+A timestamp can appear anywhere in the headline or body of an Org tree\r\n+entry.  Its presence causes entries to be shown on specific dates in\r\n+the agenda (see [[*Weekly\/daily agenda]]).  We distinguish:\r\n \r\n - Plain timestamp; Event; Appointment ::\r\n \r\n@@ -6011,13 +6016,17 @@ ** Timestamps\r\n   A simple timestamp just assigns a date\/time to an item.  This is\r\n   just like writing down an appointment or event in a paper agenda.\r\n   In the agenda display, the headline of an entry associated with\r\n-  a plain timestamp is shown exactly on that date.\r\n+  a plain timestamp is shown exactly on that date.  There can be\r\n+  multiple timestamps in an item.\r\n \r\n   #+begin_example\r\n   ,* Meet Peter at the movies\r\n     <2006-11-01 Wed 19:15>\r\n   ,* Discussion on climate change\r\n-    <2006-11-02 Thu>\r\n+    <2006-11-02 Thu 10:00-12:00>\r\n+  ,* My days off\r\n+    <2006-11-03 Fri>\r\n+    <2006-11-06 Mon>\r\n   #+end_example\r\n \r\n - Timestamp with repeater interval ::\r\n@@ -6053,24 +6062,32 @@ ** Timestamps\r\n     <%%(diary-float t 4 2)>\r\n   #+end_example\r\n \r\n+- Time range ::\r\n+  #+cindex: time range\r\n+\r\n+  Time range is a timestamp having two time units connected by =-=\r\n+\r\n+  #+begin_example\r\n+,* Discussion on climate change\r\n+   <2006-11-02 Thu 10:00-12:00>\r\n+  #+end_example\r\n+\r\n - Time\/Date range ::\r\n \r\n+  #+cindex: time range\r\n   #+cindex: timerange\r\n   #+cindex: date range\r\n   Two timestamps connected by =--= denote a range.  In the agenda, the\r\n   headline is shown on the first and last day of the range, and on any\r\n-  dates that are displayed and fall in the range.  Here is an example:\r\n+  dates that are displayed and fall in the range.  The first example\r\n+  specifies just the dates of the range while the second example\r\n+  specifies a time range for each date.\r\n \r\n   #+begin_example\r\n   ,** Meeting in Amsterdam\r\n      <2004-08-23 Mon>--<2004-08-26 Thu>\r\n-  #+end_example\r\n-\r\n-  Timerange is a timestamp consisting of two time units connected by =-=\r\n-\r\n-  #+begin_example\r\n-  ,* Discussion on climate change\r\n-     <2006-11-02 Thu 10:00-12:00>\r\n+  ,** This weeks committee meetings\r\n+     <2004-08-23 Mon 10:00-11:00>--<2004-08-26 Thu 10:00-11:00>\r\n   #+end_example\r\n \r\n - Inactive timestamp ::\r\n-- \r\n2.41.0\r\n\r\n","subject":"Re: Is this proper time format?"},{"date":"2023-06-12T10:07:53.241Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871qihng8m.fsf@localhost","message-id":"871qihng8m.fsf@localhost","config":false,"refs-count":7,"username":"Ihor Radchenko","references":["m2ilbts2rv.fsf@newartisans.com"],"related-refs":["m2ilbts2rv.fsf@newartisans.com","871qihng8m.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] [BUG] Inverse behavior from \\ <space> [9.6.4 (release_9.6.4-1-g76cf21 @ \/Users\/johnw\/.emacs.d\/lisp\/org-mode\/lisp\/)]"},{"date":"2023-06-04T06:23:35.786Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87mt1flp4h.fsf@localhost","message-id":"87mt1flp4h.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["4313e598-8f56-5bae-5b57-b5c8368d542b@gmail.com"],"related-refs":["87mt1flp4h.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Org Speed commands for lists"},{"date":"2023-06-01T08:18:02.655Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87pm6fbnlo.fsf@localhost","message-id":"87pm6fbnlo.fsf@localhost","config":false,"refs-count":6,"username":"Ihor Radchenko","references":["7a012430-6084-e693-1a86-f14d0512bebc@skyguard.com.cn","87cz2goqn2.fsf@localhost","9105a5ca-764f-126f-a01e-2cb92c2035dd@skyguard.com.cn"],"related-refs":["87pm6fbnlo.fsf@localhost","7a012430-6084-e693-1a86-f14d0512bebc@skyguard.com.cn"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Should we resolve environment variables in the file link path when exporting? (was: [FR] Please add environment variable substitution in `org-display-inline-images')"},{"date":"2023-05-22T12:41:14.079Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87o7mcee18.fsf@gmail.com","message-id":"87o7mcee18.fsf@gmail.com","config":false,"refs-count":2,"username":"Bruno Cardoso","references":["87sfboekwe.fsf@gmail.com","87r0r8od3o.fsf@localhost"],"related-refs":["87o7mcee18.fsf@gmail.com","87sfboekwe.fsf@gmail.com"],"from":"cardoso.bc@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87o7mcee18.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 436cd212507cc948af8de6f9e57b5e14e29f23dd Mon Sep 17 00:00:00 2001\r\nFrom: bruno <cardoso.bc@gmail.com>\r\nDate: Sun, 21 May 2023 15:53:42 -0300\r\nSubject: [PATCH] lisp\/org.el: allow org-return to call org-open-at-point on\r\n citations\r\n\r\n* lisp\/org.el (org-return): When `org-return-follows-link' is non-nil\r\nand point is over an org-cite citation or citation reference, call `org-open-at-point'.\r\n\r\nTINYCHANGE\r\n---\r\n etc\/ORG-NEWS     | 5 +++++\r\n lisp\/org-keys.el | 3 ++-\r\n lisp\/org.el      | 9 +++++----\r\n 3 files changed, 12 insertions(+), 5 deletions(-)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 6b40198b5..ddf1e9110 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -221,6 +221,11 @@ Running shell blocks with the ~:session~ header freezes Emacs until\r\n execution completes.  The new ~:async~ header allows users to continue\r\n editing with Emacs while a ~:session~ block executes.\r\n \r\n+*** ~org-return~ now acts on citations at point\r\n+\r\n+When ~org-return-follows-link~ is non-nil and cursor is over an\r\n+org-cite citation, ~org-return~ will call ~org-open-at-point~.\r\n+\r\n ** Miscellaneous\r\n *** =org-crypt.el= now applies initial visibility settings to decrypted entries\r\n \r\ndiff --git a\/lisp\/org-keys.el b\/lisp\/org-keys.el\r\nindex c62d62a1d..5f3ea8da3 100644\r\n--- a\/lisp\/org-keys.el\r\n+++ b\/lisp\/org-keys.el\r\n@@ -299,7 +299,8 @@ implementation is bad.\"\r\n \r\n (defcustom org-return-follows-link nil\r\n   \"Non-nil means on links RET will follow the link.\r\n-In tables, the special behavior of RET has precedence.\"\r\n+In tables, the special behavior of RET has precedence.\r\n+On a timestamp or a citation, call `org-open-at-point'.\"\r\n   :group 'org-link-follow\r\n   :type 'boolean\r\n   :safe #'booleanp)\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex 866af624e..8eab3ed22 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -17774,8 +17774,8 @@ When optional INDENT argument is non-nil, call\r\n and INTERACTIVE.\r\n \r\n When `org-return-follows-link' is non-nil and point is on\r\n-a timestamp or a link, call `org-open-at-point'.  However, it\r\n-will not happen if point is in a table or on a \\\"dead\\\"\r\n+a timestamp, a link or a citation, call `org-open-at-point'.\r\n+However, it will not happen if point is in a table or on a \\\"dead\\\"\r\n object (e.g., within a comment).  In these case, you need to use\r\n `org-open-at-point' directly.\"\r\n   (interactive \"i\\nP\\np\")\r\n@@ -17795,8 +17795,8 @@ object (e.g., within a comment).  In these case, you need to use\r\n \t  (insert \"\\n\")\r\n \t(org-table-justify-field-maybe)\r\n \t(call-interactively #'org-table-next-row)))\r\n-     ;; On a link or a timestamp, call `org-open-at-point' if\r\n-     ;; `org-return-follows-link' allows it.  Tolerate fuzzy\r\n+     ;; On a link, a timestamp or a citation, call `org-open-at-point'\r\n+     ;; if `org-return-follows-link' allows it.  Tolerate fuzzy\r\n      ;; locations, e.g., in a comment, as `org-open-at-point'.\r\n      ((and org-return-follows-link\r\n \t   (or (and (eq 'link element-type)\r\n@@ -17808,6 +17808,7 @@ object (e.g., within a comment).  In these case, you need to use\r\n \t\t\t(> (point) origin))))\r\n \t       (org-in-regexp org-ts-regexp-both nil t)\r\n \t       (org-in-regexp org-tsr-regexp-both nil  t)\r\n+               (org-element-lineage context '(citation citation-reference))\r\n \t       (org-in-regexp org-link-any-re nil t)))\r\n       (call-interactively #'org-open-at-point))\r\n      ;; Insert newline in heading, but preserve tags.\r\n-- \r\n2.40.1\r\n\r\n","subject":"Re: [PATCH] lisp\/org.el: allow org-return to call org-open-at-point on citations"},{"date":"2023-05-22T09:33:05.326Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/914084EE-E301-483F-AE2A-960B3CB75497@gmail.com","message-id":"914084EE-E301-483F-AE2A-960B3CB75497@gmail.com","config":false,"refs-count":6,"username":"Andrea Lazzarini","related-refs":["914084EE-E301-483F-AE2A-960B3CB75497@gmail.com"],"from":"andrea.lazzarini1@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Enhancing footnote managment (via indirect buffer)?"},{"date":"2023-05-20T15:49:13.381Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/003261a7-5860-6580-d1ad-5ffd6b36c028@gmail.com","message-id":"003261a7-5860-6580-d1ad-5ffd6b36c028@gmail.com","config":false,"refs-count":13,"username":"Patrick Useldinger","related-refs":["003261a7-5860-6580-d1ad-5ffd6b36c028@gmail.com"],"from":"uselpa@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-capture, level-2 heading, org-set-tags-command [9.6.6 ( @ \/Users\/pu\/.emacs.d\/elpa\/org-9.6.6\/)]"},{"date":"2023-05-15T14:00:58.924Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cz3166c7.fsf@localhost","message-id":"87cz3166c7.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["87bkio1y4n.fsf@localhost","878rdqd5tc.fsf@t14.reltub.ca","87fs81egk5.fsf@t14.reltub.ca","87a5y9eevv.fsf@t14.reltub.ca","87pm71hmmf.fsf@localhost","874johe1pv.fsf@t14.reltub.ca","87zg65byww.fsf@t14.reltub.ca","87jzxdzeoz.fsf@localhost"],"related-refs":["87cz3166c7.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] ob-C: Should we allow saving compiled src block to specified binary excecutable? (was: [RFC\/PATCH] naming src\/bin files in ob-C.el)"},{"date":"2023-05-12T20:36:41.097Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/07e3eab0-8cf5-905b-5a54-3917eb2dcf21@gmail.com","message-id":"07e3eab0-8cf5-905b-5a54-3917eb2dcf21@gmail.com","config":false,"refs-count":2,"username":"Panayotis Manganaris","related-refs":["07e3eab0-8cf5-905b-5a54-3917eb2dcf21@gmail.com"],"from":"panos.manganaris@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] relative buffer-local path to bib for org-cite biblatex"},{"date":"2023-05-12T13:23:48.903Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87wn1dznpx.fsf@localhost","message-id":"87wn1dznpx.fsf@localhost","config":false,"refs-count":5,"username":"Ihor Radchenko","related-refs":["87wn1dznpx.fsf@localhost","87pm6hdell.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87wn1dznpx.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From fb77ae66d4d9c01a350140481bcb0f030a45fb69 Mon Sep 17 00:00:00 2001\r\nMessage-Id: <fb77ae66d4d9c01a350140481bcb0f030a45fb69.1683897756.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Fri, 12 May 2023 15:21:59 +0200\r\nSubject: [PATCH] doc\/org-manual.org: Document `org-latex-src-block-backend'\r\n\r\n* doc\/org-manual.org (Source blocks in LaTeX export): Explain possible\r\nLaTeX export options for source blocks.\r\n---\r\n doc\/org-manual.org | 31 +++++++++++++++++++++++++++++++\r\n 1 file changed, 31 insertions(+)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex ba9fdaf20..4e56a1e00 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -14181,6 +14181,37 @@ *** Source blocks in LaTeX export\r\n #+cindex: source blocks, in @LaTeX{} export\r\n #+cindex: @samp{ATTR_LATEX}, keyword\r\n \r\n+#+vindex: org-latex-src-block-backend\r\n+LaTeX export backend provides multiple ways to render src blocks in\r\n+LaTeX, according to the value of ~org-latex-src-block-backend~:\r\n+\r\n+- =verbatim= (default) ::\r\n+\r\n+  Use =verbatim= LaTeX environment with no language-specific\r\n+  fontification.\r\n+\r\n+- =listings= ::\r\n+\r\n+  Use =listings= environment provided by the corresponding LaTeX\r\n+  package.  Org will not add the =listings= package to LaTeX preamble,\r\n+  users need to customize ~org-latex-packages-alist~ or LaTeX headers\r\n+  manually.\r\n+\r\n+- =minted= ::\r\n+\r\n+  Use more syntax-aware =minted= package.  Note that in addition to\r\n+  customizing the LaTeX preamble, [[https:\/\/pygments.org][pygments]]\r\n+  program should be installed and ~org-latex-pdf-process~ should pass\r\n+  =-shell-escape= option to LaTeX executable.\r\n+\r\n+- =engraved= ::\r\n+\r\n+  Use =fvextra= LaTeX package and Emacs package\r\n+  [[https:\/\/elpa.gnu.org\/packages\/engrave-faces][engrave-faces]]\r\n+  available on GNU Elpa.  =engrave-faces= will use Emacs fontification\r\n+  to colorize the source blocks in LaTeX output.\r\n+\r\n+\r\n The LaTeX export backend can make source code blocks into floating\r\n objects through the attributes =:float= and =:options=.  For =:float=:\r\n \r\n-- \r\n2.40.0\r\n\r\n","subject":"[PATCH] doc\/org-manual.org: Document `org-latex-src-block-backend'"},{"date":"2023-05-04T09:52:00.016Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/877ctopgmo.fsf@localhost","message-id":"877ctopgmo.fsf@localhost","config":false,"refs-count":9,"username":"Ihor Radchenko","references":["CAB+pTYkWaKXDa24-PCdJfSeXYm2=uBNk8uwWkELoSBmgQe6o7g@mail.gmail.com"],"related-refs":["877ctopgmo.fsf@localhost","CAB+pTYkWaKXDa24-PCdJfSeXYm2=uBNk8uwWkELoSBmgQe6o7g@mail.gmail.com"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Will it be ok to allow HABIT property inheritance? (optionally) (was: [BUG] org-habit does not respect STYLE property inheritance)"},{"date":"2023-04-30T10:38:33.222Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/877cttirgy.fsf@localhost","message-id":"877cttirgy.fsf@localhost","config":false,"refs-count":6,"username":"Ihor Radchenko","references":["u0cb06$17lq$1@ciao.gmane.io","u1jv45$mur$1@ciao.gmane.io","87wn2ujk27.fsf@localhost","u0rico$mir$1@ciao.gmane.io","u2gol9$16km$1@ciao.gmane.io","878remykby.fsf@localhost","87o7nsdkcw.fsf@localhost","87sfx7degz.fsf@gmail.com","u0s58k$q2t$1@ciao.gmane.io","87r0t3gahd.fsf@localhost","87jzymk3dq.fsf@localhost","87v8ks6rhf.fsf@localhost"],"related-refs":["877cttirgy.fsf@localhost","87wn2ujk27.fsf@localhost","87o7nsdkcw.fsf@localhost","87r0t3gahd.fsf@localhost","87v8ks6rhf.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/877cttirgy.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 3946dbb956afcd005cba0f1899acae5a74a109d4 Mon Sep 17 00:00:00 2001\r\nMessage-Id: <3946dbb956afcd005cba0f1899acae5a74a109d4.1682849409.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Sat, 1 Apr 2023 12:00:48 +0200\r\nSubject: [PATCH v4 1\/8] Upgrade Org build system to handle third-party\r\n dependencies\r\n\r\n* mk\/default.mk (pkgdir_top): New variable holding the location of\r\nthird-party packages to be downloaded if necessary during compilation.\r\n(EMACS_VERSION): New variable holding current Emacs version, according\r\nto EMACS.\r\n(pkgdir): New variable holding subdir where the third-party packages\r\nare downloaded, according to EMACS_VERSION.\r\n(EMACSFLAGS): New variable holding extra flags to be passed to Emacs\r\nexecutable when running make.  We follow \"PROGRAMFLAGS\" convention as\r\nrequested by GNU standards:\r\nhttps:\/\/www.gnu.org\/prep\/standards\/html_node\/Command-Variables.html\r\n(EPACKAGES): List of packages to be installed (unless already present\r\nin the `load-path') during compilation.\r\n(package-install):\r\n(INSTALL_PACKAGES): New command to download and install missing packages.\r\n(EMACSQ): Update, setting default package location to pkgdir.\r\n* mk\/targets.mk (uppkg): New target to download install missing\r\npackages.\r\n(check test):\r\n(repro):\r\n(compile compile-dirty): Use the new uppkg target.\r\n(cleanpkg): New target cleaning up the downloaded packages.\r\n(cleanall): Use the new target.\r\n(.PHONY):\r\n(CONF_BASE):\r\n(CONF_DEST):\r\n(CONF_CALL): Update according to the new variables and targets.\r\n* .gitignore: Ignore the downloaded packages.\r\n\r\nThis commit paves the way towards third-party built-time dependencies\r\nfor Org.  In particular, towards including compat.el dependency.\r\n\r\nAccording to EPACKAGES, we can auto-download necessary packages,\r\nunless they are manually specified via -L switches in EMACSFLAGS.\r\n\r\nLink: https:\/\/orgmode.org\/list\/87v8ks6rhf.fsf@localhost\r\n---\r\n .gitignore    |  1 +\r\n mk\/default.mk | 31 ++++++++++++++++++++++++++++++-\r\n mk\/targets.mk | 25 ++++++++++++++++---------\r\n 3 files changed, 47 insertions(+), 10 deletions(-)\r\n\r\ndiff --git a\/.gitignore b\/.gitignore\r\nindex 4bb81c359..0d9c5b297 100644\r\n--- a\/.gitignore\r\n+++ b\/.gitignore\r\n@@ -48,6 +48,7 @@ local*.mk\r\n .gitattributes\r\n mk\/x11idle\r\n ChangeLog\r\n+pkg-deps\/\r\n \r\n # Files generated during `make packages\/org` in a clone of `elpa.git`.\r\n \r\ndiff --git a\/mk\/default.mk b\/mk\/default.mk\r\nindex fa46661e8..393d7336a 100644\r\n--- a\/mk\/default.mk\r\n+++ b\/mk\/default.mk\r\n@@ -6,6 +6,7 @@\r\n \r\n # Name of your emacs binary\r\n EMACS\t= emacs\r\n+EMACS_VERSION := $(shell $(EMACS) -Q --batch --eval '(message \"%s\" emacs-version)' 2>&1)\r\n \r\n # Where local software is found\r\n prefix\t= \/usr\/share\r\n@@ -31,6 +32,17 @@ GIT_BRANCH =\r\n TMPDIR ?= \/tmp\r\n testdir = $(TMPDIR)\/tmp-orgtest\r\n \r\n+# Where to store Org dependencies\r\n+top_builddir := $(shell pwd)\r\n+pkgdir_top := $(top_builddir)\/pkg-deps\r\n+pkgdir := $(pkgdir_top)\/$(EMACS_VERSION)\r\n+\r\n+# Extra flags to be passed to Emacs\r\n+EMACSFLAGS ?=\r\n+\r\n+# Third-party packages to install when running make\r\n+EPACKAGES ?=\r\n+\r\n # Configuration for testing\r\n # Verbose ERT summary by default for Emacs-28 and above.\r\n # To override:\r\n@@ -72,12 +84,25 @@ REPRO_ARGS ?=\r\n req-ob-lang = --eval '(require '\"'\"'ob-$(ob-lang))'\r\n lst-ob-lang = ($(ob-lang) . t)\r\n req-extra   = --eval '(require '\"'\"'$(req))'\r\n+package-define-refresh-mark = --eval '(setq org--compile-packages-missing nil)'\r\n+package-need-refresh-mark = --eval '(unless (require '\"'\"'$(package) nil t) (setq org--compile-packages-missing t))'\r\n+package-refresh-maybe = --eval '(if org--compile-packages-missing (package-refresh-contents) (message \"No third-party packages need to be installed\"))'\r\n+package-install-maybe = --eval '(unless (require '\"'\"'$(package) nil t) (package-install '\"'\"'$(package)))'\r\n BTEST_RE   ?= \\\\(org\\\\|ob\\\\|ox\\\\)\r\n BTEST_LOAD  = \\\r\n \t--eval '(add-to-list '\"'\"'load-path (concat default-directory \"lisp\"))' \\\r\n \t--eval '(add-to-list '\"'\"'load-path (concat default-directory \"testing\"))'\r\n BTEST_INIT  = $(BTEST_PRE) $(BTEST_LOAD) $(BTEST_POST)\r\n \r\n+ifeq (,$(EPACKAGES))\r\n+INSTALL_PACKAGES =\r\n+else\r\n+INSTALL_PACKAGES = \\\r\n+\t$(BATCH) \\\r\n+        $(package-define-refresh-mark) $(foreach package,$(EPACKAGES),$(package-need-refresh-mark)) $(package-refresh-maybe) \\\r\n+        $(foreach package,$(EPACKAGES),$(package-install-maybe))\r\n+endif\r\n+\r\n BTEST = $(BATCH) $(BTEST_INIT) \\\r\n \t  -l org-batch-test-init \\\r\n \t  --eval '(setq \\\r\n@@ -116,7 +141,11 @@ REPRO = $(NOBATCH) $(REPRO_INIT) $(REPRO_ARGS)\r\n \r\n # start Emacs with no user and site configuration\r\n # EMACSQ = -vanilla # XEmacs\r\n-EMACSQ  = $(EMACS)  -Q\r\n+EMACSQ  = $(EMACS)  -Q \\\r\n+\t  $(EMACSFLAGS) \\\r\n+\t  --eval '(setq vc-handled-backends nil org-startup-folded nil org-element-cache-persistent nil)' \\\r\n+          --eval '(make-directory \"$(pkgdir)\" t)' \\\r\n+\t  --eval '(setq package-user-dir \"$(pkgdir)\")' --eval '(package-initialize)'\r\n \r\n # Using emacs in batch mode.\r\n BATCH\t= $(EMACSQ) -batch \\\r\ndiff --git a\/mk\/targets.mk b\/mk\/targets.mk\r\nindex 06016561c..18140c5c0 100644\r\n--- a\/mk\/targets.mk\r\n+++ b\/mk\/targets.mk\r\n@@ -27,21 +27,21 @@ ifneq ($(GITSTATUS),)\r\n   GITVERSION := $(GITVERSION:.dirty=).dirty\r\n endif\r\n \r\n-.PHONY:\tall oldorg update update2 up0 up1 up2 single $(SUBDIRS) \\\r\n+.PHONY:\tall oldorg update update2 up0 up1 up2 uppkg single $(SUBDIRS) \\\r\n \tcheck test install $(INSTSUB) \\\r\n \tinfo html pdf card refcard doc docs \\\r\n \tautoloads cleanall clean $(CLEANDIRS:%=clean%) \\\r\n \tclean-install cleanelc cleandirs \\\r\n-\tcleanlisp cleandoc cleandocs cleantest \\\r\n+\tcleanlisp cleandoc cleandocs cleantest cleanpkg \\\r\n \tcompile compile-dirty uncompiled \\\r\n \tconfig config-test config-exe config-all config-eol config-version \\\r\n \tvanilla repro\r\n \r\n-CONF_BASE = EMACS DESTDIR ORGCM ORG_MAKE_DOC\r\n-CONF_DEST = lispdir infodir datadir testdir\r\n+CONF_BASE = EMACS DESTDIR ORGCM ORG_MAKE_DOC EPACKAGES\r\n+CONF_DEST = lispdir infodir datadir testdir pkgdir\r\n CONF_TEST = BTEST_PRE BTEST_POST BTEST_OB_LANGUAGES BTEST_EXTRA BTEST_RE\r\n CONF_EXEC = CP MKDIR RM RMR FIND CHMOD SUDO PDFTEX TEXI2PDF TEXI2HTML MAKEINFO INSTALL_INFO\r\n-CONF_CALL = BATCH BATCHL ELC ELCDIR NOBATCH BTEST MAKE_LOCAL_MK MAKE_ORG_INSTALL MAKE_ORG_VERSION\r\n+CONF_CALL = BATCH BATCHL ELC ELCDIR NOBATCH INSTALL_PACKAGES BTEST MAKE_LOCAL_MK MAKE_ORG_INSTALL MAKE_ORG_VERSION\r\n config-eol:: EOL = \\#\r\n config-eol:: config-all\r\n config config-all::\r\n@@ -86,7 +86,7 @@ local.mk:\r\n \r\n all compile::\r\n \t$(foreach dir, doc lisp, $(MAKE) -C $(dir) clean;)\r\n-compile compile-dirty::\r\n+compile compile-dirty:: uppkg\r\n \t$(MAKE) -C lisp $@\r\n all clean-install::\r\n \t$(foreach dir, $(SUBDIRS), $(MAKE) -C $(dir) $@;)\r\n@@ -94,7 +94,7 @@ all clean-install::\r\n vanilla:\r\n \t-@$(NOBATCH) &\r\n \r\n-check test::\tcompile\r\n+check test::\tuppkg compile\r\n check test test-dirty::\r\n \t-$(MKDIR) $(testdir)\r\n \tTMPDIR=$(testdir) $(BTEST)\r\n@@ -102,6 +102,10 @@ ifeq ($(TEST_NO_AUTOCLEAN),) # define this variable to leave $(testdir) around f\r\n \t$(MAKE) cleantest\r\n endif\r\n \r\n+uppkg::\r\n+\t@$(MKDIR) -p $(pkgdir)\r\n+\t-@$(INSTALL_PACKAGES)\r\n+\r\n up0 up1 up2::\r\n \tgit checkout $(GIT_BRANCH)\r\n \tgit remote update\r\n@@ -126,7 +130,7 @@ $(INSTSUB):\r\n autoloads: lisp\r\n \t$(MAKE) -C $< $@\r\n \r\n-repro: cleanall autoloads\r\n+repro: cleanall uppkg autoloads\r\n \t-@$(REPRO) &\r\n \r\n cleandirs:\r\n@@ -134,7 +138,7 @@ cleandirs:\r\n \r\n clean:\tcleanlisp cleandoc\r\n \r\n-cleanall: cleandirs cleantest\r\n+cleanall: cleandirs cleantest cleanpkg\r\n \t-$(FIND) . \\( -name \\*~ -o -name \\*# -o -name .#\\* \\) -exec $(RM) {} +\r\n \t-$(FIND) $(CLEANDIRS) \\( -name \\*~ -o -name \\*.elc \\) -exec $(RM) {} +\r\n \r\n@@ -159,3 +163,6 @@ cleantest:\r\n \t  $(FIND) $(testdir) -type d -exec $(CHMOD) u+w {} + && \\\r\n \t  $(RMR) $(testdir) ; \\\r\n \t}\r\n+\r\n+cleanpkg:\r\n+\t-$(RMR) $(pkgdir_top)\r\n-- \r\n2.40.0\r\n\r\n","subject":"[PATCH v4] Add compat.el support to Org (was: [POLL] Use compat.el in Org? (was: Useful package? Compat.el))"},{"date":"2023-04-27T11:29:06.293Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ildho952.fsf@localhost","message-id":"87ildho952.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["1032532251.385739.1682523845362@mail.yahoo.com","1032532251.385739.1682523845362.ref@mail.yahoo.com"],"related-refs":["87ildho952.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Linking SCHEDULED and DEADLINE repeating timestamps to avoid desynchronization"},{"date":"2023-04-23T15:20:20.226Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/sdvmt2ypqy9.fsf@netyu.xyz","message-id":"sdvmt2ypqy9.fsf@netyu.xyz","config":false,"refs-count":3,"username":"Ruijie Yu via General discussions about Org-mode.","references":["D140FA73-9995-4467-963E-00D5964485C0@axelkielhorn.de","87ildmuavp.fsf@localhost","sdv7cu4ugk2.fsf@netyu.xyz","sdvedocukz1.fsf@netyu.xyz","sdvv8housn7.fsf@netyu.xyz","87y1misv5l.fsf@localhost","877cu24p5b.fsf@localhost","sdvzg6ypsx5.fsf@netyu.xyz","sdvjzy2rhne.fsf@netyu.xyz","sdvzg70utif.fsf@netyu.xyz","sdvmt30um3h.fsf@netyu.xyz"],"related-refs":["sdvmt2ypqy9.fsf@netyu.xyz","sdvedocukz1.fsf@netyu.xyz","sdvmt30um3h.fsf@netyu.xyz"],"from":"emacs-orgmode@gnu.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/sdvmt2ypqy9.fsf@netyu.xyz","source-id":"emacs-orgmode@gnu.org","patch-body":"diff --git a\/lisp\/org-colview.el b\/lisp\/org-colview.el\r\nindex 92a3b473d..e8106f9cd 100644\r\n--- a\/lisp\/org-colview.el\r\n+++ b\/lisp\/org-colview.el\r\n@@ -452,14 +452,30 @@ DATELINE is non-nil when the face used should be\r\n \t    \"Type \\\\<org-columns-map>`\\\\[org-columns-edit-value]' \\\r\n to edit property\")))))))\r\n \r\n+(defun org-columns--substring-below-width (string start width)\r\n+  \"Similar to `substring', but use `string-width' to check width.\r\n+The returned value is a substring of STRING, starting at START,\r\n+and is the largest possible substring whose width does not exceed\r\n+WIDTH.\"\r\n+  (let ((end (min (+ start width) (length string))) res)\r\n+    (while (and end (>= end start))\r\n+      (let* ((curr (string-width string start end))\r\n+             (excess (- curr width)))\r\n+        (if (cl-plusp excess)\r\n+            (cl-decf end (max 1 (\/ excess 2)))\r\n+          (setq res (substring string start end) end nil))))\r\n+    res))\r\n+\r\n (defun org-columns-add-ellipses (string width)\r\n   \"Truncate STRING with WIDTH characters, with ellipses.\"\r\n   (cond\r\n-   ((<= (length string) width) string)\r\n-   ((<= width (length org-columns-ellipses))\r\n-    (substring org-columns-ellipses 0 width))\r\n-   (t (concat (substring string 0 (- width (length org-columns-ellipses)))\r\n-\t      org-columns-ellipses))))\r\n+   ((<= (string-width string) width) string)\r\n+   ((<= width (string-width org-columns-ellipses))\r\n+    (org-columns--substring-below-width org-columns-ellipses 0 width))\r\n+   (t (concat\r\n+       (org-columns--substring-below-width\r\n+        string 0 (- width (length org-columns-ellipses)))\r\n+       org-columns-ellipses))))\r\n \r\n (defvar org-columns-full-header-line-format nil\r\n   \"The full header line format, will be shifted by horizontal scrolling.\" )\r\n","subject":"Re: [DRAFT PATCH v2] Decouple LANG= and testing (was: Test failure due to LANG)"},{"date":"2023-04-17T18:44:40.500Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ilduqrem.fsf@localhost","message-id":"87ilduqrem.fsf@localhost","config":false,"refs-count":6,"username":"Ihor Radchenko","related-refs":["87ilduqrem.fsf@localhost","87mt35h3ip.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] ob-R tests fail on Emacs 27 since ESS commit 536b5b914a7 [9.7-pre (release_9.6.4-318-gcfe5e0.dirty @ \/home\/yantar92\/.emacs.d\/straight\/build\/org\/)]"},{"date":"2023-04-11T16:55:37.468Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/3485389.iIbC2pHGDl@pluto","message-id":"3485389.iIbC2pHGDl@pluto","config":false,"refs-count":2,"username":"chris","related-refs":["3485389.iIbC2pHGDl@pluto"],"from":"inkbottle007@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-latex-preview with custom sty file"},{"date":"2023-04-06T10:13:43.816Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87lej51frx.fsf@gmail.com","message-id":"87lej51frx.fsf@gmail.com","config":false,"refs-count":9,"username":"S\u0142awomir Grochowski","related-refs":["87lej51frx.fsf@gmail.com"],"from":"slawomir.grochowski@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87lej51frx.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 1f0f2052b8dddf4982ab35267ed1564f2250784b Mon Sep 17 00:00:00 2001\r\nFrom: S\u0142awomir Grochowski <slawomir.grochowski@gmail.com>\r\nDate: Mon, 3 Apr 2023 19:23:09 +0200\r\nSubject: [PATCH] org-columns: add feat to move row up\/down\r\n\r\n---\r\n lisp\/org-colview.el              | 22 +++++++++++\r\n testing\/lisp\/test-org-colview.el | 66 ++++++++++++++++++++++++++++++++\r\n 2 files changed, 88 insertions(+)\r\n\r\ndiff --git a\/lisp\/org-colview.el b\/lisp\/org-colview.el\r\nindex 92a3b473d..0971d5eef 100644\r\n--- a\/lisp\/org-colview.el\r\n+++ b\/lisp\/org-colview.el\r\n@@ -209,6 +209,8 @@ See `org-columns-summary-types' for details.\")\r\n (org-defkey org-columns-map \">\" #'org-columns-widen)\r\n (org-defkey org-columns-map [(meta right)] #'org-columns-move-right)\r\n (org-defkey org-columns-map [(meta left)]  #'org-columns-move-left)\r\n+(org-defkey org-columns-map [(meta down)]  #'org-columns-move-row-down)\r\n+(org-defkey org-columns-map [(meta up)]  #'org-columns-move-row-up)\r\n (org-defkey org-columns-map [(shift meta right)] #'org-columns-new)\r\n (org-defkey org-columns-map [(shift meta left)]  #'org-columns-delete)\r\n (dotimes (i 10)\r\n@@ -1003,6 +1005,26 @@ details.\"\r\n     (org-columns-move-right)\r\n     (backward-char 1)))\r\n \r\n+(defun org-columns--move-row (&optional up)\r\n+    \"Move table row. Calls `org-move-subtree-down' or `org-move-subtree-up'.\"\r\n+    (let ((inhibit-read-only t)\r\n+          (col (current-column)))\r\n+      (if up (org-move-subtree-up)\r\n+        (org-move-subtree-down))\r\n+      (let ((org-columns-inhibit-recalculation t))\r\n+        (org-columns-redo)\r\n+        (move-to-column col))))\r\n+\r\n+(defun org-columns-move-row-down ()\r\n+  \"Move table row (subtree) down.\"\r\n+  (interactive)\r\n+  (org-columns--move-row))\r\n+\r\n+(defun org-columns-move-row-up ()\r\n+  \"Move table row (subtree) up.\"\r\n+  (interactive)\r\n+  (org-columns--move-row 'up))\r\n+\r\n (defun org-columns-store-format ()\r\n   \"Store the text version of the current columns format.\r\n The format is stored either in the COLUMNS property of the node\r\ndiff --git a\/testing\/lisp\/test-org-colview.el b\/testing\/lisp\/test-org-colview.el\r\nindex 9daec18e2..fd02f054c 100644\r\n--- a\/testing\/lisp\/test-org-colview.el\r\n+++ b\/testing\/lisp\/test-org-colview.el\r\n@@ -1010,6 +1010,72 @@\r\n \t    (list (get-char-property 1 'org-columns-value-modified)\r\n \t\t  (get-char-property 2 'org-columns-value-modified))))))\r\n \r\n+;; Each column is an overlay on top of a character.  So there has\r\n+;; to be at least as many characters available on the line as\r\n+;; columns to display.\r\n+;; 'org-columns--display-here'\r\n+(ert-deftest test-org-colview\/bug-add-whitespace ()\r\n+  \"Insert space characters if number of characters on the line\r\n+  is lower then number of columns.\"\r\n+  :expected-result :failed\r\n+  (should\r\n+   (equal \"* H\r\n+** A\r\n+** B\r\n+\"\r\n+          (org-test-with-temp-text \"* H\r\n+** A\r\n+** B\r\n+\"\r\n+            (org-columns)\r\n+            (buffer-substring-no-properties (point-min) (point-max))))))\r\n+\r\n+(ert-deftest test-org-colview\/columns-move-row-down ()\r\n+  \"Test `org-columns-move-row-down' specifications.\"\r\n+  (should\r\n+   (equal \"* H\r\n+** B\r\n+** A\r\n+\"\r\n+          (org-test-with-temp-text \"* H\r\n+** A\r\n+** B\r\n+\"\r\n+            (let ((org-columns-default-format \"%ITEM\")) (org-columns)\r\n+                 (next-line 1)\r\n+                 (org-columns-move-row-down)\r\n+                 (buffer-substring-no-properties (point-min) (point-max)))))))\r\n+\r\n+(ert-deftest test-org-colview\/columns-move-row-up ()\r\n+  \"Test `org-columns-move-row-up' specifications.\"\r\n+  (should\r\n+   (equal \"* H\r\n+** B\r\n+** A\r\n+\"\r\n+          (org-test-with-temp-text \"* H\r\n+** A\r\n+** B\r\n+\"\r\n+            (let ((org-columns-default-format \"%ITEM\")) (org-columns)\r\n+                 (next-line 2)\r\n+                 (org-columns-move-row-up)\r\n+                 (buffer-substring-no-properties (point-min) (point-max)))))))\r\n+\r\n+(ert-deftest test-org-colview\/columns-move-row ()\r\n+  \"After function call 'org-columns--move-row' point should stay at the same column.\"\r\n+  (should\r\n+   (equal 35\r\n+                    (org-test-with-temp-text \"* H\r\n+** A\r\n+** B\r\n+\"\r\n+          (org-columns)\r\n+          (next-line 1)\r\n+          (forward-char 2)\r\n+          (org-columns-move-row-down)\r\n+          (current-column)))))\r\n+\r\n (ert-deftest test-org-colview\/columns-move-left ()\r\n   \"Test `org-columns-move-left' specifications.\"\r\n   ;; Error when trying to move the left-most column.\r\n-- \r\n2.30.2\r\n\r\n","subject":"[RFC] [feat] org-colview\/org-columns: 'column view' moving rows up\/down"},{"date":"2023-04-03T08:46:10.868Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87jzytbbg2.fsf@localhost","message-id":"87jzytbbg2.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["u0cb06$17lq$1@ciao.gmane.io","87wn2ujk27.fsf@localhost","87sfx7degz.fsf@gmail.com","87r0t3gahd.fsf@localhost","87v8ks6rhf.fsf@localhost"],"related-refs":["87wn2ujk27.fsf@localhost","87jzytbbg2.fsf@localhost","87r0t3gahd.fsf@localhost","87v8ks6rhf.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87jzytbbg2.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 313f2b6acdf67f29f4f5f671e8278bb3e566cabf Mon Sep 17 00:00:00 2001\r\nMessage-Id: <313f2b6acdf67f29f4f5f671e8278bb3e566cabf.1680511418.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Sat, 1 Apr 2023 12:00:48 +0200\r\nSubject: [PATCH 1\/7] Upgrade Org build system to handle third-party\r\n dependencies\r\n\r\n* mk\/default.mk (pkgdir): New variable holding the location of\r\nthird-party packages to be downloaded if necessary during compilation.\r\n(EFLAGS): New variable holding extra flags to be passed to Emacs\r\nexecutable when running make.\r\n(EPACKAGES): List of packages to be installed (unless already present\r\nin the `load-path') during compilation.\r\n(package-install):\r\n(INSTALL_PACKAGES): New command to download and install missing packages.\r\n(BATCH): Update, setting default package location to pkgdir.\r\n* mk\/targets.mk (uppkg): New target to download install missing\r\npackages.\r\n(check test):\r\n(compile compile-dirty): Use the new uppkg target.\r\n(cleanpkg): New target cleaning up the downloaded packages.\r\n(cleanall): Use the new target.\r\n(.PHONY):\r\n(CONF_BASE):\r\n(CONF_DEST):\r\n(CONF_CALL): Update according to the new variables and targets.\r\n* .gitignore: Ignore the downloaded packages.\r\n\r\nThis commit paves the way towards third-party built-time dependencies\r\nfor Org.  In particular, towards including compat.el dependency.\r\n\r\nAccording to EPACKAGES, we can auto-download necessary packages,\r\nunless they are manually specified via -L switches in EFLAGS.\r\n\r\nLink: https:\/\/orgmode.org\/list\/87v8ks6rhf.fsf@localhost\r\n---\r\n .gitignore    |  1 +\r\n mk\/default.mk | 24 +++++++++++++++++++++++-\r\n mk\/targets.mk | 24 ++++++++++++++++--------\r\n 3 files changed, 40 insertions(+), 9 deletions(-)\r\n\r\ndiff --git a\/.gitignore b\/.gitignore\r\nindex 4bb81c359..0d9c5b297 100644\r\n--- a\/.gitignore\r\n+++ b\/.gitignore\r\n@@ -48,6 +48,7 @@ local*.mk\r\n .gitattributes\r\n mk\/x11idle\r\n ChangeLog\r\n+pkg-deps\/\r\n \r\n # Files generated during `make packages\/org` in a clone of `elpa.git`.\r\n \r\ndiff --git a\/mk\/default.mk b\/mk\/default.mk\r\nindex fa46661e8..997b22b66 100644\r\n--- a\/mk\/default.mk\r\n+++ b\/mk\/default.mk\r\n@@ -31,6 +31,15 @@ GIT_BRANCH =\r\n TMPDIR ?= \/tmp\r\n testdir = $(TMPDIR)\/tmp-orgtest\r\n \r\n+# Where to store Org dependencies\r\n+pkgdir = $(shell pwd)\/pkg-deps\r\n+\r\n+# Extra flags to be passed to Emacs\r\n+EFLAGS ?=\r\n+\r\n+# Third-party packages to install when running make\r\n+EPACKAGES ?=\r\n+\r\n # Configuration for testing\r\n # Verbose ERT summary by default for Emacs-28 and above.\r\n # To override:\r\n@@ -72,12 +81,22 @@ REPRO_ARGS ?=\r\n req-ob-lang = --eval '(require '\"'\"'ob-$(ob-lang))'\r\n lst-ob-lang = ($(ob-lang) . t)\r\n req-extra   = --eval '(require '\"'\"'$(req))'\r\n+package-install = --eval '(unless (require '\"'\"'$(package) nil t) (message \"%s\" load-path) (package-install '\"'\"'$(package)))'\r\n BTEST_RE   ?= \\\\(org\\\\|ob\\\\|ox\\\\)\r\n BTEST_LOAD  = \\\r\n \t--eval '(add-to-list '\"'\"'load-path (concat default-directory \"lisp\"))' \\\r\n \t--eval '(add-to-list '\"'\"'load-path (concat default-directory \"testing\"))'\r\n BTEST_INIT  = $(BTEST_PRE) $(BTEST_LOAD) $(BTEST_POST)\r\n \r\n+ifeq (,$(EPACKAGES))\r\n+INSTALL_PACKAGES =\r\n+else\r\n+INSTALL_PACKAGES = \\\r\n+\t$(BATCH) \\\r\n+        --eval '(package-refresh-contents)' \\\r\n+        $(foreach package,$(EPACKAGES),$(package-install))\r\n+endif\r\n+\r\n BTEST = $(BATCH) $(BTEST_INIT) \\\r\n \t  -l org-batch-test-init \\\r\n \t  --eval '(setq \\\r\n@@ -120,7 +139,10 @@ EMACSQ  = $(EMACS)  -Q\r\n \r\n # Using emacs in batch mode.\r\n BATCH\t= $(EMACSQ) -batch \\\r\n-\t  --eval '(setq vc-handled-backends nil org-startup-folded nil org-element-cache-persistent nil)'\r\n+\t  $(EFLAGS) \\\r\n+\t  --eval '(setq vc-handled-backends nil org-startup-folded nil org-element-cache-persistent nil)' \\\r\n+          --eval '(make-directory \"$(pkgdir)\" t)' \\\r\n+\t  --eval '(setq package-user-dir \"$(pkgdir)\")' --eval '(package-initialize)'\r\n \r\n # Emacs must be started in toplevel directory\r\n BATCHO\t= $(BATCH) \\\r\ndiff --git a\/mk\/targets.mk b\/mk\/targets.mk\r\nindex 0bd293d68..ab8b830bb 100644\r\n--- a\/mk\/targets.mk\r\n+++ b\/mk\/targets.mk\r\n@@ -27,21 +27,21 @@ ifneq ($(GITSTATUS),)\r\n   GITVERSION := $(GITVERSION:.dirty=).dirty\r\n endif\r\n \r\n-.PHONY:\tall oldorg update update2 up0 up1 up2 single $(SUBDIRS) \\\r\n+.PHONY:\tall oldorg update update2 up0 up1 up2 uppkg single $(SUBDIRS) \\\r\n \tcheck test install $(INSTSUB) \\\r\n \tinfo html pdf card refcard doc docs \\\r\n \tautoloads cleanall clean $(CLEANDIRS:%=clean%) \\\r\n \tclean-install cleanelc cleandirs \\\r\n-\tcleanlisp cleandoc cleandocs cleantest \\\r\n+\tcleanlisp cleandoc cleandocs cleantest cleanpkg \\\r\n \tcompile compile-dirty uncompiled \\\r\n \tconfig config-test config-exe config-all config-eol config-version \\\r\n \tvanilla repro\r\n \r\n-CONF_BASE = EMACS DESTDIR ORGCM ORG_MAKE_DOC\r\n-CONF_DEST = lispdir infodir datadir testdir\r\n+CONF_BASE = EMACS DESTDIR ORGCM ORG_MAKE_DOC EPACKAGES\r\n+CONF_DEST = lispdir infodir datadir testdir pkgdir\r\n CONF_TEST = BTEST_PRE BTEST_POST BTEST_OB_LANGUAGES BTEST_EXTRA BTEST_RE\r\n CONF_EXEC = CP MKDIR RM RMR FIND CHMOD SUDO PDFTEX TEXI2PDF TEXI2HTML MAKEINFO INSTALL_INFO\r\n-CONF_CALL = BATCH BATCHL ELC ELCDIR NOBATCH BTEST MAKE_LOCAL_MK MAKE_ORG_INSTALL MAKE_ORG_VERSION\r\n+CONF_CALL = BATCH BATCHL ELC ELCDIR NOBATCH INSTALL_PACKAGES BTEST MAKE_LOCAL_MK MAKE_ORG_INSTALL MAKE_ORG_VERSION\r\n config-eol:: EOL = \\#\r\n config-eol:: config-all\r\n config config-all::\r\n@@ -86,7 +86,7 @@ local.mk:\r\n \r\n all compile::\r\n \t$(foreach dir, doc lisp, $(MAKE) -C $(dir) clean;)\r\n-compile compile-dirty::\r\n+compile compile-dirty:: uppkg\r\n \t$(MAKE) -C lisp $@\r\n all clean-install::\r\n \t$(foreach dir, $(SUBDIRS), $(MAKE) -C $(dir) $@;)\r\n@@ -94,7 +94,7 @@ all clean-install::\r\n vanilla:\r\n \t-@$(NOBATCH) &\r\n \r\n-check test::\tcompile\r\n+check test::\tuppkg compile\r\n check test test-dirty::\r\n \t-$(MKDIR) $(testdir)\r\n \tTMPDIR=$(testdir) $(BTEST)\r\n@@ -102,6 +102,11 @@ ifeq ($(TEST_NO_AUTOCLEAN),) # define this variable to leave $(testdir) around f\r\n \t$(MAKE) cleantest\r\n endif\r\n \r\n+uppkg::\r\n+\t-$(MKDIR) -p $(pkgdir)\r\n+\t-$(FIND) $(pkgdir) \\(  -name \\*.elc \\) -exec $(RM) {} +\r\n+\t$(INSTALL_PACKAGES)\r\n+\r\n up0 up1 up2::\r\n \tgit checkout $(GIT_BRANCH)\r\n \tgit remote update\r\n@@ -134,7 +139,7 @@ cleandirs:\r\n \r\n clean:\tcleanlisp cleandoc\r\n \r\n-cleanall: cleandirs cleantest\r\n+cleanall: cleandirs cleantest cleanpkg\r\n \t-$(FIND) . \\( -name \\*~ -o -name \\*# -o -name .#\\* \\) -exec $(RM) {} +\r\n \t-$(FIND) $(CLEANDIRS) \\( -name \\*~ -o -name \\*.elc \\) -exec $(RM) {} +\r\n \r\n@@ -159,3 +164,6 @@ cleantest:\r\n \t  $(FIND) $(testdir) -type d -exec $(CHMOD) u+w {} + && \\\r\n \t  $(RMR) $(testdir) ; \\\r\n \t}\r\n+\r\n+cleanpkg:\r\n+\t-$(RMR) $(pkgdir)\r\n-- \r\n2.40.0\r\n\r\n","subject":"[PATCH v3] Add compat.el support to Org (was: [POLL] Use compat.el in Org? (was: Useful package? Compat.el))"},{"date":"2023-03-28T21:55:10.163Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/1872a35eeec.dcff8bea422796.5356383202108217532@excalamus.com","message-id":"1872a35eeec.dcff8bea422796.5356383202108217532@excalamus.com","config":false,"refs-count":18,"username":"Matt","references":["CAMbmz5kyiXN5zeWE9f3RmfktONpyc7jL846MM1vXeEfAwOSAPA@mail.gmail.com"],"related-refs":["87sfdfakv8.fsf@localhost","1872a35eeec.dcff8bea422796.5356383202108217532@excalamus.com"],"from":"matt@excalamus.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] No font lock in src blocks for shells in org-babel-shell-names (was Re: Font lock for org-babel shell scripts?)"},{"date":"2023-03-28T10:52:07.675Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87wn31up0d.fsf@localhost","message-id":"87wn31up0d.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["CALsznM=CQEpimm2i-6ECNZQeJfwYjZfDxH0xv0kH=zeaiPOWeQ@mail.gmail.com"],"related-refs":["87wn31up0d.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Shifting timestamp hours around daylight transition (was: Clock dates - org-shiftdown not working)"},{"date":"2023-03-25T17:45:48.733Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/874jq8ohbr.fsf@localhost","message-id":"874jq8ohbr.fsf@localhost","config":false,"refs-count":51,"username":"Ihor Radchenko","references":["87pm91ngb8.fsf@localhost","87o7omg4ie.fsf@alphaville.usersys.redhat.com","87mt43agk6.fsf@localhost","tvhovc$mna$1@ciao.gmane.io","87jzz8f3re.fsf@alphaville.usersys.redhat.com"],"related-refs":["874jq8ohbr.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Should we accept breaking changes to get rid of Org libraries that perform side effects when loading? (was: org-ctags land grab)"},{"date":"2023-03-25T17:03:02.958Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87a6006aa9.fsf@gmail.com","message-id":"87a6006aa9.fsf@gmail.com","config":false,"refs-count":2,"username":"Jack Kamm","references":["87a61j3orj.fsf@gmail.com","1864701b4b8.e37160d6373275.4308190093579612690@excalamus.com","1864bbf632d.acf83486624816.5548943856411522610@excalamus.com","87wn4j1mee.fsf@gmail.com","87ttzhy9vm.fsf@gmail.com","875yc1wz37.fsf@localhost","87357a2r27.fsf@gmail.com","186283d230a.129f5feb61660123.3289004102603503414@excalamus.com"],"related-refs":["1864bbf632d.acf83486624816.5548943856411522610@excalamus.com","87a6006aa9.fsf@gmail.com","877cv46a3q.fsf@gmail.com"],"from":"jackkamm@tatersworld.org","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87a6006aa9.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 47bf309b9af4cd342d3e939442504a9d34bf6592 Mon Sep 17 00:00:00 2001\r\nFrom: Jack Kamm <jackkamm@gmail.com>\r\nDate: Sat, 25 Mar 2023 07:53:28 -0700\r\nSubject: [PATCH] ob-python: Allow working with externally started sessions\r\n again\r\n\r\n* lisp\/ob-python.el (python-shell-buffer-name): Remove unneeded\r\ndefvar.\r\n(org-babel-python-initiate-session-by-key): Check if session already\r\nexisted before run-python.  Only wait for initialization if it's a\r\nnewly started session.  Also simplify the code a bit by combining\r\nmultiple setq and let statements into a single let statement.  Also\r\nadd a comment about why adding to `python-shell-first-prompt-hook'\r\nafter `run-python' should be safe from race conditions.\r\n---\r\n lisp\/ob-python.el | 43 ++++++++++++++++++++++++-------------------\r\n 1 file changed, 24 insertions(+), 19 deletions(-)\r\n\r\ndiff --git a\/lisp\/ob-python.el b\/lisp\/ob-python.el\r\nindex 456f2d489..0e0539d7a 100644\r\n--- a\/lisp\/ob-python.el\r\n+++ b\/lisp\/ob-python.el\r\n@@ -169,7 +169,6 @@ (defun org-babel-python-without-earmuffs (session)\r\n \t(substring name 1 (- (length name) 1))\r\n       name)))\r\n \r\n-(defvar python-shell-buffer-name)\r\n (defvar-local org-babel-python--initialized nil\r\n   \"Flag used to mark that python session has been initialized.\")\r\n (defun org-babel-python-initiate-session-by-key (&optional session)\r\n@@ -178,27 +177,33 @@ (defun org-babel-python-initiate-session-by-key (&optional session)\r\n then create.  Return the initialized session.\"\r\n   (save-window-excursion\r\n     (let* ((session (if session (intern session) :default))\r\n-           (py-buffer (org-babel-python-session-buffer session))\r\n+           (py-buffer (or (org-babel-python-session-buffer session)\r\n+                          (org-babel-python-with-earmuffs session)))\r\n \t   (cmd (if (member system-type '(cygwin windows-nt ms-dos))\r\n \t\t    (concat org-babel-python-command \" -i\")\r\n-\t\t  org-babel-python-command)))\r\n-      (unless py-buffer\r\n-\t(setq py-buffer (org-babel-python-with-earmuffs session)))\r\n-      (let ((python-shell-buffer-name\r\n-\t     (org-babel-python-without-earmuffs py-buffer)))\r\n-\t(run-python cmd)\r\n-        (with-current-buffer py-buffer\r\n-          (add-hook\r\n-           'python-shell-first-prompt-hook\r\n-           (lambda () (setq-local org-babel-python--initialized t))\r\n-           nil 'local)))\r\n-      ;; Wait until Python initializes.\r\n-      ;; This is more reliable compared to\r\n-      ;; `org-babel-comint-wait-for-output' as python may emit\r\n-      ;; multiple prompts during initialization.\r\n+\t\t  org-babel-python-command))\r\n+           (python-shell-buffer-name\r\n+\t    (org-babel-python-without-earmuffs py-buffer))\r\n+           (existing-session-p (comint-check-proc py-buffer)))\r\n+      (run-python cmd)\r\n       (with-current-buffer py-buffer\r\n-        (while (not org-babel-python--initialized)\r\n-          (org-babel-comint-wait-for-output py-buffer)))\r\n+        ;; Adding to `python-shell-first-prompt-hook' immediately\r\n+        ;; after `run-python' should be safe from race conditions,\r\n+        ;; because subprocess output only arrives when Emacs is\r\n+        ;; waiting (see elisp manual, \"Output from Processes\")\r\n+        (add-hook\r\n+         'python-shell-first-prompt-hook\r\n+         (lambda () (setq-local org-babel-python--initialized t))\r\n+         nil 'local))\r\n+      ;; Don't hang if session was started externally\r\n+      (unless existing-session-p\r\n+        ;; Wait until Python initializes\r\n+        ;; This is more reliable compared to\r\n+        ;; `org-babel-comint-wait-for-output' as python may emit\r\n+        ;; multiple prompts during initialization.\r\n+        (with-current-buffer py-buffer\r\n+          (while (not org-babel-python--initialized)\r\n+            (org-babel-comint-wait-for-output py-buffer))))\r\n       (setq org-babel-python-buffers\r\n \t    (cons (cons session py-buffer)\r\n \t\t  (assq-delete-all session org-babel-python-buffers)))\r\n-- \r\n2.39.2\r\n\r\n","subject":"Re: [BUG] shell sessions started outside of Babel broken"},{"date":"2023-03-24T16:19:19.379Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87r0texwor.fsf@localhost","message-id":"87r0texwor.fsf@localhost","config":false,"refs-count":15,"username":"Ihor Radchenko","references":["6416e4d9.df0a0220.ce03d.5c4b@mx.google.com","875yaxvy93.fsf@localhost","6416d214.5d0a0220.d9c1.54aa@mx.google.com","87h6udozvh.fsf@localhost"],"related-refs":["641ec686.050a0220.16dbc.a6ca@mx.google.com","6469cafa.1c0a0220.4db6f.0396@mx.google.com","6457883b.5d0a0220.2b9fc.8fd2@mx.google.com","87r0texwor.fsf@localhost","6457663a.df0a0220.f6b38.a05e@mx.google.com","6416d214.5d0a0220.d9c1.54aa@mx.google.com","87h6udozvh.fsf@localhost","87a5xi5k47.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87r0texwor.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 1273b5b415fa420e718645452bc75bc7a9407af5 Mon Sep 17 00:00:00 2001\r\nMessage-Id: <1273b5b415fa420e718645452bc75bc7a9407af5.1679653723.git.yantar92@posteo.net>\r\nFrom: Bruno BARBIER <brubar.cs@gmail.com>\r\nDate: Fri, 18 Nov 2022 20:14:20 +0100\r\nSubject: [PATCH 1\/4] ob-haskell: Add tests for GHCi\r\n\r\ntesting\/lisp\/test-ob-haskell-ghci.el: New file.\r\n---\r\n testing\/lisp\/test-ob-haskell-ghci.el | 428 +++++++++++++++++++++++++++\r\n 1 file changed, 428 insertions(+)\r\n create mode 100644 testing\/lisp\/test-ob-haskell-ghci.el\r\n\r\ndiff --git a\/testing\/lisp\/test-ob-haskell-ghci.el b\/testing\/lisp\/test-ob-haskell-ghci.el\r\nnew file mode 100644\r\nindex 000000000..4b1e4669b\r\n--- \/dev\/null\r\n+++ b\/testing\/lisp\/test-ob-haskell-ghci.el\r\n@@ -0,0 +1,428 @@\r\n+;;; test-ob-haskell-ghci.el --- tests for ob-haskell.el GHCi  -*- lexical-binding: t; -*-\r\n+\r\n+;; Copyright (c) 2023  Free Software Foundation, Inc.\r\n+\r\n+;; Authors: Bruno BARBIER <brubar.cs@gmail.com>\r\n+\r\n+;; This program is free software; you can redistribute it and\/or modify\r\n+;; it under the terms of the GNU General Public License as published by\r\n+;; the Free Software Foundation, either version 3 of the License, or\r\n+;; (at your option) any later version.\r\n+\r\n+;; This program is distributed in the hope that it will be useful,\r\n+;; but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n+;; GNU General Public License for more details.\r\n+\r\n+;; You should have received a copy of the GNU General Public License\r\n+;; along with this program.  If not, see <https:\/\/www.gnu.org\/licenses\/>.\r\n+\r\n+;;; Commentary:\r\n+;;\r\n+\r\n+;;;; Useful references\r\n+;;\r\n+;;  - https:\/\/orgmode.org\/worg\/org-contrib\/babel\/languages\/lang-compat.html\r\n+\r\n+;;;; FIXME: Random failures\r\n+;;\r\n+;; To increase the chances of failure when running tests, you can use this command line:\r\n+;;\r\n+;;    (for I in 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10; do make 'BTEST_OB_LANGUAGES=haskell' BTEST_RE='haskell' test-dirty & done) 2>&1 | grep FAILED\r\n+;;\r\n+\r\n+;;;; Status\r\n+;;\r\n+;; All the tests should succeed (except for random failures); those\r\n+;; flagged with \":expected-result :failed\" are known\r\n+;; limitations\/bugs.  Tested with (2023-03-18):\r\n+;;\r\n+;;     | emacs-version |                      29.0.60 |\r\n+;;     | org-version   | main@4cad6c8ea (Mar 16 2023) |\r\n+;;     | haskell-mode  | master@20d4e23 (Mar 4  2023) |\r\n+;;     | ghci          |                        9.0.2 |\r\n+\r\n+\r\n+;;; Code:\r\n+;;\r\n+\r\n+(require 'org-test \"..\/testing\/org-test\")\r\n+(org-test-for-executable \"ghci\")\r\n+(unless (featurep 'haskell-mode)\r\n+  (signal 'missing-test-dependency \"haskell-mode\"))\r\n+\r\n+\r\n+;;; Helpers\r\n+;;\r\n+\r\n+(defun test-ob-haskell-ghci--with-global-session-worker (todo)\r\n+  \"See `test-ob-haskell-ghci--with-global-session-worker'.\"\r\n+  (when (get-buffer \"*haskell*\")\r\n+    (error \"A buffer named '*haskell*' exists.  Can't safely test haskell blocks\"))\r\n+  (unwind-protect (funcall todo)\r\n+    ;; Kill the \"*haskell*\" buffer to not pollute other tests.\r\n+    (when-let ((hb (get-buffer \"*haskell*\")))\r\n+      (with-current-buffer hb\r\n+        (let ((kill-buffer-query-functions nil)\r\n+              (kill-buffer-hook nil))\r\n+          (kill-buffer hb))))))\r\n+\r\n+(defmacro test-ob-haskell-ghci-with-global-session (&rest body)\r\n+  \"Eval BODY in a new session, then destroy the session.\r\n+The library ob-haskell doesn't implement session yet.  It will\r\n+always use a buffer named \\\"*haskell*\\\".  We kill that buffer\r\n+after the source block execution.  To be safe, we fail if such a\r\n+buffer already exists.\"\r\n+  `(test-ob-haskell-ghci--with-global-session-worker (lambda () ,@body)))\r\n+\r\n+(defun test-ob-haskell-ghci (args content &optional preamble unprotected)\r\n+  \"Execute the code block CONTENT in a new GHCi session; return the result.\r\n+Add ARGS to the code block argument line.  Insert PREAMBLE\r\n+before the code block.  When UNPROTECTED is non-nil, don't control\r\n+which session is used (i.e. don't call\r\n+`test-ob-haskell-ghci--with-global-session-worker').\"\r\n+  (when (listp content)\r\n+    (setq content (string-join content \"\\n\")))\r\n+  (unless preamble\r\n+    (setq preamble \"\"))\r\n+  (let ((todo  (lambda ()\r\n+                 (org-test-with-temp-text\r\n+                     (concat preamble \"\\n\" \"#+begin_src haskell :compile no \"\r\n+                             args \"\\n\" \"<point>\" content \"\\n#+end_src\")\r\n+                   (org-babel-execute-src-block)))))\r\n+  (if unprotected (funcall todo)\r\n+    (test-ob-haskell-ghci-with-global-session (funcall todo)))))\r\n+\r\n+\r\n+;;; Tests\r\n+\r\n+\r\n+;;;; Temporary tests\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/check-version ()\r\n+  \"Check GHCi version.\r\n+Only tested with GHCi 9.0.2.\"\r\n+  (should (equal '(\"linux\" \"ghc\" 9) (test-ob-haskell-ghci \"\" \"\r\n+import System.Info\r\n+import Data.Version\r\n+(os, compilerName, (versionBranch fullCompilerVersion)!!0)\r\n+\"))))\r\n+\r\n+\r\n+;;;; Hello Worlds.\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/hello-world-value-pure ()\r\n+  (should (equal \"Hello World!\"\r\n+                 (test-ob-haskell-ghci \"\" \"\\\"Hello World!\\\"\"))))\r\n+\r\n+(ert-deftest ob-haskell\/hello-world-value-IO ()\r\n+  (should (equal \"Hello World!\"\r\n+                 (test-ob-haskell-ghci \"\" \"return \\\"Hello World!\\\"\"))))\r\n+\r\n+(ert-deftest ob-haskell\/hello-world-output ()\r\n+  (should (equal \"Hello World!\"\r\n+                 (test-ob-haskell-ghci \":results output\" \"putStrLn \\\"Hello World!\\\"\"))))\r\n+\r\n+(ert-deftest ob-haskell\/hello-world-output-nothing ()\r\n+  :expected-result :failed\r\n+  (should (equal \"\"\r\n+                 (test-ob-haskell-ghci \":results output\" \"return \\\"Hello World!\\\"\"))))\r\n+\r\n+(ert-deftest ob-haskell\/hello-world-output-multilines ()\r\n+  :expected-result :failed\r\n+  (should (equal \"Hello World!\"\r\n+                 (test-ob-haskell-ghci \":results output\" \"\r\n+:{\r\n+main :: IO ()\r\n+main = putStrLn \\\"Hello World!\\\"\r\n+:}\r\n+\r\n+main\r\n+\"))))\r\n+\r\n+;;;; Sessions\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/sessions-must-not-share-variables ()\r\n+  \"Sessions must not share variables.\"\r\n+  :expected-result :failed\r\n+  (test-ob-haskell-ghci-with-global-session\r\n+   (test-ob-haskell-ghci \":session s1\" \"x=2\" nil :unprotected)\r\n+   (should (equal 2 (test-ob-haskell-ghci \":session s1\" \"x\" nil :unprotected)))\r\n+   (test-ob-haskell-ghci \":session s2\" \"x=3\" nil :unprotected)\r\n+   (should-not (equal 3 (test-ob-haskell-ghci \":session s1\" \"x\" nil :unprotected)))\r\n+   ))\r\n+\r\n+(ert-deftest ob-haskell\/no-session-means-one-shot-sessions ()\r\n+  \"When no session, use a new session.\"\r\n+  :expected-result :failed\r\n+  (test-ob-haskell-ghci-with-global-session\r\n+   (test-ob-haskell-ghci \"\" \"x=2\" nil :unprotected)\r\n+   (should-not (equal 2 (test-ob-haskell-ghci \"\" \"x\" nil :unprotected)))))\r\n+\r\n+\r\n+;;;; Values\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/value-is-the-last-expression ()\r\n+  \"Return the value of the last expression.\"\r\n+  (should (equal 3 (test-ob-haskell-ghci \"\" '(\"1\" \"1+1\" \"1+1+1\"))))\r\n+  (should (equal 3 (test-ob-haskell-ghci \"\" '(\"x=1\" \"y=1+1\" \"x+y\")))))\r\n+\r\n+(ert-deftest ob-haskell\/value-is-the-last-expression-2 ()\r\n+  \"Return the value of the last expression.\"\r\n+  (should (equal 7 (test-ob-haskell-ghci \"\" \"\r\n+putStrLn \\\"a string\\\"\r\n+return \\\"useless\\\"\r\n+3+4\r\n+\"))))\r\n+\r\n+\r\n+\r\n+(ert-deftest ob-haskell\/eval-numbers ()\r\n+  \"Evaluation of numbers.\"\r\n+  (should (equal 7 (test-ob-haskell-ghci \"\" \"7\")))\r\n+  (should (equal 7.5 (test-ob-haskell-ghci \"\" \"7.5\")))\r\n+  (should (equal 10.0 (test-ob-haskell-ghci \"\" \"10::Double\")))\r\n+  (should (equal 10   (test-ob-haskell-ghci \"\" \"10::Int\"))))\r\n+\r\n+\r\n+(ert-deftest ob-haskell\/eval-strings ()\r\n+  \"Evaluation of strings.\"\r\n+  (should (equal \"a string\" (test-ob-haskell-ghci \"\" \"\\\"a string\\\"\"))))\r\n+\r\n+\r\n+;;;; Local variables\r\n+(ert-deftest ob-haskell\/let-one-line ()\r\n+  \"Local definitions on one line.\"\r\n+  (should (equal 6 (test-ob-haskell-ghci \"\" \"let { x=2; y=3 } in x*y\"))))\r\n+\r\n+(ert-deftest ob-haskell\/let-multilines-1 ()\r\n+  \"Local definitions on multiple lines.\"\r\n+  :expected-result :failed\r\n+  (should (equal 6 (test-ob-haskell-ghci \"\" \"\r\n+:{\r\n+ let { x=2\r\n+     ; y=3\r\n+     }\r\n+ in x*y\r\n+:}\r\n+\"))))\r\n+\r\n+(ert-deftest ob-haskell\/let-multilines-2 ()\r\n+  \"Local definitions on multiple lines, relying on indentation.\"\r\n+  :expected-result :failed\r\n+  (should (equal 6 (test-ob-haskell-ghci \"\" \"\r\n+:{\r\n+  let x=2\r\n+      y=3\r\n+  in x*y\r\n+:}\r\n+\"))))\r\n+\r\n+;;;; Declarations with multiple lines.\r\n+(ert-deftest ob-haskell\/decl-multilines-1 ()\r\n+  \"A multiline declaration, then use it.\"\r\n+  (should (equal 3 (test-ob-haskell-ghci \"\" \"\r\n+:{\r\n+let length' []    = 0\r\n+    length' (_:l) = 1 + length' l\r\n+:}\r\n+length' [1,2,3]\r\n+\"))))\r\n+\r\n+(ert-deftest ob-haskell\/decl-multilines-2 ()\r\n+  \"A multiline declaration, then use it.\"\r\n+  (should (equal 5 (test-ob-haskell-ghci \"\" \"\r\n+:{\r\n+length'       :: [a] -> Int\r\n+length' []    =  0\r\n+length' (_:l) =  1 + length' l\r\n+:}\r\n+\r\n+length' [1..5]\r\n+\"))))\r\n+\r\n+\r\n+(ert-deftest ob-haskell\/primes ()\r\n+  \"From haskell.org.\"\"\"\r\n+  :expected-result :failed\r\n+  (should (equal '(2 3 5 7 11 13 17 19 23 29)\r\n+                 (test-ob-haskell-ghci \"\" \"\r\n+:{\r\n+primes = filterPrime [2..] where\r\n+  filterPrime (p:xs) =\r\n+    p : filterPrime [x | x <- xs, x `mod` p \/= 0]\r\n+:}\r\n+\r\n+take 10 primes\r\n+\"))))\r\n+\r\n+;;;; Lists\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/a-simple-list ()\r\n+  \"Evaluation of list of values.\"\r\n+  (should (equal '(1 2 3) (test-ob-haskell-ghci \"\" \"[1,2,3]\"))))\r\n+\r\n+\r\n+(ert-deftest ob-haskell\/2D-lists ()\r\n+  \"Evaluation of nested lists into a table.\"\r\n+  (should (equal '((1 2 3) (4 5 6))\r\n+                 (test-ob-haskell-ghci \"\" \"[[1..3], [4..6]]\"))))\r\n+\r\n+(ert-deftest ob-haskell\/2D-lists-multilines ()\r\n+  \"Evaluation of nested lists into a table, as multilines.\"\r\n+  :expected-result :failed\r\n+  (should (equal '((1 2 3) (4 5 6))\r\n+                 (test-ob-haskell-ghci \"\" \"\r\n+:{\r\n+[ [1..3]\r\n+, [4..6]\r\n+, [7..9]\r\n+]\r\n+:}\r\n+\"))))\r\n+\r\n+\r\n+;;;; Data tables\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/int-table-data ()\r\n+  \"From worg: int-table-data.\"\r\n+  (should (equal 10 (test-ob-haskell-ghci \":var t=int-table-data\"\r\n+                                          \"sum [sum r | r <- t]\"\r\n+                                          \"#+name: int-table-data\r\n+    | 1 | 2 |\r\n+    | 3 | 4 |\"))))\r\n+\r\n+(ert-deftest ob-haskell\/float-table-data ()\r\n+  \"From worg: float-table-data.\"\r\n+  (should (equal 11.0 (test-ob-haskell-ghci \":var t=float-table-data\"\r\n+                                            \"sum [sum r | r <- t]\"\r\n+                                            \"#+name: float-table-data\r\n+    | 1.1 | 2.2 |\r\n+    | 3.3 | 4.4 |\"))))\r\n+\r\n+(ert-deftest ob-haskell\/string-table-data ()\r\n+  \"From worg: string-table-data.\"\r\n+  (should (equal \"abcd\" (test-ob-haskell-ghci \":var t=string-table-data\"\r\n+                                              \"concat [concat r | r <- t]\"\r\n+                                              \"#+name: string-table-data\r\n+    | a | b |\r\n+    | c | d |\"))))\r\n+\r\n+\r\n+;;;; Not define  errors\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/not-defined ()\r\n+  \"Evaluation of undefined variables.\"\r\n+  (should (string-match \"Variable not in scope\"\r\n+                        (test-ob-haskell-ghci \"\" \"notDefined :: IO Int\"))))\r\n+\r\n+(ert-deftest ob-haskell\/not-defined-then-defined-1 ()\r\n+  \"Evaluation of undefined variables.\r\n+This is a valid haskell source, but, invalid when entered one\r\n+line at a time in GHCi.\"\r\n+  (let ((r (test-ob-haskell-ghci \"\" \"\r\n+v :: Int\r\n+v = 4\r\n+\")))\r\n+    (should (and r (string-match \"Variable not in scope\" r)))))\r\n+\r\n+(ert-deftest ob-haskell\/not-defined-then-defined-1-fixed ()\r\n+  \"Like not-defined-then-defined-1, but using the mutiline marks.\"\r\n+  :expected-result :failed\r\n+  (let ((r (test-ob-haskell-ghci \"\" \"\r\n+:{\r\n+  v :: Int\r\n+  v = 4\r\n+:}\r\n+\")))\r\n+    (should (eq nil r))))\r\n+\r\n+(ert-deftest ob-haskell\/not-defined-then-defined-1-fixed-2 ()\r\n+  \"Like not-defined-then-defined-1, but using one line.\"\r\n+  (should (eq nil (test-ob-haskell-ghci \"\" \"v = 4 :: Int\"))))\r\n+\r\n+\r\n+\r\n+(ert-deftest ob-haskell\/not-defined-then-defined-2 ()\r\n+  \"Evaluation of undefined variables, followed by a correct one.\"\r\n+  ;; ghci output is:\r\n+  ;;  | <interactive>:2:1-4: error:\r\n+  ;;  |     \u2022 Variable not in scope: main :: IO ()\r\n+  ;;  |     \u2022 Perhaps you meant \u2018min\u2019 (imported from Prelude)\r\n+  ;;  | Hello, World!\r\n+  ;; and ob-haskell just reports the last line \"Hello, World!\".\r\n+  (should (string-match \"Variable not in scope\"\r\n+                        (test-ob-haskell-ghci \":results output\" \"\r\n+main :: IO ()\r\n+main = putStrLn \\\"Hello, World!\\\"\r\n+main\r\n+\"))))\r\n+\r\n+;;;; Imports\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/import ()\r\n+  \"Import and use library.\"\r\n+  (should (equal 65 (test-ob-haskell-ghci \"\" \"\r\n+import Data.IORef\r\n+r <- newIORef 65\r\n+readIORef r\r\n+\"))))\r\n+\r\n+(ert-deftest ob-haskell\/import-with-vars ()\r\n+  \"Import and use library with vars.\"\r\n+  (should (equal 65 (test-ob-haskell-ghci \":var x=65\" \"\r\n+import Data.IORef\r\n+r <- newIORef x\r\n+readIORef r\r\n+\"))))\r\n+\r\n+;;;; What is the result?\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/results-value-1 ()\r\n+  \"Don't confuse output and values: nothing.\"\r\n+  (should (equal nil (test-ob-haskell-ghci \":results value\" \"return ()\"))))\r\n+\r\n+(ert-deftest ob-haskell\/results-value-2 ()\r\n+  \"Don't confuse output and values: a list.\"\r\n+  (should (equal '(1 2) (test-ob-haskell-ghci \":results value\" \"return [1,2]\"))))\r\n+\r\n+(ert-deftest ob-haskell\/results-value-3 ()\r\n+  \"Don't confuse output and values: nothing.\"\r\n+  :expected-result :failed\r\n+  (should (equal nil (test-ob-haskell-ghci \":results value\" \"putStrLn \\\"3\\\"\"))))\r\n+\r\n+(ert-deftest ob-haskell\/results-value-4 ()\r\n+  \"Don't confuse output and values: nothing.\"\r\n+  :expected-result :failed\r\n+  (should (equal nil (test-ob-haskell-ghci \":results value\" \"\r\n+putStrLn \\\"3\\\"\r\n+return ()\r\n+\"))))\r\n+\r\n+\r\n+;;;; GHCi commands\r\n+;;\r\n+\r\n+(ert-deftest ob-haskell\/ghci-type ()\r\n+  \"The ghci meta command ':type'.\"\r\n+  (should (equal \"3 :: Num p => p\"\r\n+                 (test-ob-haskell-ghci \":results output\" \":type 3\"))))\r\n+\r\n+(ert-deftest ob-haskell\/ghci-info ()\r\n+  \"The ghci meta command ':info' .\"\r\n+  (should (equal \"repeat :: a -> [a]    -- Defined in \u2018GHC.List\u2019\"\r\n+                 (test-ob-haskell-ghci \":results output\" \":info repeat\"))))\r\n+\r\n+\r\n+(provide 'test-ob-haskell-ghci)\r\n+\r\n+;;; test-ob-haskell-ghci.el ends here\r\n-- \r\n2.39.1\r\n\r\n","subject":"Re: [PATCH] Add tests for ob-haskell (GHCi)"},{"date":"2023-03-23T14:34:53.867Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87v8irlenu.fsf@localhost","message-id":"87v8irlenu.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","references":["C547E741-E8E2-4E48-8B71-B8B83C1E9E21@gmail.com"],"related-refs":["87v8irlenu.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87v8irlenu.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 180e322c2c79ea88d87f908299a5c0e69c47a7b2 Mon Sep 17 00:00:00 2001\r\nMessage-Id: <180e322c2c79ea88d87f908299a5c0e69c47a7b2.1679581960.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Thu, 23 Mar 2023 15:31:33 +0100\r\nSubject: [PATCH] lisp\/org.el: Allow limiting inline image width\r\n\r\n* lisp\/org.el (org-image-max-width): New custom variable controlling\r\nmax inline image width.\r\n(org--create-inline-image): Use the new variable.\r\n* doc\/org-manual.org (Images):\r\n* etc\/ORG-NEWS (New customization ~org-image-max-width~ limiting the\r\ndisplayed inline image width): Document the new variable.\r\n---\r\n doc\/org-manual.org | 20 +++++++++++++++++---\r\n etc\/ORG-NEWS       | 15 +++++++++++++++\r\n lisp\/org.el        | 29 ++++++++++++++++++++++++++++-\r\n 3 files changed, 60 insertions(+), 4 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 37fd3df14..3d729bdf6 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -11495,14 +11495,19 @@ ** Images\r\n \r\n \r\n   #+vindex: org-image-actual-width\r\n+  #+vindex: org-image-max-width\r\n   #+cindex: @samp{ORG-IMAGE-ACTUAL-WIDTH}, property\r\n   By default, Org mode displays inline images according to their\r\n-  actual width.  You can customize the displayed image width using\r\n+  actual width, but no wider than ~fill-column~ characters.\r\n+\r\n+  You can customize the displayed image width using\r\n   ~org-image-actual-width~ variable (globally) or\r\n   =ORG-IMAGE-ACTUAL-WIDTH= property (subtree-level)[fn:: The width can\r\n   be customized in Emacs >= 24.1, built with imagemagick support.].\r\n   Their value can be the following:\r\n   - (default) Non-nil, use the actual width of images when inlining them.\r\n+    It the actual width is too wide, limit it according to\r\n+    ~org-image-max-width~.\r\n   - When set to a number, use imagemagick (when available) to set the\r\n     image's width to this value.\r\n   - When set to a number in a list, try to get the width from any\r\n@@ -11512,8 +11517,17 @@ ** Images\r\n     #+end_example\r\n     and fall back on that number if none is found.\r\n   - When set to nil, try to get the width from an =#+ATTR.*= keyword\r\n-    and fall back on the original width if none is found.\r\n-\r\n+    and fall back on the original width or ~org-image-max-width~ if\r\n+    none is found.\r\n+\r\n+  ~org-image-max-width~ limits the maximum displayed image width, but\r\n+  only when the image width is not set explicitly.  Possible maximum\r\n+  width can be set to:\r\n+  - (default) ~fill-column~, limit width to ~fill-column~ number of\r\n+    characters.\r\n+  - ~window~, limit width to current window width.\r\n+  - integer number, limit width that specified number of pixels.\r\n+  - nil, do not limit the width.\r\n \r\n #+vindex: org-cycle-inline-images-display\r\n Inline images can also be displayed when cycling the folding state.\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 4d45e6507..2611cc570 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -24,6 +24,21 @@ consider [[https:\/\/gitlab.com\/jackkamm\/ob-python-mode-mode][ob-python-mode-mode]\r\n has been ported to.\r\n \r\n ** New and changed options\r\n+*** New customization ~org-image-max-width~ limiting the displayed inline image width\r\n+\r\n+New custom variable ~org-image-max-width~ limits the maximum inline\r\n+image width, but only when the inline image width is not explicitly\r\n+set via ~org-image-actual-width~, =ORG-IMAGE-ACTUAL-WIDTH= property,\r\n+or =#+ATTR*= keyword.\r\n+\r\n+By default, when ~org-image-actual-width~ is set to t,\r\n+~org-image-max-width~ takes effect.  Its default value is set to\r\n+~fill-column~, limiting the image previews to ~fill-column~ number of\r\n+characters.\r\n+\r\n+To fall back to previous defaults, where the inline image width is not\r\n+constrained, set ~org-image-max-width~ to nil.\r\n+\r\n *** New ~org-cite-natbib-export-bibliography~ option defining fallback bibliography style\r\n \r\n ~natbib~ citation export processor now uses\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex 20e6ea6d9..43d659536 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -15096,6 +15096,24 @@ (defcustom org-image-actual-width t\r\n \t  (list :tag \"Use #+ATTR* or a number of pixels\" (integer))\r\n \t  (const :tag \"Use #+ATTR* or don't resize\" nil)))\r\n \r\n+(defcustom org-image-max-width 'fill-column\r\n+  \"When non-nil, limit the displayed image width.\r\n+This setting only takes effect when `org-image-actual-width' is set to\r\n+t or when #+ATTR* is set to t.\r\n+\r\n+Possible values:\r\n+- `fill-column' :: limit width to `fill-column'\r\n+- `window'      :: limit width to window width\r\n+- number        :: limit width to number in pixels\r\n+- nil             :: do not limit image width\"\r\n+  :group 'org-appearance\r\n+  :package-version '(Org . \"9.7\")\r\n+  :type '(choice\r\n+          (const :tag \"Do not limit image width\" nil)\r\n+          (const :tag \"Limit to `fill-column'\" fill-column)\r\n+          (const :tag \"Limit to window width\" window)\r\n+          (integer :tag \"Limit to a number of pixels\")))\r\n+\r\n (defcustom org-agenda-inhibit-startup nil\r\n   \"Inhibit startup when preparing agenda buffers.\r\n When this variable is t, the initialization of the Org agenda\r\n@@ -16229,7 +16247,16 @@ (defun org--create-inline-image (file width)\r\n \t\t\t width\r\n \t\t\t 'imagemagick)\r\n \t\t    remote?\r\n-\t\t    :width width :scale 1))))\r\n+\t\t    :width width\r\n+                    :max-width\r\n+                    (pcase org-image-max-width\r\n+                      (`fill-column (pixel-fill-width fill-column))\r\n+                      (`window (window-width nil t))\r\n+                      ((pred integerp) org-image-max-width)\r\n+                      (`nil nil)\r\n+                      (_ (error \"Unsupported value of `org-image-max-width': %S\"\r\n+                                org-image-max-width)))\r\n+                    :scale 1))))\r\n \r\n (defun org-display-inline-images (&optional include-linked refresh beg end)\r\n   \"Display inline images.\r\n-- \r\n2.39.1\r\n\r\n","subject":"[RFC] Limit inline image width by default (was: feature request: easy embedding of images)"},{"date":"2023-03-23T00:48:47.582Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/875yaso53d.fsf@gmail.com","message-id":"875yaso53d.fsf@gmail.com","config":false,"refs-count":2,"username":"Nathaniel Nicandro","references":["87h6udnfga.fsf@localhost","87a606njvc.fsf@gmail.com"],"related-refs":["87a606njvc.fsf@gmail.com","875yaso53d.fsf@gmail.com"],"from":"nathanielnicandro@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/875yaso53d.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 1cc887d1378839c3322c93ebb5a524499b8d3073 Mon Sep 17 00:00:00 2001\r\nFrom: Nathaniel Nicandro <nathanielnicandro@gmail.com>\r\nDate: Wed, 22 Mar 2023 14:54:57 -0500\r\nSubject: [PATCH] lisp\/org-clock.el: Add support for logind\r\n\r\n* lisp\/org-timer.el (org-logind-dbus-session-path): New variable.\r\n(org-logind-user-idle-seconds): New function.\r\n(org-user-idle-seconds): Use them.\r\n\r\n---\r\n etc\/ORG-NEWS      |  7 +++++++\r\n lisp\/org-clock.el | 30 ++++++++++++++++++++++++++++++\r\n 2 files changed, 37 insertions(+)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex 87ecd77..ef3a2ab 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -87,6 +87,13 @@ a date range in the agenda.  It inherits from the default face in\r\n order to remain backward-compatible.\r\n \r\n ** New features\r\n+*** Add support for ~logind~ idle time in ~org-user-idle-seconds~\r\n+\r\n+When Emacs is built with =dbus= support and\r\n+the =org.freedesktop.login1= interface is available, fallback to\r\n+checking the =IdleSinceHint= property when\r\n+determining =org-user-idle-seconds= as the penultimate step.\r\n+\r\n *** ~org-metaup~ and ~org-metadown~ now act on headings in region\r\n \r\n When region is active and starts at a heading, ~org-metaup~ and\r\ndiff --git a\/lisp\/org-clock.el b\/lisp\/org-clock.el\r\nindex f869b0b..323efa4 100644\r\n--- a\/lisp\/org-clock.el\r\n+++ b\/lisp\/org-clock.el\r\n@@ -51,6 +51,9 @@ (declare-function org-table-goto-line \"org-table\" (n))\r\n (declare-function org-dynamic-block-define \"org\" (type func))\r\n (declare-function w32-notification-notify \"w32fns.c\" (&rest params))\r\n (declare-function w32-notification-close \"w32fns.c\" (&rest params))\r\n+(declare-function dbus-list-activatable-names \"dbus\" (&optional bus))\r\n+(declare-function dbus-call-method \"dbus\" (bus service path interface method &rest args))\r\n+(declare-function dbus-get-property \"dbus\" (bus service path interface property))\r\n \r\n (defvar org-frame-title-format-backup nil)\r\n (defvar org-state)\r\n@@ -1214,6 +1217,26 @@ (defun org-x11-idle-seconds ()\r\n   \"Return the current X11 idle time in seconds.\"\r\n   (\/ (string-to-number (shell-command-to-string org-clock-x11idle-program-name)) 1000))\r\n \r\n+(defvar org-logind-dbus-session-path\r\n+  (when (and (boundp 'dbus-runtime-version)\r\n+             (require 'dbus nil t)\r\n+             (member \"org.freedesktop.login1\" (dbus-list-activatable-names)))\r\n+    (dbus-call-method\r\n+     :system \"org.freedesktop.login1\"\r\n+     \"\/org\/freedesktop\/login1\"\r\n+     \"org.freedesktop.login1.Manager\"\r\n+     \"GetSessionByPID\" (emacs-pid)))\r\n+  \"D-Bus session path for the elogind interface.\")\r\n+\r\n+(defun org-logind-user-idle-seconds ()\r\n+  \"Return the number of idle seconds for the user according to logind.\"\r\n+  (- (float-time)\r\n+     (\/ (dbus-get-property\r\n+         :system \"org.freedesktop.login1\"\r\n+         org-logind-dbus-session-path\r\n+         \"org.freedesktop.login1.Session\" \"IdleSinceHint\")\r\n+        1e6)))\r\n+\r\n (defun org-user-idle-seconds ()\r\n   \"Return the number of seconds the user has been idle for.\r\n This routine returns a floating point number.\"\r\n@@ -1222,6 +1245,13 @@ (defun org-user-idle-seconds ()\r\n     (org-mac-idle-seconds))\r\n    ((and (eq window-system 'x) org-x11idle-exists-p)\r\n     (org-x11-idle-seconds))\r\n+   ((and\r\n+     org-logind-dbus-session-path\r\n+     (dbus-get-property\r\n+      :system \"org.freedesktop.login1\"\r\n+      org-logind-dbus-session-path\r\n+      \"org.freedesktop.login1.Session\" \"IdleHint\"))\r\n+    (org-logind-user-idle-seconds))\r\n    (t\r\n     (org-emacs-idle-seconds))))\r\n \r\n-- \r\n2.39.1\r\n\r\n","subject":"Re: [PATCH] org-user-idle-seconds: Add support for logind"},{"date":"2023-03-13T14:15:17.307Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/877cvkhh9d.fsf@kraus.my","message-id":"877cvkhh9d.fsf@kraus.my","config":false,"refs-count":12,"username":"Daniel Kraus","references":["87pm9gyebl.fsf@localhost","87mt4m53qj.fsf@kraus.my"],"related-refs":["877cvkhh9d.fsf@kraus.my","87ttymfe9i.fsf@kraus.my","87y1nzflur.fsf@kraus.my","87mt4m53qj.fsf@kraus.my","873567h2kk.fsf@kraus.my"],"from":"daniel@kraus.my","patch-url":"https:\/\/tracker.orgmode.org\/patch\/877cvkhh9d.fsf@kraus.my","source-id":"emacs-orgmode@gnu.org","patch-body":"From 3ad98fa88f6ebd4ae1b2b41d66cca9e9d6e1875e Mon Sep 17 00:00:00 2001\r\nFrom: Daniel Kraus <daniel@kraus.my>\r\nDate: Thu, 9 Mar 2023 16:11:27 +0100\r\nSubject: [PATCH] ob-clojure.el: Fix results output, support clojure-cli\r\n\r\n* lisp\/ob-clojure.el (org-babel-clojure-backend): Add support for\r\nclojure-cli.\r\n* lisp\/ob-clojure.el (org-babel-clojurescript-backend): Move nbb to\r\nclojurescript.\r\n* lisp\/ob-clojure.el (org-babel-expand-body:clojure)\r\n* lisp\/ob-clojure.el (ob-clojure-eval-with-cider): Return only the\r\nlast expression when :results is not set or value, and return only\r\nstdout when :results is set to output.\r\n* lisp\/ob-clojure.el (ob-clojure-eval-with-cmd): Rename function as\r\nit is not only for babashka.\r\n* lisp\/ob-clojure.el (org-babel-execute:clojure): Differentiate\r\nbetween Clojure and ClojureScript source blocks.\r\n\r\nThe problem was that the ob-clojure results where not correctly\r\ntaking the results parameter into account.\r\nE.g. with the cider backend, you would get all printed or returned\r\nvalues for each line in your block:\r\n\r\n(def small-map {:a 2 :b 4 :c 8})\r\n{:some :map}\r\n(prn :xx)\r\n(:b small-map)\r\n\r\n| #'user\/small-map |\r\n| {:some :map}     |\r\n| 4                |\r\n\r\nor for babashka you would only get the printed values but not the\r\nlast return value:\r\n(def small-map {:a 2 :b 4 :c 8})\r\n{:some :map}\r\n(prn :xx)\r\n(:b small-map)\r\n\r\n: :xx\r\n\r\nNow when you specify :results value, the result is only the last\r\nreturned value, and with :results output you get all values\r\nprinted to stdout.\r\nSo the examples above would all result in the same:\r\n(def small-map {:a 2 :b 4 :c 8})\r\n{:some :map}\r\n(prn :xx)\r\n(:b small-map)\r\n\r\n: 4\r\n---\r\n etc\/ORG-NEWS       |   9 +++\r\n lisp\/ob-clojure.el | 150 ++++++++++++++++++++++++++++-----------------\r\n 2 files changed, 104 insertions(+), 55 deletions(-)\r\n\r\ndiff --git a\/etc\/ORG-NEWS b\/etc\/ORG-NEWS\r\nindex b9d7b3459..3319de0a1 100644\r\n--- a\/etc\/ORG-NEWS\r\n+++ b\/etc\/ORG-NEWS\r\n@@ -96,6 +96,15 @@ The face ~org-agenda-calendar-daterange~ is used to show entries with\r\n a date range in the agenda.  It inherits from the default face in\r\n order to remain backward-compatible.\r\n \r\n+*** New ~org-babel-clojurescript-backend~ option to choose ClojureScript backend\r\n+\r\n+Before, a ClojureScript source block used the same backend as Clojure,\r\n+configured in ~org-babel-clojure-backend~ and relied on an undocumented\r\n+~:target~ paramter.\r\n+\r\n+Now, there's ~org-babel-clojurescript-backend~ to determine the\r\n+backend used for evaluation of ClojureScript.\r\n+\r\n ** New features\r\n *** ~org-metaup~ and ~org-metadown~ now act on headings in region\r\n \r\ndiff --git a\/lisp\/ob-clojure.el b\/lisp\/ob-clojure.el\r\nindex 5f589db00..8ae1395d2 100644\r\n--- a\/lisp\/ob-clojure.el\r\n+++ b\/lisp\/ob-clojure.el\r\n@@ -25,20 +25,21 @@\r\n \r\n ;;; Commentary:\r\n \r\n-;; Support for evaluating Clojure code\r\n+;; Support for evaluating Clojure \/ ClojureScript code.\r\n \r\n ;; Requirements:\r\n \r\n ;; - Clojure (at least 1.2.0)\r\n ;; - clojure-mode\r\n-;; - inf-clojure, Cider, SLIME, babashka or nbb\r\n+;; - babashka, nbb, Clojure CLI tools, Cider, inf-clojure or SLIME\r\n \r\n ;; For clojure-mode, see https:\/\/github.com\/clojure-emacs\/clojure-mode\r\n-;; For inf-clojure, see https:\/\/github.com\/clojure-emacs\/inf-clojure\r\n-;; For Cider, see https:\/\/github.com\/clojure-emacs\/cider\r\n-;; For SLIME, see https:\/\/slime.common-lisp.dev\r\n ;; For babashka, see https:\/\/github.com\/babashka\/babashka\r\n ;; For nbb, see https:\/\/github.com\/babashka\/nbb\r\n+;; For Clojure CLI tools, see https:\/\/clojure.org\/guides\/deps_and_cli\r\n+;; For Cider, see https:\/\/github.com\/clojure-emacs\/cider\r\n+;; For inf-clojure, see https:\/\/github.com\/clojure-emacs\/inf-clojure\r\n+;; For SLIME, see https:\/\/slime.common-lisp.dev\r\n \r\n ;; For SLIME, the best way to install its components is by following\r\n ;; the directions as set out by Phil Hagelberg (Technomancy) on the\r\n@@ -78,20 +79,33 @@ defvar org-babel-header-args:clojurescript\r\n \r\n (defcustom org-babel-clojure-backend (cond\r\n                                       ((executable-find \"bb\") 'babashka)\r\n-                                      ((executable-find \"nbb\") 'nbb)\r\n+                                      ((executable-find \"clojure\") 'clojure-cli)\r\n                                       ((featurep 'cider) 'cider)\r\n                                       ((featurep 'inf-clojure) 'inf-clojure)\r\n                                       ((featurep 'slime) 'slime)\r\n \t\t\t\t      (t nil))\r\n   \"Backend used to evaluate Clojure code blocks.\"\r\n   :group 'org-babel\r\n-  :package-version '(Org . \"9.6\")\r\n+  :package-version '(Org . \"9.7\")\r\n   :type '(choice\r\n-\t  (const :tag \"inf-clojure\" inf-clojure)\r\n+\t  (const :tag \"babashka\" babashka)\r\n+          (const :tag \"clojure-cli\" clojure-cli)\r\n \t  (const :tag \"cider\" cider)\r\n+\t  (const :tag \"inf-clojure\" inf-clojure)\r\n \t  (const :tag \"slime\" slime)\r\n-\t  (const :tag \"babashka\" babashka)\r\n+\t  (const :tag \"Not configured yet\" nil)))\r\n+\r\n+(defcustom org-babel-clojurescript-backend\r\n+  (cond\r\n+   ((or (executable-find \"nbb\") (executable-find \"npx\")) 'nbb)\r\n+   ((featurep 'cider) 'cider)\r\n+   (t nil))\r\n+  \"Backend used to evaluate Clojure code blocks.\"\r\n+  :group 'org-babel\r\n+  :package-version '(Org . \"9.7\")\r\n+  :type '(choice\r\n \t  (const :tag \"nbb\" nbb)\r\n+\t  (const :tag \"cider\" cider)\r\n \t  (const :tag \"Not configured yet\" nil)))\r\n \r\n (defcustom org-babel-clojure-default-ns \"user\"\r\n@@ -105,14 +119,24 @@ defcustom ob-clojure-babashka-command\r\n   :group 'org-babel\r\n   :package-version '(Org . \"9.6\"))\r\n \r\n-(defcustom ob-clojure-nbb-command (executable-find \"nbb\")\r\n+(defcustom ob-clojure-nbb-command (or (executable-find \"nbb\")\r\n+                                      (when-let (npx (executable-find \"npx\"))\r\n+                                        (concat npx \" nbb\")))\r\n   \"Path to the nbb executable.\"\r\n-  :type '(choice file (const nil))\r\n+  :type '(choice string (const nil))\r\n   :group 'org-babel\r\n-  :package-version '(Org . \"9.6\"))\r\n+  :package-version '(Org . \"9.7\"))\r\n \r\n-(defun org-babel-expand-body:clojure (body params)\r\n-  \"Expand BODY according to PARAMS, return the expanded body.\"\r\n+(defcustom ob-clojure-cli-command (when-let (cmd (executable-find \"clojure\"))\r\n+                                    (concat cmd \" -M\"))\r\n+  \"Clojure CLI command used to execute source blocks.\"\r\n+  :type 'string\r\n+  :group 'org-babel\r\n+  :package-version '(Org . \"9.7\"))\r\n+\r\n+(defun org-babel-expand-body:clojure (body params &optional cljs-p)\r\n+  \"Expand BODY according to PARAMS, return the expanded body.\r\n+When CLJS-P is non-nil, expand in a cljs context instead of clj.\"\r\n   (let* ((vars (org-babel--get-vars params))\r\n          (backend-override (cdr (assq :backend params)))\r\n          (org-babel-clojure-backend\r\n@@ -146,10 +170,26 @@ defun org-babel-expand-body:clojure\r\n \t\t\t    vars\r\n \t\t\t    \"\\n      \")\r\n \t\t\t   body))))))\r\n-    (if (or (member \"code\" result-params)\r\n-\t    (member \"pp\" result-params))\r\n-\t(format \"(clojure.pprint\/pprint (do %s))\" body)\r\n-      body)))\r\n+    ;; If the result param is set to \"output\" we don't have to do\r\n+    ;; anything special and just let the backend handle everything\r\n+    (if (member \"output\" result-params)\r\n+        body\r\n+\r\n+      ;; If the result is not \"output\" (i.e. it's \"value\"), disable\r\n+      ;; stdout output and print the last returned value.  Use pprint\r\n+      ;; instead of prn when results param is \"pp\" or \"code\".\r\n+      (concat\r\n+       (if (or (member \"code\" result-params)\r\n+\t       (member \"pp\" result-params))\r\n+           (concat (if cljs-p\r\n+                       \"(require '[cljs.pprint :refer [pprint]])\"\r\n+                     \"(require '[clojure.pprint :refer [pprint]])\")\r\n+                   \" (pprint \")\r\n+         \"(prn \")\r\n+       (if cljs-p\r\n+           \"(binding [cljs.core\/*print-fn* (constantly nil)]\"\r\n+         \"(binding [*out* (java.io.StringWriter.)]\")\r\n+       body \"))\"))))\r\n \r\n (defvar ob-clojure-inf-clojure-filter-out)\r\n (defvar ob-clojure-inf-clojure-tmp-output)\r\n@@ -225,32 +265,19 @@ defun ob-clojure-eval-with-inf-clojure\r\n \t\ts))\r\n \t    (reverse ob-clojure-inf-clojure-tmp-output)))))\r\n \r\n-(defun ob-clojure-eval-with-cider (expanded params)\r\n-  \"Evaluate EXPANDED code block with PARAMS using cider.\"\r\n+(defun ob-clojure-eval-with-cider (expanded params &optional cljs-p)\r\n+  \"Evaluate EXPANDED code block with PARAMS using cider.\r\n+When CLJS-P is non-nil, use a cljs connection instead of clj.\"\r\n   (org-require-package 'cider \"Cider\")\r\n-  (let ((connection (cider-current-connection (cdr (assq :target params))))\r\n-\t(result-params (cdr (assq :result-params params)))\r\n-\tresult0)\r\n+  (let ((connection (cider-current-connection (if cljs-p \"cljs\" \"clj\"))))\r\n     (unless connection (sesman-start-session 'CIDER))\r\n     (if (not connection)\r\n \t;; Display in the result instead of using `user-error'\r\n-\t(setq result0 \"Please reevaluate when nREPL is connected\")\r\n-      (ob-clojure-with-temp-expanded expanded params\r\n-\t(let ((response (nrepl-sync-request:eval exp connection)))\r\n-\t  (push (or (nrepl-dict-get response \"root-ex\")\r\n-\t\t    (nrepl-dict-get response \"ex\")\r\n-\t\t    (nrepl-dict-get\r\n-\t\t     response (if (or (member \"output\" result-params)\r\n-\t\t\t\t      (member \"pp\" result-params))\r\n-\t\t\t\t  \"out\"\r\n-\t\t\t\t\"value\")))\r\n-\t\tresult0)))\r\n-      (ob-clojure-string-or-list\r\n-       ;; Filter out s-expressions that return nil (string \"nil\"\r\n-       ;; from nrepl eval) or comment forms (actual nil from nrepl)\r\n-       (reverse (delete \"\" (mapcar (lambda (r)\r\n-\t\t\t\t     (replace-regexp-in-string \"nil\" \"\" (or r \"\")))\r\n-\t\t\t\t   result0)))))))\r\n+        \"Please reevaluate when nREPL is connected\"\r\n+      (let ((response (nrepl-sync-request:eval expanded connection)))\r\n+        (or (nrepl-dict-get response \"root-ex\")\r\n+\t    (nrepl-dict-get response \"ex\")\r\n+\t    (nrepl-dict-get response \"out\"))))))\r\n \r\n (defun ob-clojure-eval-with-slime (expanded params)\r\n   \"Evaluate EXPANDED code block with PARAMS using slime.\"\r\n@@ -262,39 +289,52 @@ defun ob-clojure-eval-with-slime\r\n        ,(buffer-substring-no-properties (point-min) (point-max)))\r\n      (cdr (assq :package params)))))\r\n \r\n-(defun ob-clojure-eval-with-babashka (bb expanded)\r\n-  \"Evaluate EXPANDED code block using BB (babashka or nbb).\"\r\n-  (let ((script-file (org-babel-temp-file \"clojure-bb-script-\" \".clj\")))\r\n+(defun ob-clojure-eval-with-cmd (cmd expanded)\r\n+  \"Evaluate EXPANDED code block using CMD (babashka, clojure or nbb).\"\r\n+  (let ((script-file (org-babel-temp-file \"clojure-cmd-script-\" \".clj\")))\r\n     (with-temp-file script-file\r\n       (insert expanded))\r\n     (org-babel-eval\r\n-     (format \"%s %s\" bb (org-babel-process-file-name script-file))\r\n+     (format \"%s %s\" cmd (org-babel-process-file-name script-file))\r\n      \"\")))\r\n \r\n-(defun org-babel-execute:clojure (body params)\r\n-  \"Execute the BODY block of Clojure code with PARAMS using Babel.\"\r\n+(define-obsolete-function-alias 'ob-clojure-eval-with-babashka\r\n+  #'ob-clojure-eval-with-cmd \"9.7\")\r\n+\r\n+(defun org-babel-execute:clojure (body params &optional cljs-p)\r\n+  \"Execute the BODY block of Clojure code with PARAMS using Babel.\r\n+When CLJS-P is non-nil, execute with a ClojureScript backend\r\n+instead of Clojure.\"\r\n   (let* ((backend-override (cdr (assq :backend params)))\r\n          (org-babel-clojure-backend\r\n           (cond\r\n            (backend-override (intern backend-override))\r\n-           (org-babel-clojure-backend org-babel-clojure-backend)\r\n-           (t (user-error \"You need to customize `org-babel-clojure-backend'\r\n-or set the `:backend' header argument\")))))\r\n-    (let* ((expanded (org-babel-expand-body:clojure body params))\r\n+           (org-babel-clojure-backend (if cljs-p\r\n+                                          org-babel-clojurescript-backend\r\n+                                        org-babel-clojure-backend))\r\n+           (t (user-error \"You need to customize `%S'\r\n+or set the `:backend' header argument\"\r\n+                          (if cljs-p\r\n+                              org-babel-clojurescript-backend\r\n+                            org-babel-clojure-backend))))))\r\n+    (let* ((expanded (org-babel-expand-body:clojure body params cljs-p))\r\n \t   (result-params (cdr (assq :result-params params)))\r\n \t   result)\r\n       (setq result\r\n \t    (cond\r\n \t     ((eq org-babel-clojure-backend 'inf-clojure)\r\n \t      (ob-clojure-eval-with-inf-clojure expanded params))\r\n+             ((eq org-babel-clojure-backend 'clojure-cli)\r\n+              (ob-clojure-eval-with-cmd ob-clojure-cli-command expanded))\r\n              ((eq org-babel-clojure-backend 'babashka)\r\n-\t      (ob-clojure-eval-with-babashka ob-clojure-babashka-command expanded))\r\n+\t      (ob-clojure-eval-with-cmd ob-clojure-babashka-command expanded))\r\n              ((eq org-babel-clojure-backend 'nbb)\r\n-\t      (ob-clojure-eval-with-babashka ob-clojure-nbb-command expanded))\r\n+\t      (ob-clojure-eval-with-cmd ob-clojure-nbb-command expanded))\r\n \t     ((eq org-babel-clojure-backend 'cider)\r\n-\t      (ob-clojure-eval-with-cider expanded params))\r\n+\t      (ob-clojure-eval-with-cider expanded params cljs-p))\r\n \t     ((eq org-babel-clojure-backend 'slime)\r\n-\t      (ob-clojure-eval-with-slime expanded params))))\r\n+\t      (ob-clojure-eval-with-slime expanded params))\r\n+             (t (user-error \"Invalid backend\"))))\r\n       (org-babel-result-cond result-params\r\n         result\r\n         (condition-case nil (org-babel-script-escape result)\r\n@@ -302,7 +342,7 @@ defun org-babel-execute:clojure\r\n \r\n (defun org-babel-execute:clojurescript (body params)\r\n   \"Evaluate BODY with PARAMS as ClojureScript code.\"\r\n-  (org-babel-execute:clojure body (cons '(:target . \"cljs\") params)))\r\n+  (org-babel-execute:clojure body params t))\r\n \r\n (provide 'ob-clojure)\r\n \r\n-- \r\n2.39.2\r\n\r\n","subject":"Re: [patch] ob-clojure: Fix results output"},{"date":"2023-03-09T12:48:03.074Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/55a16edf3c8e04e9f1f7be7ab281ddacac81d9c1.camel@timruffing.de","message-id":"55a16edf3c8e04e9f1f7be7ab281ddacac81d9c1.camel@timruffing.de","config":false,"refs-count":6,"username":"Tim Ruffing","related-refs":["55a16edf3c8e04e9f1f7be7ab281ddacac81d9c1.camel@timruffing.de"],"from":"crypto@timruffing.de","source-id":"emacs-orgmode@gnu.org","subject":"[PATCH] Don't reset `org-todo-keywords-for-agenda' when org-agenda-multi"},{"date":"2023-03-05T09:52:54.624Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ttyzcyrp.fsf@gmail.com","message-id":"87ttyzcyrp.fsf@gmail.com","config":false,"refs-count":5,"username":"Jeremie Juste","related-refs":["87ttyzcyrp.fsf@gmail.com"],"from":"jeremiejuste@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] ob-awk.el specifying a delimeter argument in for output"},{"date":"2023-03-03T10:09:56.203Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/5BB5EF8E-6D40-4055-99AE-BF596E5E8C98@gmail.com","message-id":"5BB5EF8E-6D40-4055-99AE-BF596E5E8C98@gmail.com","config":false,"refs-count":22,"username":"Andrea Lazzarini","related-refs":["87zg8jwp26.fsf@localhost","5BB5EF8E-6D40-4055-99AE-BF596E5E8C98@gmail.com","87lejith3r.fsf@localhost"],"from":"andrea.lazzarini1@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] No space after footnote with org-export-with-footnotes set to nil [9.6.1 ( @ \/Users\/test\/.emacs.d\/elpa\/28.0\/develop\/org-9.6.1\/)]"},{"date":"2023-02-28T10:35:29.609Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ilfmxen5.fsf@localhost","message-id":"87ilfmxen5.fsf@localhost","config":false,"refs-count":13,"username":"Ihor Radchenko","references":["87h6v9gpno.fsf@pm.me"],"related-refs":["87ilfmxen5.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow to #+include files verbatim without any processing (was: Have export treat file: paths in INCLUDED file relative to the INCLUDING file's dir)"},{"date":"2023-02-26T14:27:02.676Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/2e6698b2d0c649a01673efdd14964ab4@posteo.net","message-id":"2e6698b2d0c649a01673efdd14964ab4@posteo.net","config":false,"refs-count":3,"username":"","related-refs":["2e6698b2d0c649a01673efdd14964ab4@posteo.net"],"from":"rmnull@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] `(org-agenda-list)` doesn't respect the `org-agenda-start-day` when `org-agenda-span` is equal to 7. [9.6.1 (release_9.5.5-1519-gaa2249 @ \/home\/rmnull\/lab\/libre\/org-mode\/lisp\/)]"},{"date":"2023-02-20T17:46:16.073Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ilfwnsf4.fsf@tec.tecosaur.net","message-id":"87ilfwnsf4.fsf@tec.tecosaur.net","config":false,"refs-count":7,"username":"Timothy","references":["875yc95rxp.fsf@tec.tecosaur.net"],"related-refs":["87ilfwnsf4.fsf@tec.tecosaur.net","875yc95rxp.fsf@tec.tecosaur.net"],"from":"orgmode@tec.tecosaur.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87ilfwnsf4.fsf@tec.tecosaur.net","source-id":"emacs-orgmode@gnu.org","patch-body":"From a8ed768515e4cf305ba52566f372e096f8ed449a Mon Sep 17 00:00:00 2001\r\nFrom: TEC <git@tecosaur.net>\r\nDate: Sun, 19 Feb 2023 12:28:31 +0800\r\nSubject: [PATCH 1\/6] org-compat: Add ensure-list as org-ensure-list\r\n\r\n* lisp\/org-compat.el (org-ensure-list): Add `ensure-list' from Emacs 28,\r\nas `org-ensure-list'.\r\n---\r\n lisp\/org-compat.el | 12 ++++++++++++\r\n 1 file changed, 12 insertions(+)\r\n\r\ndiff --git a\/lisp\/org-compat.el b\/lisp\/org-compat.el\r\nindex fadb51df6..e11de3639 100644\r\n--- a\/lisp\/org-compat.el\r\n+++ b\/lisp\/org-compat.el\r\n@@ -193,6 +193,18 @@   (defun org-format-prompt (prompt default &rest format-args)\r\n                     default)))\r\n      \": \")))\r\n \r\n+(if (fboundp 'ensure-list)\r\n+    (defalias 'org-ensure-list #'ensure-list)\r\n+  (defun org-ensure-list (object)\r\n+    \"Return OBJECT as a list.\r\n+If OBJECT is already a list, return OBJECT itself.  If it's\r\n+not a list, return a one-element list containing OBJECT.\r\n+\r\n+Compatability substitute for `ensure-list' in Emacs 28.\"\r\n+    (if (listp object)\r\n+        object\r\n+      (list object))))\r\n+\r\n \f\r\n ;;; Emacs < 27.1 compatibility\r\n \r\n-- \r\n2.39.1\r\n\r\n","subject":"Re: [PATCH] Introduce \"export features\""},{"date":"2023-02-18T10:52:20.300Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cz67kzzi.fsf@localhost","message-id":"87cz67kzzi.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["20230217203623.zrkjpmd4oiovyk2g@settat","87a61e4qcg.fsf@localhost","20230215184951.edu6n6k57lmfnqxz@settat","873574berm.fsf@localhost","20230217131845.ein4q6ig2gcytjtc@settat","87fsb4d0ih.fsf@localhost","20230216102249.uxhkbezoheb4mvdi@settat"],"related-refs":["87cz67kzzi.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] ox-latex: Display exit status of LaTeX compilation command (was: Bug: org-latex-export-to-pdf does not remove .tex file [9.4 (9.4-elpa @ \/home\/bruno\/.emacs.d\/elpa\/org-9.4\/)])"},{"date":"2023-02-13T20:13:12.893Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/1864c676b9f.e1bae673679825.2955884247216895930@excalamus.com","message-id":"1864c676b9f.e1bae673679825.2955884247216895930@excalamus.com","config":false,"refs-count":14,"username":"Matt","references":["87a61j3orj.fsf@gmail.com","1864701b4b8.e37160d6373275.4308190093579612690@excalamus.com","87357a2r27.fsf@gmail.com","186283d230a.129f5feb61660123.3289004102603503414@excalamus.com"],"related-refs":["87v87ig3i0.fsf@localhost","1864c676b9f.e1bae673679825.2955884247216895930@excalamus.com","877ck1vass.fsf@localhost"],"from":"matt@excalamus.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] conda doesn't work in ob-shell sessions"},{"date":"2023-02-13T15:04:58.322Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/871qmtip76.fsf@localhost","message-id":"871qmtip76.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["Y+i5i7oQ8BdSfBmk@curry","Y+OR\/4eRUdrSJQ6P@curry","Y+FeMGGZiLqaPxLO@curry","Y+USPxfpI4FXeNuX@curry","874jrvccwo.fsf@localhost","874jrwe6lt.fsf@localhost","87357deq91.fsf@localhost"],"related-refs":["874jrwe6lt.fsf@localhost","871qmtip76.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Use empty ***** heading to indicate folding depth in org-cycle for a subtree (was: new org mode, changed folding behavior could be improved \/ more consistent)"},{"date":"2023-02-13T14:50:15.207Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cz6dipt1.fsf@localhost","message-id":"87cz6dipt1.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["CABehr5ds+ao+jgfK5Cp1VC7MNhhjsfQ6huUwkd0N=YYCitC9HA@mail.gmail.com"],"related-refs":["87cz6dipt1.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Side-by-side images during export (was: [BUG] Org-mode Side-by-Side Images [9.5.3 (release_9.5.3-3-gd54104)])"},{"date":"2023-02-10T11:25:03.670Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87wn4pdarh.fsf@localhost","message-id":"87wn4pdarh.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["14DECC9D-66DE-4C36-942E-4457F7C6A49B@icloud.com"],"related-refs":["87wn4pdarh.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow emojis in tags (was: emojis in tags?)"},{"date":"2023-02-06T21:58:23.689Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CAJcAo8v7HRH1wWGab7HsrsEsuUmQ_VmGb40ScE4h0YRLMUYmrg@mail.gmail.com","message-id":"CAJcAo8v7HRH1wWGab7HsrsEsuUmQ_VmGb40ScE4h0YRLMUYmrg@mail.gmail.com","config":false,"refs-count":1,"username":"Samuel Wales","related-refs":["CAJcAo8v7HRH1wWGab7HsrsEsuUmQ_VmGb40ScE4h0YRLMUYmrg@mail.gmail.com"],"from":"samologist@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[FR] plain list fold all top level items"},{"date":"2023-02-02T10:54:30.683Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87r0v8pcdb.fsf@localhost","message-id":"87r0v8pcdb.fsf@localhost","config":false,"refs-count":6,"username":"Ihor Radchenko","references":["878rxoa6lk.fsf@localhost","tk30mk$ibu$1@ciao.gmane.io","snj702$15ms$1@ciao.gmane.io","snao5l$shr$1@ciao.gmane.io","smu1md$1345$1@ciao.gmane.io","871qqhlskf.fsf@localhost","87fsrxa1j5.fsf@localhost","87mt9743di.fsf@localhost","87fsrxkahq.fsf@nicolasgoaziou.fr","87pmqtj09r.fsf@localhost","87o86mw86r.fsf@localhost"],"related-refs":["87r0v8pcdb.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87r0v8pcdb.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From 78c61c6cc6fe95ab4d661c86ee8b3902a499cd0e Mon Sep 17 00:00:00 2001\r\nMessage-Id: <78c61c6cc6fe95ab4d661c86ee8b3902a499cd0e.1675335125.git.yantar92@posteo.net>\r\nFrom: Max Nikulin <manikulin@gmail.com>\r\nDate: Mon, 22 Nov 2021 23:56:15 +0700\r\nSubject: [PATCH v5] org.el: Warn about unsupported markers in\r\n `org-set-emphasis-alist'\r\n\r\n* lisp\/org.el (org-emphasis-alist): Change custom variable type\r\ndefinition.  Remove unused third list entry from the default value.\r\n\r\n(org-emphasis-alist--check-value): New function used to warn the user\r\nwhen unsupported value is set.  The function is used via\r\n`add-variable-watcher'.\r\n\r\nAttempts to introduce new markers have been discussed enough times to\r\nadd some code that should prevent wasting of time.\r\n\r\nLink: https:\/\/orgmode.org\/list\/878rxoa6lk.fsf@localhost\r\n---\r\n lisp\/org.el | 56 ++++++++++++++++++++++++++++++++++++++++++-----------\r\n 1 file changed, 45 insertions(+), 11 deletions(-)\r\n\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex 1947c63a8..bc879e5d7 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -3635,8 +3635,27 @@ (defvar org-verbatim-re nil\r\n \r\n (defvar org-emphasis-regexp-components) ; defined just below\r\n (defvar org-emphasis-alist) ; defined just below\r\n+(defun org-emphasis-alist--check-value (symbol value &optional operation _)\r\n+  \"Verify the VALUE of `org-emphasis-alist' SYMBOL.\r\n+Issue a warning when the value is not supported.\r\n+Optional argument OPERATION is intended for `add-variable-watcher'\r\n+usage, which see.\"\r\n+  (when (memq operation '(set let))\r\n+    (let ((unsupported\r\n+\t   (delq nil\r\n+\t         (mapcar\r\n+                  (lambda (entry)\r\n+                    (let ((marker (car entry)))\r\n+                      (unless (member marker '(\"*\" \"\/\" \"_\" \"=\" \"~\" \"+\")) marker)))\r\n+                  value))))\r\n+      (when unsupported\r\n+        (warn \"Unsupported markup characters '%s' detected in `%s'\"\r\n+\t      (mapconcat #'identity unsupported \" \")\r\n+\t      (symbol-name symbol))))))\r\n (defun org-set-emph-re (var val)\r\n-  \"Set variable and compute the emphasis regular expression.\"\r\n+  \"Set VAR to VAL and compute the emphasis regular expression.\r\n+The function is intended for :set argument of `defcustom' for\r\n+`org-emphasis-alist'.\"\r\n   (set-default-toplevel-value var val)\r\n   (when (and (boundp 'org-emphasis-alist)\r\n \t     (boundp 'org-emphasis-regexp-components)\r\n@@ -3674,12 +3693,13 @@ (defvar org-emphasis-regexp-components\r\n \r\n You need to reload Org or to restart Emacs after setting this.\")\r\n \r\n+(add-variable-watcher 'org-emphasis-alist #'org-emphasis-alist--check-value)\r\n (defcustom org-emphasis-alist\r\n   '((\"*\" bold)\r\n     (\"\/\" italic)\r\n     (\"_\" underline)\r\n-    (\"=\" org-verbatim verbatim)\r\n-    (\"~\" org-code verbatim)\r\n+    (\"=\" org-verbatim)\r\n+    (\"~\" org-code)\r\n     (\"+\" (:strike-through t)))\r\n   \"Alist of characters and faces to emphasize text.\r\n Text starting and ending with a special character will be emphasized,\r\n@@ -3687,18 +3707,32 @@ (defcustom org-emphasis-alist\r\n marker characters and the face to be used by font-lock for highlighting\r\n in Org buffers.\r\n \r\n+Do not change the characters and do not add new ones to use custom\r\n+markers for existing styles or to introduce new styles.  Org syntax is\r\n+not meant to be configurable and such modifications will not work with\r\n+export.\r\n+\r\n You need to reload Org or to restart Emacs after customizing this.\"\r\n   :group 'org-appearance\r\n   :set 'org-set-emph-re\r\n-  :version \"24.4\"\r\n-  :package-version '(Org . \"8.0\")\r\n+  :package-version '(Org . \"9.7\")\r\n   :type '(repeat\r\n-\t  (list\r\n-\t   (string :tag \"Marker character\")\r\n-\t   (choice\r\n-\t    (face :tag \"Font-lock-face\")\r\n-\t    (plist :tag \"Face property list\"))\r\n-\t   (option (const verbatim)))))\r\n+          (group\r\n+           (choice\r\n+            :tag \"Marker\"\r\n+            (const :tag \"*Bold*\" \"*\")\r\n+            (const :tag \"\/Italic\/\" \"\/\")\r\n+            (const :tag \"_Underline_\" \"_\")\r\n+            (const :tag \"+Strike-through+\" \"+\")\r\n+            (const :tag \"=Verbatim=\" \"=\")\r\n+            (const :tag \"~Code~\" \"~\")\r\n+            ;; To warn users that it does not work.\r\n+            (string :tag \"Unsupported ignored character\"))\r\n+           (choice\r\n+            :tag \"Font\"\r\n+            (face :tag \"Face\")\r\n+            (plist :tag \"Property list\"))\r\n+           (option (const :tag \"Deprecated ignored constant\" verbatim)))))\r\n \r\n (defvar org-protecting-blocks '(\"src\" \"example\" \"export\")\r\n   \"Blocks that contain text that is quoted, i.e. not processed as Org syntax.\r\n-- \r\n2.39.1\r\n\r\n","subject":"[PATCH v5] org.el: Warning for unsupported markers in `org-set-emphasis-alist'"},{"date":"2023-01-31T19:49:10.745Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/63d9704e.5d0a0220.c3c8c.b45c@mx.google.com","message-id":"63d9704e.5d0a0220.c3c8c.b45c@mx.google.com","config":false,"refs-count":12,"username":"Bruno Barbier","references":["63d01412.050a0220.9611.9c4d@mx.google.com","1888293.taCxCBeP46@localhost.localdomain","draft-87r0vhxg15.fsf@tosh-laptop.mail-host-address-is-not-set","b4348232-5b74-e0b0-7006-e7bbb5e68869@gmail.com","3218434.44csPzL39Z@linux.fritz.box","2d36ea04-4ad9-fcda-a09b-0f9600987ff9@gmail.com","21750362.EfDdHjke4D@linux.fritz.box","63d4db30.050a0220.3be9c.a1dc@mx.google.com","939b62c1-34ee-051e-405a-328b841d3d16@gmail.com","69e4caf6-716d-373d-efb6-3d153f4a1253@gmail.com"],"related-refs":["63dbfb46.5d0a0220.5c1cb.0653@mx.google.com","63d9704e.5d0a0220.c3c8c.b45c@mx.google.com"],"from":"brubar.cs@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/63d9704e.5d0a0220.c3c8c.b45c@mx.google.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 4beb7ee307544be868a0d058763aa61558f0701b Mon Sep 17 00:00:00 2001\r\nFrom: Bruno BARBIER <brubar.cs@gmail.com>\r\nDate: Tue, 31 Jan 2023 20:33:22 +0100\r\nSubject: [PATCH] org-faq: links with thunderbird: Add cb_thunderlink\r\n\r\n---\r\n org-faq.org | 48 ++++++++++++++++++++++++++++++++++++++++++++++++\r\n 1 file changed, 48 insertions(+)\r\n\r\ndiff --git a\/org-faq.org b\/org-faq.org\r\nindex 0410d368..1aaa3f2a 100644\r\n--- a\/org-faq.org\r\n+++ b\/org-faq.org\r\n@@ -2051,6 +2051,54 @@ so the following recipe is obsolete:\r\n Notice that this link uses Message-ID to reference a particular\r\n message as well.\r\n \r\n+*** Using the =cb_thunderlink= add-on\r\n+The add-on =cb_thunderlink= for Thunderbird allows:\r\n+   1. to generate direct links from emails inside Thunderbird,\r\n+   2. and to reopen the emails following these links.\r\n+\r\n+**** Installation\r\n+To install the =cb_thunderlink=, see this web page:\r\n+\r\n+   https:\/\/camiel.bouchier.be\/en\/cb_thunderlink\/installation?with_menu=1\r\n+\r\n+You need to install both the add-on and the OS integration.\r\n+\r\n+Once everything is installed, follow the steps below to make org\r\n+compatible links in Thunderbird, and to teach org how to open these\r\n+links.\r\n+\r\n+**** Copying links from Thunderbird\r\n+In Thunderbird, open the =Options= page for the =cb_thunderlink= add-on\r\n+and add a new link type named =org= in the =Configurable links= section.\r\n+\r\n+#+begin_example\r\n+[[mid:$msgid$][$author_name$: $subject$ ($date_iso$)]]\r\n+#+end_example\r\n+\r\n+To get an org link for a given email, open the contextual menu, click\r\n+the =cb_thunderlink= entry and choose the entry named =org=. This\r\n+copies, into the clipboard, a link to this email; you can then paste\r\n+it in Emacs.\r\n+\r\n+\r\n+**** Opening the emails from Emacs\r\n+To teach org how to open these links, add the following lines in\r\n+your configuration file, configuring the variable\r\n+=cbthunderlink-app= to match your system.\r\n+\r\n+#+begin_src elisp\r\n+(defvar cbthunderlink-app nil\r\n+  \"The full path where you've installed your cb_thunderlink application.\")\r\n+\r\n+(defun cbthunderlink-open (message-id)\r\n+  \"Open the given email. MESSAGE-ID is the message id.\"\r\n+  (start-process \"cb_thunderlink\" \" *cb_thunderlink*\"\r\n+                 cbthunderlink-app\r\n+                 (concat \"thunderlink:\/\/messageid=\" message-id)))\r\n+(org-add-link-type \"mid\" 'org-email-open)\r\n+#+end_src\r\n+\r\n+\r\n * Plain Lists\r\n   :PROPERTIES:\r\n   :CUSTOM_ID: Plain-Lists\r\n-- \r\n2.39.1\r\n\r\n","subject":"PATCH for worg about cb_thunderlink (Re: Link from orgmode file to E-Mail (using kmail or notmuch))"},{"date":"2023-01-31T11:50:27.332Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87tu063ox2.fsf@localhost","message-id":"87tu063ox2.fsf@localhost","config":false,"refs-count":81,"username":"Ihor Radchenko","references":["63c9d976.620a0220.a7d40.113b@mx.google.com","63c8f5a6.170a0220.ea8cf.7f96@mx.google.com","877cxk6oeu.fsf@localhost","63c66048.630a0220.427bf.a5f6@mx.google.com","63ca1283.170a0220.5bc81.0fdd@mx.google.com","CAL9aZkvQTue+eQRyt9xRdq4qbgeqJg4jj-ZPhMpcZjSmUN4JdQ@mail.gmail.com","63c86454.170a0220.80970.652d@mx.google.com","87pmb9k8oi.fsf@tsdye.online","63c9b654.170a0220.d82d2.4254@mx.google.com","2150768.1675077958@archlinux","Y8lUg7enHV\/ZtdtZ@protected.localdomain","3035CDD5-41DD-4516-9E4E-9E0DF16BE2E0@gmail.com","87fsc88aq9.fsf@localhost","87mt6e86sr.fsf@tsdye.online","87tu0mjb24.fsf@tsdye.online","Y8jVMRAzzvFq5aoJ@protected.localdomain","87r0vtiks0.fsf@localhost","87lelo8c9r.fsf@localhost","63c7dd3d.170a0220.6b4d6.f84f@mx.google.com","63c671c0.a70a0220.61aa5.56b8@mx.google.com"],"related-refs":["87tu063ox2.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Proposed syntax for timestamps with time zone info (was: [FEATURE REQUEST] Timezone support in org-mode datestamps and org-agenda)"},{"date":"2023-01-30T15:00:09.601Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87edrc3w6f.fsf@localhost","message-id":"87edrc3w6f.fsf@localhost","config":false,"refs-count":9,"username":"Ihor Radchenko","references":["87a62bnf4t.fsf@localhost","tr0dsn$o7h$1@ciao.gmane.io","3218434.44csPzL39Z@linux.fritz.box","Y9AaNn8f2AzLnG7V@protected.localdomain","tqp458$666$1@ciao.gmane.io","860cca44-faa3-ce41-3606-f92b50ee00a9@gmail.com","21750362.EfDdHjke4D@linux.fritz.box","Y9Fdb3VzJ82GEDrB@protected.localdomain","875yculcim.fsf@localhost","tqrhvt$4b8$1@ciao.gmane.io","tr7lnh$10jr$1@ciao.gmane.io","939b62c1-34ee-051e-405a-328b841d3d16@gmail.com","Y87T5Ck1A+D0irnO@protected.localdomain","87pmaxe9fk.fsf@localhost"],"related-refs":["87edrc3w6f.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-manual: Using bookmarklet for org-capture is no longer reliable (was: Firefox permission dialog and org-protocol)"},{"date":"2023-01-27T13:24:59.779Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87v8ks6rhf.fsf@localhost","message-id":"87v8ks6rhf.fsf@localhost","config":false,"refs-count":32,"username":"Ihor Radchenko","references":["87sfx7degz.fsf@gmail.com"],"related-refs":["877cttirgy.fsf@localhost","87wn2ujk27.fsf@localhost","87jzytbbg2.fsf@localhost","87o7nsdkcw.fsf@localhost","87r0t3gahd.fsf@localhost","87v8ks6rhf.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[POLL] Use compat.el in Org? (was: Useful package? Compat.el)"},{"date":"2023-01-25T12:57:55.597Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/877cxan56u.fsf@localhost","message-id":"877cxan56u.fsf@localhost","config":false,"refs-count":6,"username":"Ihor Radchenko","references":["87a62bnf4t.fsf@localhost","3218434.44csPzL39Z@linux.fritz.box","Y9Aa5zOrtQTpf1kG@protected.localdomain","860cca44-faa3-ce41-3606-f92b50ee00a9@gmail.com","21750362.EfDdHjke4D@linux.fritz.box","939b62c1-34ee-051e-405a-328b841d3d16@gmail.com","63d015e3.050a0220.5bc9c.95f5@mx.google.com","Y87T5Ck1A+D0irnO@protected.localdomain"],"related-refs":["877cxan56u.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Should Org provide commonly used link types? (was: Link from orgmode file to E-Mail (using kmail or notmuch))"},{"date":"2023-01-21T21:30:32.638Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/3489c1917ad4be0625ea5f0b2c1b0f2b72ea39e9.camel@timruffing.de","message-id":"3489c1917ad4be0625ea5f0b2c1b0f2b72ea39e9.camel@timruffing.de","config":false,"refs-count":4,"username":"Tim Ruffing","related-refs":["3489c1917ad4be0625ea5f0b2c1b0f2b72ea39e9.camel@timruffing.de","87zgaan68a.fsf@localhost"],"from":"crypto@timruffing.de","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Date prompt suggests yesterday when changing timestamp with org-extend-today-until set [9.6]"},{"date":"2023-01-21T21:25:50.336Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/CA+G3_PMs2ZFW1SoDGa-3u=sZTx0q5JiKAOyT6==K1K1x8afeZA@mail.gmail.com","message-id":"CA+G3_PMs2ZFW1SoDGa-3u=sZTx0q5JiKAOyT6==K1K1x8afeZA@mail.gmail.com","config":false,"refs-count":1,"username":"Tom Gillespie","related-refs":["CA+G3_PMs2ZFW1SoDGa-3u=sZTx0q5JiKAOyT6==K1K1x8afeZA@mail.gmail.com"],"from":"tgbugs@gmail.com","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-clock-in opens buffers for all agenda files"},{"date":"2023-01-20T10:22:20.363Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/875yd1tskz.fsf@localhost","message-id":"875yd1tskz.fsf@localhost","config":false,"refs-count":6,"username":"Ihor Radchenko","references":["87r0vs8e02.fsf@localhost","a2cc49d3-7f65-5f6a-8f05-21e5056335b3@gmail.com","87k01i6ept.fsf@localhost","2eebe03e-fda5-f879-2643-2c9a146dd23e@gmail.com","CAEGK9xkKyVP-rpW1MqQnrQkLUzc+bPjj06F0A7vkA_qGzFgR7A@mail.gmail.com"],"related-refs":["875yd1tskz.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Add C-u and C-u C-u prefix arguments to org-paste-subtree (was: Make org-paste-subtree more predictable and useful)"},{"date":"2023-01-20T10:14:00.267Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/878rhxtszb.fsf@localhost","message-id":"878rhxtszb.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["87r0vs8e02.fsf@localhost","a2cc49d3-7f65-5f6a-8f05-21e5056335b3@gmail.com","87k01i6ept.fsf@localhost","2eebe03e-fda5-f879-2643-2c9a146dd23e@gmail.com","CAEGK9xkKyVP-rpW1MqQnrQkLUzc+bPjj06F0A7vkA_qGzFgR7A@mail.gmail.com"],"related-refs":["878rhxtszb.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-paste-subtree level when point is in the middle of a heading (was: Make org-paste-subtree more predictable and useful)"},{"date":"2023-01-17T10:24:30.098Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87cz7dihoc.fsf@localhost","message-id":"87cz7dihoc.fsf@localhost","config":false,"refs-count":2,"username":"Ihor Radchenko","references":["87lem17a51.fsf@ucl.ac.uk","878ri28i84.fsf@ucl.ac.uk","878ri1k12h.fsf@localhost"],"related-refs":["87cz7dihoc.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-cite-insert only searches on truncate author list"},{"date":"2023-01-17T09:13:50.215Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87tu0pikxv.fsf@localhost","message-id":"87tu0pikxv.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["CA+G3_PPT3knyBi=5axXPOG1abR-0MzWWTysdOfAVDUc6caRe6w@mail.gmail.com","63c5b564.170a0220.fcec8.41dd@mx.google.com","CA+G3_PPW6LZa7YTwQ2YZ3AfFDopTkurgbpkV2Ev=+7XkbvLPxg@mail.gmail.com","87mt6ilkyb.fsf@localhost","CAL9aZkusXaNVCu7+nO-ic8SHhwVdOiXYtDyF=Gz7h+NoLaOZXQ@mail.gmail.com","87tu0t1i0c.fsf@localhost","86zgamtv6o.fsf@gmail.com"],"related-refs":["87tu0pikxv.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow BC years in timestamps (was: [FEATURE REQUEST] Timezone support in org-mode datestamps and org-agenda)"},{"date":"2023-01-16T10:11:01.350Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87tu0qdc4k.fsf@localhost","message-id":"87tu0qdc4k.fsf@localhost","config":false,"refs-count":11,"username":"Ihor Radchenko","references":["87zgb90win.fsf@localhost","116c3126-32cc-44d0-9e95-e802161e1e84@app.fastmail.com"],"related-refs":["87tu0qdc4k.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87tu0qdc4k.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From a7c5aa3431cc1946aa7f8055c39e18e5afc4cef4 Mon Sep 17 00:00:00 2001\r\nMessage-Id: <a7c5aa3431cc1946aa7f8055c39e18e5afc4cef4.1673863743.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Mon, 16 Jan 2023 12:59:47 +0300\r\nSubject: [PATCH 1\/2] org-manual.org: Clarify that LANGUAGE may be omitted in\r\n code blocks\r\n\r\n* doc\/org-manual.org (Structure of Code Blocks):\r\n(Editing Source Code): Clarify that <language> is optional.  Link to\r\npossible consequences of <language> being omitted.\r\n---\r\n doc\/org-manual.org | 23 ++++++++++++++++++-----\r\n 1 file changed, 18 insertions(+), 5 deletions(-)\r\n\r\ndiff --git a\/doc\/org-manual.org b\/doc\/org-manual.org\r\nindex 4466af8e4..c241e170f 100644\r\n--- a\/doc\/org-manual.org\r\n+++ b\/doc\/org-manual.org\r\n@@ -17313,9 +17313,16 @@ ** Structure of Code Blocks\r\n - =<language>= ::\r\n \r\n   #+cindex: language, in code blocks\r\n-  Mandatory.  It is the identifier of the source code language in the\r\n+  Optional.  It is the identifier of the source code language in the\r\n   block.  See [[*Languages]], for identifiers of supported languages.\r\n \r\n+  When =<language>= identifier is omitted, the block also cannot\r\n+  have =<switches>= and =<header arguments>=.\r\n+\r\n+  Language identifier is also used to fontify code blocks in Org\r\n+  buffers, when ~org-src-fontify-natively~ is set to non-~nil~.  See\r\n+  [[*Editing Source Code]].\r\n+\r\n - =<switches>= ::\r\n \r\n   #+cindex: switches, in code blocks\r\n@@ -18951,6 +18958,9 @@ ** Editing Source Code\r\n   header line, then the edit buffer uses that major mode.  Use this\r\n   variable to arbitrarily map language identifiers to major modes.\r\n \r\n+  When language identifier is omitted in the src block, Org mode's\r\n+  behavior is undefined.\r\n+\r\n - ~org-src-window-setup~ ::\r\n \r\n   #+vindex: org-src-window-setup\r\n@@ -18976,10 +18986,13 @@ ** Editing Source Code\r\n \r\n #+vindex: org-src-fontify-natively\r\n #+vindex: org-src-block-faces\r\n-Set ~org-src-fontify-natively~ to non-~nil~ to turn on native code\r\n-fontification in the \/Org\/ buffer.  Fontification of code blocks can\r\n-give visual separation of text and code on the display page.  To\r\n-further customize the appearance of ~org-block~ for specific\r\n+Fontification of code blocks can give visual separation of text and\r\n+code on the display page.  Set ~org-src-fontify-natively~ to non-~nil~\r\n+to turn on native code fontification in the \/Org\/ buffer.  The\r\n+fontification follows the major mode used to edit the code block (see\r\n+~org-src-lang-modes~ above).\r\n+\r\n+To further customize the appearance of ~org-block~ for specific\r\n languages, customize ~org-src-block-faces~.  The following example\r\n shades the background of regular blocks, and colors source blocks only\r\n for Python and Emacs Lisp languages.\r\n-- \r\n2.39.0\r\n\r\n","subject":"Re: [BUG] ox-html does not export captions of source blocks without language"},{"date":"2023-01-15T20:05:29.490Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87r0vvr2ai.fsf@gmail.com","message-id":"87r0vvr2ai.fsf@gmail.com","config":false,"refs-count":12,"username":"No Wayman","related-refs":["87bkmve8qv.fsf@gmail.com","877cxhs7dh.fsf@localhost","87r0vvr2ai.fsf@gmail.com","87tu0q5m2t.fsf@gmail.com","87fsc7e8ub.fsf@gmail.com","87mt6jqzx8.fsf@gmail.com"],"from":"iarchivedmywholelife@gmail.com","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87r0vvr2ai.fsf@gmail.com","source-id":"emacs-orgmode@gnu.org","patch-body":"From 28c596320f48e4606f8eaf69fdc1c83fb084749e Mon Sep 17 00:00:00 2001\r\nFrom: Nicholas Vollmer <iarchivedmywholelife@gmail.com>\r\nDate: Sun, 15 Jan 2023 14:55:11 -0500\r\nSubject: [PATCH] * mk\/targets.mk (GITVERSION): support shallow repo clones\r\n\r\nIf Org is being built from a shallow clone, tags are not locally available.\r\nQuery the upstream remote via git ls-remote and parse the output.\r\nNote this will result in a \"n\/a\" indicator in org-version where the\r\nnumber of commits since the last tag is usually present.\r\ne.g. \"release_9.6.1-n\/a-gabc123\"\r\n---\r\n mk\/targets.mk | 9 ++++++++-\r\n 1 file changed, 8 insertions(+), 1 deletion(-)\r\n\r\ndiff --git a\/mk\/targets.mk b\/mk\/targets.mk\r\nindex 4435daa91..300fc8e0b 100644\r\n--- a\/mk\/targets.mk\r\n+++ b\/mk\/targets.mk\r\n@@ -14,7 +14,14 @@ ifneq ($(wildcard .git),)\r\n   # Use the org.el header.\r\n   ORGVERSION := $(patsubst %-dev,%,$(shell $(BATCH) --eval \"(require 'lisp-mnt)\" \\\r\n     --visit lisp\/org.el --eval '(princ (lm-header \"version\"))'))\r\n-  GITVERSION ?= $(shell git describe --match release\\* --abbrev=6 HEAD)\r\n+  ifneq ($(wildcard .git\/shallow),)\r\n+    REMOTETAGS := $(strip $(shell git ls-remote --tags 2>\/dev\/null | tail -n 1))\r\n+    COMMIT     := $(shell echo $(firstword $(REMOTETAGS)) | cut -c 1-6)\r\n+    TAGPREFIX  := $(subst refs\/tags\/,,$(lastword $(REMOTETAGS)))\r\n+    GITVERSION ?= $(subst ^{},-n\/a-g$(COMMIT),$(TAGPREFIX))\r\n+  else\r\n+    GITVERSION ?= $(shell git describe --match release\\* --abbrev=6 HEAD)\r\n+  endif\r\n   GITSTATUS  ?= $(shell git status -uno --porcelain)\r\n else\r\n  -include mk\/version.mk\r\n-- \r\n2.39.0\r\n\r\n","subject":"[PATCH] Support building Org from shallow clone [9.6.1 (release_9.6.1-137-gecb62e @ \/home\/n\/.emacs.d\/elpaca\/builds\/org\/)]"},{"date":"2023-01-15T12:33:02.716Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/8f6fcd70966c1d5434d9058affb6a03498c95c89.1673785107.git.yantar92@posteo.net","message-id":"8f6fcd70966c1d5434d9058affb6a03498c95c89.1673785107.git.yantar92@posteo.net","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["cover.1673785107.git.yantar92@posteo.net"],"related-refs":["8f6fcd70966c1d5434d9058affb6a03498c95c89.1673785107.git.yantar92@posteo.net"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[PATCH 3\/4] org-metaup, org-metadown: Move subtrees in active region"},{"date":"2023-01-14T12:18:09.101Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/877cxp1fbx.fsf@localhost","message-id":"877cxp1fbx.fsf@localhost","config":false,"refs-count":5,"username":"Ihor Radchenko","references":["87mt6l1h97.fsf@localhost","Y8KZbffnjVm\/XItg@tahm","Y8GrrEdCQagQ9aIP@protected.localdomain","CAL9aZkusXaNVCu7+nO-ic8SHhwVdOiXYtDyF=Gz7h+NoLaOZXQ@mail.gmail.com","tptkk4$t50$1@ciao.gmane.io","Y8KNNUxBxLPwxVjA@tahm","63c287ca.a70a0220.4bd14.873b@mx.google.com"],"related-refs":["877cxp1fbx.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[FR] Allow end date and max repeat count for timestamps with repeaters (was: [FEATURE REQUEST] Timezone support in org-mode datestamps and org-agenda)"},{"date":"2023-01-14T12:05:19.560Z","vote":false,"archived-at":"","message-id":"87h6wt1ga6.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["CAL9aZkusXaNVCu7+nO-ic8SHhwVdOiXYtDyF=Gz7h+NoLaOZXQ@mail.gmail.com"],"related-refs":["87h6wt1ga6.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"","subject":"[FR] Timezone support in org-mode datestamps and org-agenda"},{"date":"2023-01-14T11:56:17.658Z","vote":false,"archived-at":"","message-id":"87edrx1g91.fsf@localhost","config":false,"refs-count":1,"username":"Ihor Radchenko","references":["CAL9aZkusXaNVCu7+nO-ic8SHhwVdOiXYtDyF=Gz7h+NoLaOZXQ@mail.gmail.com"],"related-refs":["87edrx1g91.fsf@localhost"],"from":"yantar92@gmail.com","source-id":"","subject":"[FR] Timezone support in org-mode datestamps and org-agenda"},{"date":"2023-01-10T11:26:43.081Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87eds24opu.fsf@no.workgroup","message-id":"87eds24opu.fsf@no.workgroup","config":false,"refs-count":2,"username":"Gregor Zattler","related-refs":["87eds24opu.fsf@no.workgroup"],"from":"telegraph@gmx.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] org-element-cache warning while capturing [9.6 (release_9.6-204-g2f7052.dirty @ \/home\/grfz\/src\/org-mode\/lisp\/)]"},{"date":"2023-01-07T11:24:40.978Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87ilhimvvo.fsf@localhost","message-id":"87ilhimvvo.fsf@localhost","config":false,"refs-count":4,"username":"Ihor Radchenko","references":["878rjfsj9o.fsf@localhost","87v8mktt38.fsf@gmail.com","87tu1yqu3l.fsf@localhost","m2cz7sj5zt.fsf@gmail.com","874jtzhypq.fsf@gmail.com"],"related-refs":["87ilhimvvo.fsf@localhost"],"from":"yantar92@posteo.net","patch-url":"https:\/\/tracker.orgmode.org\/patch\/87ilhimvvo.fsf@localhost","source-id":"emacs-orgmode@gnu.org","patch-body":"From bce44c75b73fa0b935a9f991624a292e061f5c73 Mon Sep 17 00:00:00 2001\r\nMessage-Id: <bce44c75b73fa0b935a9f991624a292e061f5c73.1673090538.git.yantar92@posteo.net>\r\nFrom: Ihor Radchenko <yantar92@posteo.net>\r\nDate: Sat, 7 Jan 2023 14:17:26 +0300\r\nSubject: [PATCH] org-cdlatex-mode: Fix regression from f01390cf05\r\n\r\n* lisp\/org.el (org--math-always-on): Rename to `org--math-p' and only\r\noverride `texmathp' when current command is `cdlatex-math-symbol' or\r\nwhen we are inside Org LaTeX math fragment.  Only these two scenarios\r\nare the places where `texmathp' may not work properly in Org files.\r\nWe must not return t outside latex fragments as initially suggested by\r\nthe docstring because it would break, for example, `cdlatex-dollar'\r\ncommand.\r\n(org-cdlatex-mode): Use the new function name for advice.\r\n* lisp\/org-compat.el (org--math-always-on): Declare obsolete.\r\n\r\nReported-by: Daniel Fleischer <danflscr@gmail.com>\r\nLink: https:\/\/orgmode.org\/list\/m2cz7sj5zt.fsf@gmail.com\r\n---\r\n lisp\/org-compat.el |  3 +++\r\n lisp\/org.el        | 27 ++++++++++++++++-----------\r\n 2 files changed, 19 insertions(+), 11 deletions(-)\r\n\r\ndiff --git a\/lisp\/org-compat.el b\/lisp\/org-compat.el\r\nindex 6c5085255..0f6dc831a 100644\r\n--- a\/lisp\/org-compat.el\r\n+++ b\/lisp\/org-compat.el\r\n@@ -568,6 +568,9 @@ (defun org-let2 (list1 list2 &rest body) ;FIXME: Where did our karma go?\r\n (make-obsolete 'org-let \"to be removed\" \"9.6\")\r\n (make-obsolete 'org-let2 \"to be removed\" \"9.6\")\r\n \r\n+(define-obsolete-function-alias 'org--math-always-on\r\n+  'org--math-p \"9.7\")\r\n+\r\n (defun org-compatible-face (inherits specs)\r\n   \"Make a compatible face specification.\r\n If INHERITS is an existing face and if the Emacs version supports\r\ndiff --git a\/lisp\/org.el b\/lisp\/org.el\r\nindex ae6250e52..44c41a729 100644\r\n--- a\/lisp\/org.el\r\n+++ b\/lisp\/org.el\r\n@@ -15434,13 +15434,15 @@ (define-minor-mode org-cdlatex-mode\r\n     (cdlatex-compute-tables))\r\n   (unless org-cdlatex-texmathp-advice-is-done\r\n     (setq org-cdlatex-texmathp-advice-is-done t)\r\n-    (advice-add 'texmathp :around #'org--math-always-on)))\r\n+    (advice-add 'texmathp :around #'org--math-p)))\r\n \r\n-(defun org--math-always-on (orig-fun &rest args)\r\n-  \"Always return t in Org buffers.\r\n-This is because we want to insert math symbols without dollars even outside\r\n-the LaTeX math segments.  If Org mode thinks that point is actually inside\r\n-an embedded LaTeX fragment, let `texmathp' do its job.\r\n+(defun org--math-p (orig-fun &rest args)\r\n+  \"Return t inside math fragments or running `cdlatex-math-symbol'.\r\n+This function is intended to be an :around advice for `texmathp'.\r\n+\r\n+If Org mode thinks that point is actually inside\r\n+an embedded LaTeX environment, return t when the environment is math\r\n+or let `texmathp' do its job otherwise.\r\n `\\\\[org-cdlatex-mode-map]'\"\r\n   (interactive)\r\n   (cond\r\n@@ -15450,11 +15452,14 @@ (defun org--math-always-on (orig-fun &rest args)\r\n     t)\r\n    (t\r\n     (let ((element (org-element-context)))\r\n-      (or (not (org-inside-LaTeX-fragment-p element))\r\n-          (if (not (eq (org-element-type element) 'latex-fragment))\r\n-              (apply orig-fun args)\r\n-            (setq texmathp-why '(\"Org mode embedded math\" . 0))\r\n-\t    t))))))\r\n+      (when (org-inside-LaTeX-fragment-p element)\r\n+        (pcase (substring-no-properties\r\n+                (org-element-property :value element)\r\n+                0 2)\r\n+          ((or \"\\\\(\" \"\\\\[\" (pred (string-match-p (rx string-start \"$\"))))\r\n+           (setq texmathp-why '(\"Org mode embedded math\" . 0))\r\n+           t)\r\n+          (_ (apply orig-fun args))))))))\r\n \r\n (defun turn-on-org-cdlatex ()\r\n   \"Unconditionally turn on `org-cdlatex-mode'.\"\r\n-- \r\n2.38.1\r\n\r\n","subject":"Re: [BUG] issue with texmathp [9.6 (release_9.6-22-g78d283 @ \/home\/jds6696\/.emacs.d\/straight\/build\/org-mode\/)]"},{"date":"2023-01-05T20:45:01.427Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/86zgawk9l5.fsf@protected.rcdrun.com","message-id":"86zgawk9l5.fsf@protected.rcdrun.com","config":false,"refs-count":3,"username":"Jean Louis","related-refs":["86zgawk9l5.fsf@protected.rcdrun.com"],"from":"bugs@gnu.support","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Package keyval Error: margins undefined. [9.6 (release_9.6-61-g63e073f @ \/home\/data1\/protected\/Programming\/Software\/emacs\/lisp\/org\/)]"},{"date":"2023-01-05T14:01:35.722Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87mt6xrtc0.fsf@zellerin.cz","message-id":"87mt6xrtc0.fsf@zellerin.cz","config":false,"refs-count":5,"username":"Tomas Zellerin","related-refs":["87mt6xrtc0.fsf@zellerin.cz"],"from":"tomas@zellerin.cz","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] Org agenda misbehaves in a side window [9.5 (9.5-g0a86ad @ \/home\/zellerin\/.emacs.d\/elpa\/org-9.5\/)]"},{"date":"2023-01-05T09:31:58.946Z","vote":false,"archived-at":"https:\/\/list.orgmode.org\/87lemhgwn7.fsf@localhost","message-id":"87lemhgwn7.fsf@localhost","config":false,"refs-count":7,"username":"Ihor Radchenko","references":["m2r0wacy90.fsf@m4x.org"],"related-refs":["87lemhgwn7.fsf@localhost"],"from":"yantar92@posteo.net","source-id":"emacs-orgmode@gnu.org","subject":"[BUG] CUSTOM_id ignored on blocks by ox-beamer"}]