From 3e02029642c2c4c329c95d1a1381ab4a83a606b5 Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Sat, 17 Dec 2022 17:18:40 -0500 Subject: [PATCH] Update to Org 9.6-49-g47d129 --- doc/misc/org.org | 13 ++- lisp/org/ob-R.el | 4 +- lisp/org/ob-octave.el | 2 +- lisp/org/org-element.el | 1 + lisp/org/org-persist.el | 252 +++++++++++++++++++++------------------- lisp/org/org-version.el | 2 +- lisp/org/org.el | 12 +- lisp/org/ox.el | 31 +++-- 8 files changed, 173 insertions(+), 144 deletions(-) diff --git a/doc/misc/org.org b/doc/misc/org.org index 0b926e3ceed..c6b8e73fd1b 100644 --- a/doc/misc/org.org +++ b/doc/misc/org.org @@ -20021,11 +20021,16 @@ changes. | =nofnadjust= | Do not renumber and sort automatically. | #+vindex: org-hide-block-startup - To hide blocks on startup, use these keywords. The - corresponding variable is ~org-hide-block-startup~. + #+vindex: org-hide-drawer-startup + To hide blocks or drawers on startup, use these keywords. The + corresponding variables are ~org-hide-block-startup~ and + ~org-hide-drawer-startup~. + + | =hideblocks= | Hide all begin/end blocks on startup. | + | =nohideblocks= | Do not hide blocks on startup. | + | =hidedrawers= | Hide all begin/end blocks on startup. | + | =nohidedrawers= | Do not hide blocks on startup. | - | =hideblocks= | Hide all begin/end blocks on startup. | - | =nohideblocks= | Do not hide blocks on startup. | #+vindex: org-pretty-entities The display of entities as UTF-8 characters is governed by the diff --git a/lisp/org/ob-R.el b/lisp/org/ob-R.el index f68b5b44e4d..b7f96a179a8 100644 --- a/lisp/org/ob-R.el +++ b/lisp/org/ob-R.el @@ -241,11 +241,11 @@ This function is called by `org-babel-execute-src-block'." (defun org-babel-R-assign-elisp (name value colnames-p rownames-p) "Construct R code assigning the elisp VALUE to a variable named NAME." (if (listp value) - (let* ((lengths (mapcar 'length (cl-remove-if-not 'sequencep value))) + (let* ((lengths (mapcar 'length (cl-remove-if-not 'listp value))) (max (if lengths (apply 'max lengths) 0)) (min (if lengths (apply 'min lengths) 0))) ;; Ensure VALUE has an orgtbl structure (depth of at least 2). - (unless (listp (car value)) (setq value (list value))) + (unless (listp (car value)) (setq value (mapcar 'list value))) (let ((file (orgtbl-to-tsv value '(:fmt org-babel-R-quote-tsv-field))) (header (if (or (eq (nth 1 value) 'hline) colnames-p) "TRUE" "FALSE")) diff --git a/lisp/org/ob-octave.el b/lisp/org/ob-octave.el index b0a7767ec3e..8953b675132 100644 --- a/lisp/org/ob-octave.el +++ b/lisp/org/ob-octave.el @@ -91,7 +91,7 @@ end") (list "set (0, \"defaultfigurevisible\", \"off\");" full-body - (format "print -dpng %s" gfx-file)) + (format "print -dpng %S\nans=%S" gfx-file gfx-file)) "\n") full-body) result-type matlabp))) diff --git a/lisp/org/org-element.el b/lisp/org/org-element.el index 1f36775a7b5..71c242ea658 100644 --- a/lisp/org/org-element.el +++ b/lisp/org/org-element.el @@ -5295,6 +5295,7 @@ indentation removed from its contents." ;; `org-element--cache-diagnostics-ring-size', `org-element--cache-map-statistics', ;; `org-element--cache-map-statistics-threshold'. +;;;###autoload (defvar org-element-use-cache t "Non-nil when Org parser should cache its results.") diff --git a/lisp/org/org-persist.el b/lisp/org/org-persist.el index 9645dea7d9e..6ccf357784e 100644 --- a/lisp/org/org-persist.el +++ b/lisp/org/org-persist.el @@ -222,8 +222,11 @@ function will be called with a single argument - collection." (defconst org-persist-index-file "index" "File name used to store the data index.") -(defvar org-persist-disable-when-emacs-Q t - "Disable persistence when Emacs is called with -Q command line arg.") +(defvar org-persist--disable-when-emacs-Q t + "Disable persistence when Emacs is called with -Q command line arg. +When non-nil, this sets `org-persist-directory' to temporary directory. + +This variable must be set before loading org-persist library.") (defvar org-persist-before-write-hook nil "Abnormal hook ran before saving data. @@ -662,12 +665,13 @@ COLLECTION is the plist holding data collection." (file-copy (org-file-name-concat org-persist-directory (format "%s-%s.%s" persist-file (md5 path) ext)))) - (unless (file-exists-p (file-name-directory file-copy)) - (make-directory (file-name-directory file-copy) t)) - (if (org--should-fetch-remote-resource-p path) - (url-copy-file path file-copy 'overwrite) - (error "The remote resource %S is considered unsafe, and will not be downloaded." - path)) + (unless (file-exists-p file-copy) + (unless (file-exists-p (file-name-directory file-copy)) + (make-directory (file-name-directory file-copy) t)) + (if (org--should-fetch-remote-resource-p path) + (url-copy-file path file-copy 'overwrite) + (error "The remote resource %S is considered unsafe, and will not be downloaded." + path))) (format "%s-%s.%s" persist-file (md5 path) ext))))) (defun org-persist-write:index (container _) @@ -771,43 +775,39 @@ ASSOCIATED can be a plist, a buffer, or a string. A buffer is treated as (:buffer ASSOCIATED). A string is treated as (:file ASSOCIATED). When LOAD? is non-nil, load the data instead of reading." + (unless org-persist--index (org-persist--load-index)) (setq associated (org-persist--normalize-associated associated)) (setq container (org-persist--normalize-container container)) - (unless (and org-persist-disable-when-emacs-Q - ;; FIXME: This is relying on undocumented fact that - ;; Emacs sets `user-init-file' to nil when loaded with - ;; "-Q" argument. - (not user-init-file)) - (let* ((collection (org-persist--find-index `(:container ,container :associated ,associated))) - (persist-file - (when collection - (org-file-name-concat - org-persist-directory - (plist-get collection :persist-file)))) - (data nil)) - (when (and collection - (file-exists-p persist-file) - (or (not (plist-get collection :expiry)) ; current session - (not (org-persist--gc-expired-p - (plist-get collection :expiry) collection))) - (or (not hash-must-match) - (and (plist-get associated :hash) - (equal (plist-get associated :hash) - (plist-get (plist-get collection :associated) :hash))))) - (unless (seq-find (lambda (v) - (run-hook-with-args-until-success 'org-persist-before-read-hook v associated)) - (plist-get collection :container)) - (setq data (or (gethash persist-file org-persist--write-cache) - (org-persist--read-elisp-file persist-file))) - (when data - (cl-loop for container in (plist-get collection :container) - with result = nil - do - (if load? - (push (org-persist-load:generic container (alist-get container data nil nil #'equal) collection) result) - (push (org-persist-read:generic container (alist-get container data nil nil #'equal) collection) result)) - (run-hook-with-args 'org-persist-after-read-hook container associated) - finally return (if (= 1 (length result)) (car result) result)))))))) + (let* ((collection (org-persist--find-index `(:container ,container :associated ,associated))) + (persist-file + (when collection + (org-file-name-concat + org-persist-directory + (plist-get collection :persist-file)))) + (data nil)) + (when (and collection + (file-exists-p persist-file) + (or (not (plist-get collection :expiry)) ; current session + (not (org-persist--gc-expired-p + (plist-get collection :expiry) collection))) + (or (not hash-must-match) + (and (plist-get associated :hash) + (equal (plist-get associated :hash) + (plist-get (plist-get collection :associated) :hash))))) + (unless (seq-find (lambda (v) + (run-hook-with-args-until-success 'org-persist-before-read-hook v associated)) + (plist-get collection :container)) + (setq data (or (gethash persist-file org-persist--write-cache) + (org-persist--read-elisp-file persist-file))) + (when data + (cl-loop for container in (plist-get collection :container) + with result = nil + do + (if load? + (push (org-persist-load:generic container (alist-get container data nil nil #'equal) collection) result) + (push (org-persist-read:generic container (alist-get container data nil nil #'equal) collection) result)) + (run-hook-with-args 'org-persist-after-read-hook container associated) + finally return (if (= 1 (length result)) (car result) result))))))) (defun org-persist-load (container &optional associated hash-must-match) "Load CONTAINER data for ASSOCIATED. @@ -843,62 +843,66 @@ The return value is nil when writing fails and the written value (as returned by `org-persist-read') on success. When IGNORE-RETURN is non-nil, just return t on success without calling `org-persist-read'." - (unless (and org-persist-disable-when-emacs-Q - ;; FIXME: This is relying on undocumented fact that - ;; Emacs sets `user-init-file' to nil when loaded with - ;; "-Q" argument. - (not user-init-file)) - (setq associated (org-persist--normalize-associated associated)) - ;; Update hash - (when (and (plist-get associated :file) - (plist-get associated :hash) - (get-file-buffer (plist-get associated :file))) - (setq associated (org-persist--normalize-associated (get-file-buffer (plist-get associated :file))))) - (let ((collection (org-persist--get-collection container associated))) - (setf collection (plist-put collection :associated associated)) - (unless (or - ;; Prevent data leakage from encrypted files. - ;; We do it in somewhat paranoid manner and do not - ;; allow anything related to encrypted files to be - ;; written. - (and (plist-get associated :file) - (string-match-p epa-file-name-regexp (plist-get associated :file))) - (seq-find (lambda (v) - (run-hook-with-args-until-success 'org-persist-before-write-hook v associated)) - (plist-get collection :container))) - (when (or (file-exists-p org-persist-directory) (org-persist--save-index)) - (let ((file (org-file-name-concat org-persist-directory (plist-get collection :persist-file))) - (data (mapcar (lambda (c) (cons c (org-persist-write:generic c collection))) - (plist-get collection :container)))) - (puthash file data org-persist--write-cache) - (org-persist--write-elisp-file file data) - (or ignore-return (org-persist-read container associated)))))))) + (setq associated (org-persist--normalize-associated associated)) + ;; Update hash + (when (and (plist-get associated :file) + (plist-get associated :hash) + (get-file-buffer (plist-get associated :file))) + (setq associated (org-persist--normalize-associated (get-file-buffer (plist-get associated :file))))) + (let ((collection (org-persist--get-collection container associated))) + (setf collection (plist-put collection :associated associated)) + (unless (or + ;; Prevent data leakage from encrypted files. + ;; We do it in somewhat paranoid manner and do not + ;; allow anything related to encrypted files to be + ;; written. + (and (plist-get associated :file) + (string-match-p epa-file-name-regexp (plist-get associated :file))) + (seq-find (lambda (v) + (run-hook-with-args-until-success 'org-persist-before-write-hook v associated)) + (plist-get collection :container))) + (when (or (file-exists-p org-persist-directory) (org-persist--save-index)) + (let ((file (org-file-name-concat org-persist-directory (plist-get collection :persist-file))) + (data (mapcar (lambda (c) (cons c (org-persist-write:generic c collection))) + (plist-get collection :container)))) + (puthash file data org-persist--write-cache) + (org-persist--write-elisp-file file data) + (or ignore-return (org-persist-read container associated))))))) (defun org-persist-write-all (&optional associated) "Save all the persistent data. When ASSOCIATED is non-nil, only save the matching data." (unless org-persist--index (org-persist--load-index)) (setq associated (org-persist--normalize-associated associated)) - (let (all-containers) - (dolist (collection org-persist--index) - (if associated - (when collection - (cl-pushnew (plist-get collection :container) all-containers :test #'equal)) - (condition-case err - (org-persist-write (plist-get collection :container) (plist-get collection :associated) t) - (error - (message "%s. Deleting bad index entry." err) - (org-persist--remove-from-index collection) - nil)))) - (dolist (container all-containers) - (let ((collection (org-persist--find-index `(:container ,container :associated ,associated)))) - (when collection + (unless + (and (equal 1 (length org-persist--index)) + ;; The single collection only contains a single container + ;; in the container list. + (equal 1 (length (plist-get (car org-persist--index) :container))) + ;; The container is an `index' container. + (eq 'index (caar (plist-get (car org-persist--index) :container))) + ;; No `org-persist-directory' exists yet. + (not (file-exists-p org-persist-directory))) + (let (all-containers) + (dolist (collection org-persist--index) + (if associated + (when collection + (cl-pushnew (plist-get collection :container) all-containers :test #'equal)) (condition-case err - (org-persist-write container associated t) + (org-persist-write (plist-get collection :container) (plist-get collection :associated) t) (error (message "%s. Deleting bad index entry." err) (org-persist--remove-from-index collection) - nil))))))) + nil)))) + (dolist (container all-containers) + (let ((collection (org-persist--find-index `(:container ,container :associated ,associated)))) + (when collection + (condition-case err + (org-persist-write container associated t) + (error + (message "%s. Deleting bad index entry." err) + (org-persist--remove-from-index collection) + nil)))))))) (defun org-persist-write-all-buffer () "Call `org-persist-write-all' in current buffer. @@ -931,45 +935,40 @@ Do nothing in an indirect buffer." (defun org-persist-gc () "Remove expired or unregistered containers. Also, remove containers associated with non-existing files." - (unless (and org-persist-disable-when-emacs-Q - ;; FIXME: This is relying on undocumented fact that - ;; Emacs sets `user-init-file' to nil when loaded with - ;; "-Q" argument. - (not user-init-file)) - (let (new-index (remote-files-num 0)) - (dolist (collection org-persist--index) - (let* ((file (plist-get (plist-get collection :associated) :file)) - (file-remote (when file (file-remote-p file))) - (persist-file (when (plist-get collection :persist-file) - (org-file-name-concat - org-persist-directory - (plist-get collection :persist-file)))) - (expired? (org-persist--gc-expired-p - (plist-get collection :expiry) collection))) - (when persist-file - (when file - (when file-remote (cl-incf remote-files-num)) - (unless (if (not file-remote) - (file-exists-p file) - (pcase org-persist-remote-files - ('t t) - ('check-existence - (file-exists-p file)) - ((pred numberp) - (<= org-persist-remote-files remote-files-num)) - (_ nil))) - (setq expired? t))) - (if expired? - (org-persist--gc-persist-file persist-file) - (push collection new-index))))) - (setq org-persist--index (nreverse new-index))))) + (let (new-index (remote-files-num 0)) + (dolist (collection org-persist--index) + (let* ((file (plist-get (plist-get collection :associated) :file)) + (file-remote (when file (file-remote-p file))) + (persist-file (when (plist-get collection :persist-file) + (org-file-name-concat + org-persist-directory + (plist-get collection :persist-file)))) + (expired? (org-persist--gc-expired-p + (plist-get collection :expiry) collection))) + (when persist-file + (when file + (when file-remote (cl-incf remote-files-num)) + (unless (if (not file-remote) + (file-exists-p file) + (pcase org-persist-remote-files + ('t t) + ('check-existence + (file-exists-p file)) + ((pred numberp) + (<= org-persist-remote-files remote-files-num)) + (_ nil))) + (setq expired? t))) + (if expired? + (org-persist--gc-persist-file persist-file) + (push collection new-index))))) + (setq org-persist--index (nreverse new-index)))) ;; Automatically write the data, but only when we have write access. (let ((dir (directory-file-name (file-name-as-directory org-persist-directory)))) (while (and (not (file-exists-p dir)) (not (equal dir (setq dir (directory-file-name - (file-name-directory dir))))))) + (file-name-directory dir))))))) (if (not (file-writable-p dir)) (message "Missing write access rights to org-persist-directory: %S" org-persist-directory) @@ -978,6 +977,15 @@ Also, remove containers associated with non-existing files." ;; So we are adding the hook after `org-persist-write-all'. (add-hook 'kill-emacs-hook #'org-persist-gc))) +;; Point to temp directory when `org-persist--disable-when-emacs-Q' is set. +(if (and org-persist--disable-when-emacs-Q + ;; FIXME: This is relying on undocumented fact that + ;; Emacs sets `user-init-file' to nil when loaded with + ;; "-Q" argument. + (not user-init-file)) + (setq org-persist-directory + (make-temp-file "org-persist-" 'dir))) + (add-hook 'after-init-hook #'org-persist-load-all) (provide 'org-persist) diff --git a/lisp/org/org-version.el b/lisp/org/org-version.el index b9f8d5d66e7..8de0d1a4a97 100644 --- a/lisp/org/org-version.el +++ b/lisp/org/org-version.el @@ -11,7 +11,7 @@ Inserted by installing Org mode or when a release is made." (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.6-31-g954a95")) + (let ((org-git-version "release_9.6-49-g47d129")) org-git-version)) (provide 'org-version) diff --git a/lisp/org/org.el b/lisp/org/org.el index 19f94c5e232..6aa2a16219d 100644 --- a/lisp/org/org.el +++ b/lisp/org/org.el @@ -102,6 +102,7 @@ (require 'org-cycle) (defvaralias 'org-hide-block-startup 'org-cycle-hide-block-startup) +(defvaralias 'org-hide-drawer-startup 'org-cycle-hide-drawer-startup) (defvaralias 'org-pre-cycle-hook 'org-cycle-pre-hook) (defvaralias 'org-tab-first-hook 'org-cycle-tab-first-hook) (defalias 'org-global-cycle #'org-cycle-global) @@ -4596,8 +4597,8 @@ is available. This option applies only if FILE is a URL." This checks every pattern in `org-safe-remote-resources', and returns non-nil if any of them match." (let ((uri-patterns org-safe-remote-resources) - (file-uri (and buffer-file-name - (concat "file://" (file-truename buffer-file-name)))) + (file-uri (and (buffer-file-name (buffer-base-buffer)) + (concat "file://" (file-truename (buffer-file-name (buffer-base-buffer)))))) match-p) (while (and (not match-p) uri-patterns) (setq match-p (or (string-match-p (car uri-patterns) uri) @@ -4608,7 +4609,8 @@ returns non-nil if any of them match." (defun org--confirm-resource-safe (uri) "Ask the user if URI should be considered safe, returning non-nil if so." (unless noninteractive - (let ((current-file (and buffer-file-name (file-truename buffer-file-name))) + (let ((current-file (and (buffer-file-name (buffer-base-buffer)) + (file-truename (buffer-file-name (buffer-base-buffer))))) (domain (and (string-match (rx (seq "http" (? "s") "://") (optional (+ (not (any "@/\n"))) "@") @@ -16399,6 +16401,10 @@ buffer boundaries with possible narrowing." "Remove inline-display overlay if a corresponding region is modified." (when (and ov after) (delete ov org-inline-image-overlays) + ;; Clear image from cache to avoid image not updating upon + ;; changing on disk. See Emacs bug#59902. + (when (overlay-get ov 'org-image-overlay) + (image-flush (overlay-get ov 'display))) (delete-overlay ov))) (defun org-remove-inline-images (&optional beg end) diff --git a/lisp/org/ox.el b/lisp/org/ox.el index aed669ee87d..737703f11d3 100644 --- a/lisp/org/ox.el +++ b/lisp/org/ox.el @@ -4612,12 +4612,17 @@ If LINK refers to a remote resource, modify it to point to a local downloaded copy. Otherwise, return unchanged LINK." (when (org-export-link-remote-p link) (let* ((local-path (org-export-link--remote-local-copy link))) - (setcdr link - (thread-first (cadr link) - (plist-put :type "file") - (plist-put :path local-path) - (plist-put :raw-link (concat "file:" local-path)) - list)))) + (if local-path + (setcdr link + (thread-first (cadr link) + (plist-put :type "file") + (plist-put :path local-path) + (plist-put :raw-link (concat "file:" local-path)) + list)) + (display-warning + '(org export) + (format "unable to obtain local copy of %s" + (org-element-property :raw-link link)))))) link) ;;;; For References @@ -4753,23 +4758,27 @@ objects of the same type." (let ((counter 0)) ;; Increment counter until ELEMENT is found again. (org-element-map (plist-get info :parse-tree) - (or types (org-element-type element)) + (or (and types (cons (org-element-type element) types)) + (org-element-type element)) (lambda (el) (let ((cached (org-element-property :org-export--counter el))) (cond ((eq element el) (1+ counter)) ;; Use cached result. - ((and cached (equal predicate (car cached))) - (cdr cached)) + ((and cached + (equal predicate (car cached)) + (equal types (cadr cached))) + (setq counter (nth 2 cached)) + nil) ((not predicate) (cl-incf counter) (org-element-put-property - el :org-export--counter (cons predicate counter)) + el :org-export--counter (list predicate types counter)) nil) ((funcall predicate el info) (cl-incf counter) (org-element-put-property - el :org-export--counter (cons predicate counter)) + el :org-export--counter (list predicate types counter)) nil)))) info 'first-match))))) -- 2.39.2