]> git.eshelyaron.com Git - emacs.git/commitdiff
Update to Org 9.7.4-7-g165319
authorKyle Meyer <kyle@kyleam.com>
Sat, 15 Jun 2024 18:25:35 +0000 (14:25 -0400)
committerEshel Yaron <me@eshelyaron.com>
Mon, 17 Jun 2024 10:43:49 +0000 (12:43 +0200)
(cherry picked from commit 0910f6fe3f701caa478d4aa08d9667316050b977)

27 files changed:
etc/ORG-NEWS
etc/refcards/orgcard.tex
lisp/org/ob-C.el
lisp/org/ob-awk.el
lisp/org/ob-clojure.el
lisp/org/ob-core.el
lisp/org/ob-ditaa.el
lisp/org/ob-exp.el
lisp/org/ob-gnuplot.el
lisp/org/ob-groovy.el
lisp/org/ob-lilypond.el
lisp/org/ob-maxima.el
lisp/org/ob-screen.el
lisp/org/ob-sed.el
lisp/org/org-capture.el
lisp/org/org-clock.el
lisp/org/org-compat.el
lisp/org/org-element.el
lisp/org/org-fold-core.el
lisp/org/org-lint.el
lisp/org/org-num.el
lisp/org/org-persist.el
lisp/org/org-src.el
lisp/org/org-table.el
lisp/org/org-version.el
lisp/org/org.el
lisp/org/ox.el

index 32e56cba82cb54c98f7847fa4b562442ab28840a..edeb7d3ab6c69c616bb0cdc73d0ef73aeeddb937 100644 (file)
@@ -28,6 +28,15 @@ constant.
 If you still want to use python-mode with ob-python, you might
 consider [[https://gitlab.com/jackkamm/ob-python-mode-mode][ob-python-mode-mode]], where the code to support python-mode
 has been ported to.
+*** It is no longer possible to reveal hidden parts of the links during isearch
+
+Org 9.6 introduced support for searching hidden parts of the links.
+
+Unfortunately, we had to drop this support because its implementation
+turned out to be unreliable for many users. Proper implementation
+would require patching =isearch.el= and possibly a number of external
+libraries implementing isearch equivalents. It cannot be done on Org
+side alone.
 
 *** =ox-latex=: ~org-latex-line-break-safe~ is deprecated
 
@@ -1719,6 +1728,9 @@ to the Org behavior.  The new features and changes are listed below.
 
 **** Hidden parts of the links can now be searched and revealed during isearch
 
+[2024-06-09 Sun] Since Org 9.7, this is no longer working.  See
+changes for Org 9.7.
+
 In the past, hidden parts of the links could not be searched using
 isearch (=C-s=).  Now, they are searchable by default.  The hidden
 match is also revealed temporarily during isearch.
index 4d605fe77049243dbb5b11d8b57fd4a6ff17686c..3967459fd81809ec7865773335a10bec900e2bbc 100644 (file)
@@ -1,5 +1,5 @@
 % Reference Card for Org Mode
-\def\orgversionnumber{9.7.3}
+\def\orgversionnumber{9.7.4}
 \def\versionyear{2024}          % latest update
 \input emacsver.tex
 
index d13c65d260a79bc2bdba344be85550d1bd554bbd..f7735ee72bb4cb3283b8a31bf52d0c71d2d511bc 100644 (file)
@@ -482,7 +482,7 @@ int get_column_num (int nbcols, const char** header, const char* column)
 (defun org-babel-C-header-to-C (head type)
   "Convert an elisp list of header table into a C or D vector
 specifying a variable with the name of the table."
-  (message "%S" type)
+  (unless noninteractive (message "%S" type))
   (let ((table (car head))
         (headers (cdr head))
         (typename (pcase type
index 9577a39ee6734ffdf262842a31091da78f38e7f4..d94da405f0d804302cf13bf364db1c025a33419b 100644 (file)
@@ -61,7 +61,7 @@
   "Execute a block of Awk code BODY with org-babel.
 PARAMS is a plist of src block parameters .
 This function is called by `org-babel-execute-src-block'."
-  (message "Executing Awk source code block")
+  (unless noninteractive (message "Executing Awk source code block"))
   (let* ((result-params (cdr (assq :result-params params)))
          (cmd-line (cdr (assq :cmd-line params)))
          (in-file (cdr (assq :in-file params)))
index 4a54acc51b33b2257eb91f1809ba9537c40b872b..c7ebbbb95e92915a8c82ab8be17d6048678f6fba 100644 (file)
 (defcustom ob-clojure-cli-command (when-let (cmd (executable-find "clojure"))
                                     (concat cmd " -M"))
   "Clojure CLI command used by the Clojure `clojure-cli' backend."
-  :type 'string
+  :type '(choice string (const nil))
   :group 'org-babel
   :package-version '(Org . "9.7"))
 
index d1984b2d6fecc817f4962b9de1f59b8778e26455..db75f1f0ad5c562e64b5ad94a60b7e6191420549 100644 (file)
@@ -855,8 +855,9 @@ guess will be made."
            (forward-line)
            (skip-chars-forward " \t")
            (let ((result (org-babel-read-result)))
-             (message (format "Cached: %s"
-                               (replace-regexp-in-string "%" "%%" (format "%S" result))))
+              (unless noninteractive
+               (message (format "Cached: %s"
+                                 (replace-regexp-in-string "%" "%%" (format "%S" result)))))
              result)))
         ((org-babel-confirm-evaluate info)
          (let* ((lang (nth 0 info))
@@ -879,21 +880,26 @@ guess will be made."
                 result exec-start-time)
            (unless (fboundp cmd)
              (error "No org-babel-execute function for %s!" lang))
-           (message "Executing %s %s %s..."
-                    (capitalize lang)
-                     (pcase executor-type
-                       ('src-block "code block")
-                       ('inline-src-block "inline code block")
-                       ('babel-call "call")
-                       ('inline-babel-call "inline call")
-                       (e (symbol-name e)))
-                    (let ((name (nth 4 info)))
-                      (if name
-                           (format "(%s)" name)
-                         (format "at position %S" (nth 5 info)))))
+            (unless noninteractive
+             (message "Executing %s %s %s..."
+                      (capitalize lang)
+                       (pcase executor-type
+                         ('src-block "code block")
+                         ('inline-src-block "inline code block")
+                         ('babel-call "call")
+                         ('inline-babel-call "inline call")
+                         (e (symbol-name e)))
+                      (let ((name (nth 4 info)))
+                        (if name
+                             (format "(%s)" name)
+                           (format "at position %S" (nth 5 info))))))
            (setq exec-start-time (current-time)
                   result
-                 (let ((r (save-current-buffer (funcall cmd body params))))
+                 (let ((r
+                         ;; Code block may move point in the buffer.
+                         ;; Make sure that the point remains on the
+                         ;; code block.
+                         (save-excursion (funcall cmd body params))))
                    (if (and (eq (cdr (assq :result-type params)) 'value)
                             (or (member "vector" result-params)
                                 (member "table" result-params))
@@ -2758,18 +2764,19 @@ INFO may provide the values of these header arguments (in the
                           (not (and (listp result)
                                     (member "append" result-params))))
                  (indent-rigidly beg end indent))
-                (let ((time-info
-                       ;; Only show the time when something other than
-                       ;; 0s will be shown, i.e. check if the time is at
-                       ;; least half of the displayed precision.
-                       (if (and exec-time (> (float-time exec-time) 0.05))
-                           (format " (took %.1fs)" (float-time exec-time))
-                         "")))
-                  (if (null result)
-                      (if (member "value" result-params)
-                          (message "Code block returned no value%s." time-info)
-                        (message "Code block produced no output%s." time-info))
-                    (message "Code block evaluation complete%s." time-info))))
+                (unless noninteractive
+                  (let ((time-info
+                         ;; Only show the time when something other than
+                         ;; 0s will be shown, i.e. check if the time is at
+                         ;; least half of the displayed precision.
+                         (if (and exec-time (> (float-time exec-time) 0.05))
+                             (format " (took %.1fs)" (float-time exec-time))
+                           "")))
+                    (if (null result)
+                        (if (member "value" result-params)
+                            (message "Code block returned no value%s." time-info)
+                          (message "Code block produced no output%s." time-info))
+                      (message "Code block evaluation complete%s." time-info)))))
            (when end (set-marker end nil))
            (when outside-scope (narrow-to-region visible-beg visible-end))
            (set-marker visible-beg nil)
index ba8e65394f9325d596617ec2cd188ee73681541d..715d8ddf07efc659e2d802b531aec3f46cdc95c3 100644 (file)
@@ -113,8 +113,9 @@ This function is called by `org-babel-execute-src-block'."
     (unless (file-exists-p org-ditaa-jar-path)
       (error "Could not find ditaa.jar at %s" org-ditaa-jar-path))
     (with-temp-file in-file (insert body))
-    (message cmd) (shell-command cmd)
-    (when pdf-cmd (message pdf-cmd) (shell-command pdf-cmd))
+    (unless noninteractive (message cmd))
+    (shell-command cmd)
+    (when pdf-cmd (unless noninteractive (message pdf-cmd)) (shell-command pdf-cmd))
     nil)) ;; signal that output has already been written to file
 
 (defun org-babel-prep-session:ditaa (_session _params)
index 657cb2b52657643875febfeeeef32f89af6b4f11..5516530c5b70379d9f8d891f16eb0de28b6fe86c 100644 (file)
@@ -265,8 +265,9 @@ this template."
                                   (if (not (eq type 'babel-call))
                                       (progn (skip-chars-forward " \t")
                                              (point))
-                                    (skip-chars-forward " \r\t\n")
-                                    (line-beginning-position)))))
+                                     (unless (eobp)
+                                      (skip-chars-forward " \r\t\n")
+                                      (line-beginning-position))))))
                           ((not rep)
                            ;; Replacement code cannot be determined.
                            ;; Leave the code block as is.
@@ -291,8 +292,9 @@ this template."
                           (cond ((not replacement) (goto-char end))
                                 ((equal replacement "")
                                  (goto-char end)
-                                 (skip-chars-forward " \r\t\n")
-                                 (forward-line 0)
+                                  (unless (eobp)
+                                   (skip-chars-forward " \r\t\n")
+                                   (forward-line 0))
                                  (delete-region begin (point)))
                                 (t
                                  (if (org-src-preserve-indentation-p element)
index dc5cd0e52170a6bdd098d4f685da1f9d0274a3fc..956763c587e5ab773260a02a055de64b50215972 100644 (file)
@@ -210,7 +210,7 @@ This function is called by `org-babel-execute-src-block'."
           (let ((script-file (org-babel-temp-file "gnuplot-script-")))
             (with-temp-file script-file
               (insert (concat body "\n")))
-            (message "gnuplot \"%s\"" script-file)
+            (unless noninteractive (message "gnuplot \"%s\"" script-file))
             (setq output
                   (shell-command-to-string
                   (format
@@ -219,7 +219,7 @@ This function is called by `org-babel-execute-src-block'."
                     script-file
                     (if (member system-type '(cygwin windows-nt ms-dos))
                         t nil)))))
-            (message "%s" output))
+            (unless noninteractive (message "%s" output)))
         (with-temp-buffer
           (insert (concat body "\n"))
           (gnuplot-mode)
@@ -232,7 +232,7 @@ This function is called by `org-babel-execute-src-block'."
   "Prepare SESSION according to the header arguments in PARAMS."
   (let* ((session (org-babel-gnuplot-initiate-session session))
          (var-lines (org-babel-variable-assignments:gnuplot params)))
-    (message "%S" session)
+    (unless noninteractive (message "%S" session))
     (org-babel-comint-in-buffer session
       (dolist (var-line  var-lines)
        (insert var-line)
index 908df93372a221d221f662ec0d57be16654eea69..d87ef4bb65780584fe0c0f36141554765409a4f8 100644 (file)
@@ -52,7 +52,7 @@ parameters may be used, like groovy -v"
 (defun org-babel-execute:groovy (body params)
   "Execute Groovy BODY according to PARAMS.
 This function is called by `org-babel-execute-src-block'."
-  (message "Executing Groovy source code block")
+  (unless noninteractive (message "Executing Groovy source code block"))
   (let* ((processed-params (org-babel-process-params params))
          (session (org-babel-groovy-initiate-session (nth 0 processed-params)))
          (result-params (nth 2 processed-params))
index 35df76fc964298a65517c573219e4fc80a0729ce..a8d85ce7c85875a6febc7024be7ada795ecc72b1 100644 (file)
@@ -41,7 +41,7 @@
 (declare-function org-fold-show-all "org-fold" (&optional types))
 
 (add-to-list 'org-babel-tangle-lang-exts '("LilyPond" . "ly"))
-(add-to-list 'org-src-lang-modes '("lilypond" . "LilyPond"))
+(add-to-list 'org-src-lang-modes '("lilypond" . LilyPond))
 
 (defvar org-babel-default-header-args:lilypond '()
   "Default header arguments for lilypond code blocks.
index ef875cfe8a95d383711332b9bb0fb1c6d9a752cd..681154adfbfbef02667b5fca9a88dbcd1987121f 100644 (file)
@@ -131,7 +131,7 @@ Return nil if LINE is zero-length or it matches a regexp in
 (defun org-babel-execute:maxima (body params)
   "Execute Maxima BODY according to PARAMS.
 This function is called by `org-babel-execute-src-block'."
-  (message "Executing Maxima source code block")
+  (unless noninteractive (message "Executing Maxima source code block"))
   (let ((result-params (split-string (or (cdr (assq :results params)) "")))
        (result
         (let* ((cmdline (or (cdr (assq :cmdline params)) ""))
@@ -151,7 +151,7 @@ This function is called by `org-babel-execute-src-block'."
                               (format "(linenum:0, %s(%S))$" batch/load in-file))
                              cmdline)))
           (with-temp-file in-file (insert (org-babel-maxima-expand body params)))
-          (message cmd)
+          (unless noninteractive (message cmd))
            ;; " | grep -v batch | grep -v 'replaced' | sed '/^$/d' "
           (let ((raw (org-babel-eval cmd "")))
              (mapconcat
index ffb66d65967ce91a03923a13547fb03d4dde4bf9..a56afc7050eb677caa402b9352eedc88ad75ed35 100644 (file)
@@ -52,7 +52,7 @@ In case you want to use a different screen than one selected by your $PATH")
 (defun org-babel-execute:screen (body params)
   "Send BODY via screen to a terminal using Babel, according to PARAMS.
 \"default\" session is used when none is specified in the PARAMS."
-  (message "Sending source code block to interactive terminal session...")
+  (unless noninteractive (message "Sending source code block to interactive terminal session..."))
   (save-window-excursion
     (let* ((session (cdr (assq :session params)))
            (socket (org-babel-screen-session-socketname session)))
index fa6a2bb199dc575dcc8dab224949116cb5a66f34..83d9684ade259f5c88abeb6a95c60da4247e230d 100644 (file)
@@ -65,7 +65,7 @@
 BODY is the source inside a sed source block and PARAMS is an
 association list over the source block configurations.  This
 function is called by `org-babel-execute-src-block'."
-  (message "Executing sed source code block")
+  (unless noninteractive (message "Executing sed source code block"))
   (let* ((result-params (cdr (assq :result-params params)))
          (cmd-line (cdr (assq :cmd-line params)))
          (in-file (cdr (assq :in-file params)))
index 6603b5e017a64ff9c3968f69d671c65d190c03db..f10e36937d3a457c45cfba1d82c41a39a1c7acb6 100644 (file)
@@ -408,8 +408,7 @@ you can escape ambiguous cases with a backward slash, e.g., \\%i."
   (let ((file-variants '(choice :tag "Filename       "
                                (file :tag "Literal")
                                (function :tag "Function")
-                               (variable :tag "Variable")
-                               (sexp :tag "Form"))))
+                               (variable :tag "Variable"))))
     `(repeat
       (choice :value ("" "" entry (file "~/org/notes.org") "")
              (list :tag "Multikey description"
@@ -452,12 +451,12 @@ you can escape ambiguous cases with a backward slash, e.g., \\%i."
                            (list :tag "File & function"
                                  (const :format "" file+function)
                                  ,file-variants
-                                 (sexp :tag "  Function"))
+                                 (function :tag "  Function"))
                            (list :tag "Current clocking task"
                                  (const :format "" clock))
                            (list :tag "Function"
                                  (const :format "" function)
-                                 (sexp :tag "  Function")))
+                                 (function :tag "  Function")))
                    (choice :tag "Template       "
                            (string)
                            (list :tag "File"
index 5555bb1bc3d13cc18aa6b3b310cde1ee90889e87..c6fd507b08b5f599365e600fc78197b969857ce1 100644 (file)
@@ -2048,28 +2048,31 @@ PROPNAME lets you set a custom text property instead of :org-clock-minutes."
            (cond
             ((and (eq element-type 'clock) (match-end 2))
              ;; Two time stamps.
-             (let* ((timestamp (org-element-property :value element))
-                    (ts (float-time
-                          (org-encode-time
-                           (list 0
-                                 (org-element-property :minute-start timestamp)
-                                 (org-element-property :hour-start timestamp)
-                                 (org-element-property :day-start timestamp)
-                                 (org-element-property :month-start timestamp)
-                                 (org-element-property :year-start timestamp)
-                                 nil -1 nil))))
-                    (te (float-time
-                          (org-encode-time
-                           (list 0
-                                 (org-element-property :minute-end timestamp)
-                                 (org-element-property :hour-end timestamp)
-                                 (org-element-property :day-end timestamp)
-                                 (org-element-property :month-end timestamp)
-                                 (org-element-property :year-end timestamp)
-                                 nil -1 nil))))
-                    (dt (- (if tend (min te tend) te)
-                           (if tstart (max ts tstart) ts))))
-               (when (> dt 0) (cl-incf t1 (floor dt 60)))))
+              (condition-case nil
+                 (let* ((timestamp (org-element-property :value element))
+                        (ts (float-time
+                              (org-encode-time
+                               (list 0
+                                     (org-element-property :minute-start timestamp)
+                                     (org-element-property :hour-start timestamp)
+                                     (org-element-property :day-start timestamp)
+                                     (org-element-property :month-start timestamp)
+                                     (org-element-property :year-start timestamp)
+                                     nil -1 nil))))
+                        (te (float-time
+                              (org-encode-time
+                               (list 0
+                                     (org-element-property :minute-end timestamp)
+                                     (org-element-property :hour-end timestamp)
+                                     (org-element-property :day-end timestamp)
+                                     (org-element-property :month-end timestamp)
+                                     (org-element-property :year-end timestamp)
+                                     nil -1 nil))))
+                        (dt (- (if tend (min te tend) te)
+                               (if tstart (max ts tstart) ts))))
+                   (when (> dt 0) (cl-incf t1 (floor dt 60))))
+                (error
+                 (org-display-warning (format "org-clock-sum: Ignoring invalid %s" (org-current-line-string))))))
             ((match-end 4)
              ;; A naked time.
              (setq t1 (+ t1 (string-to-number (match-string 5))
index d6620f9627f6fc840c25d226ff943846db67255d..41c26ad72fe8fa52a526519cd54f53aff52d6a9b 100644 (file)
@@ -251,6 +251,17 @@ removed."
                     default)))
      ": ")))
 
+(if (fboundp 'list-of-strings-p)
+    (defalias 'org-list-of-strings-p #'list-of-strings-p)
+  ;; From Emacs subr.el.
+;;;###autoload
+  (defun org-list-of-strings-p (object)
+    "Return t if OBJECT is nil or a list of strings."
+    (declare (pure t) (side-effect-free error-free))
+    (while (and (consp object) (stringp (car object)))
+      (setq object (cdr object)))
+    (null object)))
+
 \f
 ;;; Emacs < 27.1 compatibility
 
index b15f0b69d988a50446a4fa42967a06f620f65fe5..191bb5698d138e30e6d9add877d6ef8e536cbf84 100644 (file)
@@ -1188,7 +1188,7 @@ parse properties for property drawer at point."
                    (property-name-symbol (intern property-name))
                    (property-value
                     (org-element-deferred-create
-                     nil #'org-element--substring
+                     t #'org-element--substring
                      (- (match-beginning 3) begin)
                      (- (match-end 3) begin))))
               (cond
@@ -1355,7 +1355,7 @@ Throw `:org-element-deferred-retry' signal at the end."
             (title-end (point))
             (raw-value
               (org-element-deferred-create
-               nil #'org-element--headline-raw-value
+               t #'org-element--headline-raw-value
                (- title-start begin) (- title-end begin))))
         (org-element-put-property headline :raw-value raw-value)
         (org-element-put-property headline :level level)
@@ -1386,12 +1386,12 @@ Throw `:org-element-deferred-retry' signal at the end."
 
 (defconst org-element--headline-parse-title-raw
   (org-element-deferred-create
-   nil #'org-element--headline-parse-title t)
+   t #'org-element--headline-parse-title t)
   "Constant holding deferred value for raw headline `:title' property.")
 
 (defconst org-element--headline-parse-title-parse
   (org-element-deferred-create
-   nil #'org-element--headline-parse-title nil)
+   t #'org-element--headline-parse-title nil)
   "Constant holding deferred value for parsed headline `:title' property.")
 
 (defconst org-element--headline-deferred
@@ -2414,7 +2414,7 @@ Assume point is at comment block beginning."
                             (if (eobp) (point) (line-beginning-position))))
                 (value
                   (org-element-deferred-create
-                   nil #'org-element--substring
+                   t #'org-element--substring
                    (- contents-begin begin)
                    (- contents-end begin))))
            (org-element-create
@@ -2532,7 +2532,7 @@ Return a new syntax node of `example-block' type containing `:begin',
                 (contents-begin (line-beginning-position 2))
                 (value
                   (org-element-deferred-create
-                   nil #'org-element--unescape-substring
+                   t #'org-element--unescape-substring
                    (- contents-begin begin)
                    (- contents-end begin)))
                 (pos-before-blank (progn (goto-char contents-end)
@@ -2612,7 +2612,7 @@ Assume point is at export-block beginning."
                           (if (eobp) (point) (line-beginning-position))))
               (value
                 (org-element-deferred-create
-                 nil #'org-element--unescape-substring
+                 t #'org-element--unescape-substring
                  (- contents-begin begin)
                  (- contents-end begin))))
          (org-element-create
@@ -2800,7 +2800,7 @@ Assume point is at the beginning of the latex environment."
               (begin (car affiliated))
               (value
                 (org-element-deferred-create
-                 nil #'org-element--substring
+                 t #'org-element--substring
                  (- code-begin begin)
                  (- code-end begin)))
               (end (progn (skip-chars-forward " \r\t\n" limit)
@@ -3059,7 +3059,7 @@ Assume point is at the beginning of the block."
                 ;; Retrieve code.
                 (value
                   (org-element-deferred-create
-                   nil #'org-element--unescape-substring
+                   t #'org-element--unescape-substring
                    (- (line-beginning-position 2) begin)
                    (- contents-end begin)))
                 (pos-before-blank (progn (goto-char contents-end)
@@ -3159,7 +3159,7 @@ Assume point is at the beginning of the table."
              :contents-end (and (eq type 'org) table-end)
              :value (and (eq type 'table.el)
                           (org-element-deferred-create
-                           nil #'org-element--substring
+                           t #'org-element--substring
                            (- table-begin begin)
                            (- table-end begin)))
              :post-blank (count-lines pos-before-blank end)
@@ -3322,7 +3322,7 @@ Assume point is at first MARK."
                         (list :value
                               (and (memq type '(code verbatim))
                                    (org-element-deferred-create
-                                    nil #'org-element--substring
+                                    t #'org-element--substring
                                     (- contents-begin origin)
                                     (- contents-end origin))))
                       (list :contents-begin contents-begin
@@ -3572,7 +3572,7 @@ Assume point is at the beginning of the snippet."
             (value
               (when contents-end
                 (org-element-deferred-create
-                 nil #'org-element--substring
+                 t #'org-element--substring
                  (- contents-begin begin)
                  (- contents-end begin))))
             (post-blank (skip-chars-forward " \t"))
@@ -3667,7 +3667,7 @@ Assume point is at the beginning of the babel call."
                       (replace-regexp-in-string "\n[ \t]*" " " (org-trim p)))))
               (value
                 (org-element-deferred-create
-                 nil #'org-element--substring
+                 t #'org-element--substring
                  0 (- (point) begin)))
               (post-blank (skip-chars-forward " \t"))
               (end (point)))
@@ -3801,7 +3801,7 @@ Assume point is at the beginning of the LaTeX fragment."
          'latex-fragment
         (list :value
                (org-element-deferred-create
-                nil #'org-element--substring
+                t #'org-element--substring
                 0 (- after-fragment begin))
               :begin begin
               :end end
index 664846a619c236a6f53c97491b476e641839345e..8372b86b08744acda51c91d52418f2cad5510cf0 100644 (file)
@@ -641,13 +641,14 @@ This function is mostly intended to be used in
 `clone-indirect-buffer-hook'."
   ;; Add current buffer to the list of indirect buffers in the base buffer.
   (when (buffer-base-buffer)
-    (with-current-buffer (buffer-base-buffer)
-      (setq-local org-fold-core--indirect-buffers
-                  (let (bufs)
-                    (org-fold-core-cycle-over-indirect-buffers
-                      (push (current-buffer) bufs))
-                    (push (current-buffer) bufs)
-                    (delete-dups bufs)))))
+    (let ((new-buffer (current-buffer)))
+      (with-current-buffer (buffer-base-buffer)
+        (setq-local org-fold-core--indirect-buffers
+                    (let (bufs)
+                      (org-fold-core-cycle-over-indirect-buffers
+                        (push (current-buffer) bufs))
+                      (push new-buffer bufs)
+                      (delete-dups bufs))))))
   (when (and (buffer-base-buffer)
              (eq org-fold-core-style 'text-properties)
              (not (memql 'ignore-indirect org-fold-core--optimise-for-huge-buffers)))
index aed774ee2ded1e9581e7e89fee282d913d1496cc..2d87ae270c4601ca7e59c984527cdbd1bd2ee10c 100644 (file)
@@ -388,14 +388,24 @@ called with one argument, the key used for comparison."
     (dolist (e originals reports) (funcall make-report (cdr e) (car e)))))
 
 (defun org-lint-misplaced-heading (ast)
-  "Check for accidentally misplaced heading lines."
+  "Check for accidentally misplaced heading lines.
+Example:
+** Heading 1
+** Heading 2** Oops heading 3
+** Heading 4"
   (org-with-point-at ast
     (goto-char (point-min))
     (let (result)
       ;; Heuristics for 2+ level heading not at bol.
       (while (re-search-forward (rx (not (any "*\n\r ,")) ;; Not a bol; not escaped ,** heading; not " *** words"
                                     "*" (1+ "*") " ") nil t)
-        (unless (org-at-block-p) ; Inside a block, where the chances to have heading a slim.
+        ;; Limit false-positive rate by only complaining about
+        ;; ** Heading** Heading and
+        ;; ** Oops heading
+        ;; Paragraph** Oops heading
+        (when (org-element-type-p
+               (org-element-at-point)
+               '(paragraph headline))
           (push (list (match-beginning 0) "Possibly misplaced heading line") result)))
       result)))
 
index aebfef050797cb1433e6a03e6f6bbec166853e1d..a8fcf33336105caae6b097c416ba07307e28a8f8 100644 (file)
@@ -144,7 +144,7 @@ control tag inheritance."
   :group 'org-appearance
   :package-version '(Org . "9.3")
   :type '(repeat (string :tag "Tag"))
-  :safe (lambda (val) (and (listp val) (cl-every #'stringp val))))
+  :safe #'org-list-of-strings-p)
 
 ;;;###autoload
 (defcustom org-num-skip-unnumbered nil
index c855c6604bac25dbc48d8b2b1dec8db7f623c535..52f4b0eef2776e821dcb786cbe3819c69cb0d159 100644 (file)
@@ -416,7 +416,7 @@ FORMAT and ARGS are passed to `message'."
 (defun org-persist--read-elisp-file (&optional buffer-or-file)
   "Read elisp data from BUFFER-OR-FILE or current buffer."
   (let (;; UTF-8 is explicitly used in `org-persist--write-elisp-file'.
-        (coding-system-for-read 'utf-8)
+        (coding-system-for-read 'emacs-internal)
         (buffer-or-file (or buffer-or-file (current-buffer))))
     (with-temp-buffer
       (if (bufferp buffer-or-file)
@@ -464,7 +464,7 @@ FORMAT and ARGS are passed to `message'."
   (let ((write-region-inhibit-fsync t)
         ;; We set UTF-8 here and in `org-persist--read-elisp-file'
         ;; to avoid the overhead from `find-auto-coding'.
-        (coding-system-for-write 'utf-8)
+        (coding-system-for-write 'emacs-internal)
         (print-circle (not no-circular))
         print-level
         print-length
index d152fbfe8b10c5109cdc482ca103336276906661..262bd462814f0d4bfa664c68a8d13aaa88ba4fd8 100644 (file)
@@ -241,8 +241,8 @@ but the mode to use is `tuareg-mode'."
   :package-version '(Org . "9.7")
   :type '(repeat
          (cons
-          (string "Language name")
-          (symbol "Major mode"))))
+          (string :tag "Language name")
+          (symbol :tag "Major mode"))))
 
 (defcustom org-src-block-faces nil
   "Alist of faces to be used for source-block.
index 37ce91570d2061f67c92f3af7dd537375769e2d9..4a2623b55388d0ec8b42f2bfb2a9656a3bffac32 100644 (file)
@@ -5477,14 +5477,16 @@ a radio table."
     (goto-char (org-table-begin))
     (let (rtn)
       (forward-line -1)
-      (while (looking-at "[ \t]*#\\+ORGTBL[: \t][ \t]*SEND[ \t]+\\([^ \t\r\n]+\\)[ \t]+\\([^ \t\r\n]+\\)\\([ \t]+.*\\)?")
-       (let ((name (org-no-properties (match-string 1)))
-             (transform (intern (match-string 2)))
-             (params (if (match-end 3)
-                         (read (concat "(" (match-string 3) ")")))))
-         (push (list :name name :transform transform :params params)
-               rtn)
-         (forward-line -1)))
+      (catch :bob
+        (while (looking-at "[ \t]*#\\+ORGTBL[: \t][ \t]*SEND[ \t]+\\([^ \t\r\n]+\\)[ \t]+\\([^ \t\r\n]+\\)\\([ \t]+.*\\)?")
+         (let ((name (org-no-properties (match-string 1)))
+               (transform (intern (match-string 2)))
+               (params (if (match-end 3)
+                           (read (concat "(" (match-string 3) ")")))))
+           (push (list :name name :transform transform :params params)
+                 rtn)
+            (when (bobp) (throw :bob nil))
+           (forward-line -1))))
       rtn)))
 
 (defun orgtbl-send-replace-tbl (name text)
index 4697e39a8ddba81af2671a66387abe9ac66feebc..6bef3101bbe23e81e9b68a48bfbb6c5d32e9e0b4 100644 (file)
@@ -5,13 +5,13 @@
 (defun org-release ()
   "The release version of Org.
 Inserted by installing Org mode or when a release is made."
-   (let ((org-release "9.7.3"))
+   (let ((org-release "9.7.4"))
      org-release))
 ;;;###autoload
 (defun org-git-version ()
   "The Git version of Org mode.
 Inserted by installing Org or when a release is made."
-   (let ((org-git-version "release_9.7.3"))
+   (let ((org-git-version "release_9.7.4-7-g165319"))
      org-git-version))
 \f
 (provide 'org-version)
index ff5b63212e08ea037b5de37e4ac16265fc0d05b0..2be404e368ee75ba71f031c2e3080831ea38c80b 100644 (file)
@@ -9,7 +9,7 @@
 ;; URL: https://orgmode.org
 ;; Package-Requires: ((emacs "26.1"))
 
-;; Version: 9.7.3
+;; Version: 9.7.4
 
 ;; This file is part of GNU Emacs.
 ;;
@@ -16981,10 +16981,11 @@ buffer boundaries with possible narrowing."
      (t nil))))
 
 (defun org-image--align (link)
-  "Determine the alignment of the image link.
+  "Determine the alignment of the image LINK.
+LINK is a link object.
 
 In decreasing order of priority, this is controlled:
-- Per image by the value of `:center' or ``:align' in the
+- Per image by the value of `:center' or `:align' in the
 affiliated keyword `#+attr_org'.
 - By the `#+attr_html' or `#+attr_latex` keywords with valid
   `:center' or `:align' values.
@@ -16998,15 +16999,16 @@ will cause it to be right-aligned.  A value of \"left\" or nil
 implies no special alignment."
   (let ((par (org-element-lineage link 'paragraph)))
     ;; Only align when image is not surrounded by paragraph text:
-    (when (and (= (org-element-begin link)
+    (when (and par ; when image is not in paragraph, but in table/headline/etc, do not align
+               (= (org-element-begin link)
                   (save-excursion
                     (goto-char (org-element-contents-begin par))
                     (skip-chars-forward "\t ")
                     (point)))           ;account for leading space
                                         ;before link
                (<= (- (org-element-contents-end par)
-                      (org-element-end link))
-                   1))                  ;account for trailing newline
+                     (org-element-end link))
+                  1))                  ;account for trailing newline
                                         ;at end of paragraph
       (save-match-data
         ;; Look for a valid ":center t" or ":align left|center|right"
@@ -20871,11 +20873,25 @@ When nil, use `org-attach-method'."
 (defvar org-attach-method)
 
 (defun org--dnd-rmc (prompt choices)
+  "Display a menu or dialog and select with PROMPT among CHOICES.
+PROMPT is the prompt string.  CHOICES is a list of choices.  Each
+choice is a list of (key description value).  VALUE from the selected
+choice is returned."
   (if (null (and
              ;; Emacs <=28 does not have `use-dialog-box-p'.
              (fboundp 'use-dialog-box-p)
              (use-dialog-box-p)))
-      (caddr (read-multiple-choice prompt choices))
+      (progn
+        (setq choices
+              (mapcar
+               (pcase-lambda (`(,key ,message ,val))
+                 ;; `read-multiple-choice' expects VAL to be a long
+                 ;; description of the choice - string or nil.  Move VAL
+                 ;; further, so that it is not seen by the extended
+                 ;; help in `read-multiple-choice'.
+                 (list key message nil val))
+               choices))
+        (nth 3 (read-multiple-choice prompt choices)))
     (setq choices
           (mapcar
            (pcase-lambda (`(_key ,message ,val))
@@ -20939,15 +20955,18 @@ SEPARATOR is the string to insert after each link."
                    ('private (or org-yank-dnd-default-attach-method
                                  org-attach-method)))))
     (if separatep
-        (funcall
-         (pcase method
-           ('cp #'copy-file)
-           ('mv #'rename-file)
-           ('ln #'add-name-to-file)
-           ('lns #'make-symbolic-link))
-         filename
-         (expand-file-name (file-name-nondirectory filename)
-                           org-yank-image-save-method))
+        (progn
+          (unless (file-directory-p org-yank-image-save-method)
+            (make-directory org-yank-image-save-method t))
+          (funcall
+           (pcase method
+             ('cp #'copy-file)
+             ('mv #'rename-file)
+             ('ln #'add-name-to-file)
+             ('lns #'make-symbolic-link))
+           filename
+           (expand-file-name (file-name-nondirectory filename)
+                             org-yank-image-save-method)))
       (org-attach-attach filename nil method))
     (insert
      (org-link-make-string
index 1c52ca2905e6c5afa086b47ded03b4770c4aab17..35bbf84a0ca4d3ff55d75489b43bd4fdd47f133e 100644 (file)
@@ -1398,8 +1398,7 @@ external parameters overriding Org default settings, but still
 inferior to file-local settings."
   ;; First install #+BIND variables since these must be set before
   ;; global options are read.
-  (dolist (pair (org-export--list-bound-variables))
-    (set (make-local-variable (car pair)) (nth 1 pair)))
+  (org-export--set-variables (org-export--list-bound-variables))
   ;; Get and prioritize export options...
   (org-combine-plists
    ;; ... from global variables...
@@ -2585,7 +2584,7 @@ Return the updated communication channel."
 (defun org-export--set-variables (variable-alist)
   "Set buffer-local variables according to VARIABLE-ALIST in current buffer."
   (pcase-dolist (`(,var . ,val) variable-alist)
-    (set (make-local-variable var) val)))
+    (set (make-local-variable var) (car val))))
 
 (cl-defun org-export-copy-buffer (&key to-buffer drop-visibility
                                        drop-narrowing drop-contents
@@ -6672,7 +6671,7 @@ and `org-export-to-file' for more specialized functions."
   (with-temp-message "Initializing asynchronous export process"
     (let ((copy-fun (org-element--generate-copy-script (current-buffer)))
           (temp-file (make-temp-file "org-export-process")))
-      (let ((coding-system-for-write 'utf-8-emacs-unix))
+      (let ((coding-system-for-write 'emacs-internal))
         (write-region
          ;; Null characters (from variable values) are inserted
          ;; within the file.  As a consequence, coding system for