* [QUESTION] How to specific image size attributes under headline scope? @ 2021-11-22 6:34 Christopher M. Miles 2021-11-22 18:31 ` Timothy ` (3 more replies) 0 siblings, 4 replies; 43+ messages in thread From: Christopher M. Miles @ 2021-11-22 6:34 UTC (permalink / raw) To: Org Mode [-- Attachment #1: Type: text/plain, Size: 749 bytes --] There is attributes setting above image link to specify image inline preview size. Like this: #+begin_src org ,#+ATTR_ORG: :width 500 ,#+ATTR_LATEX: :width 5.0in ,#+ATTR_HTML: :width 500px [[file:kk/88320740_p0.jpg]] #+end_src When I put it on beginning of org document, then preview inline images, but those global attributes not affected. The inline images still display in actual image size. I want to specify image size under headline properties. Is it possible to do this? -- [ stardiviner ] I try to make every word tell the meaning that I want to express. Blog: https://stardiviner.github.io/ IRC(freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 488 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [QUESTION] How to specific image size attributes under headline scope? 2021-11-22 6:34 [QUESTION] How to specific image size attributes under headline scope? Christopher M. Miles @ 2021-11-22 18:31 ` Timothy 2022-08-18 12:44 ` Christopher M. Miles [not found] ` <m2o7whra7j.fsf@numbchild> 2022-09-11 2:20 ` [SOLVED] " Christopher M. Miles ` (2 subsequent siblings) 3 siblings, 2 replies; 43+ messages in thread From: Timothy @ 2021-11-22 18:31 UTC (permalink / raw) To: numbchild; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 283 bytes --] Hi Christopher, > I want to specify image size under headline properties. Is it possible to do > this? As I understand org.el, this is solely governed by `org-display-inline-image--width', which only looks at `#+attr_*' keywords when setting an image width. All the best, Timothy ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [QUESTION] How to specific image size attributes under headline scope? 2021-11-22 18:31 ` Timothy @ 2022-08-18 12:44 ` Christopher M. Miles [not found] ` <m2o7whra7j.fsf@numbchild> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-08-18 12:44 UTC (permalink / raw) To: Timothy; +Cc: numbchild, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 749 bytes --] Timothy <tecosaur@gmail.com> writes: > Hi Christopher, > >> I want to specify image size under headline properties. Is it possible to do >> this? > > As I understand org.el, this is solely governed by > `org-display-inline-image--width', which only looks at `#+attr_*' keywords when > setting an image width. > > All the best, > Timothy Yes, what about letting org-mode support headline level image size specification? Is this a good idea and easy to implement? -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
[parent not found: <m2o7whra7j.fsf@numbchild>]
* Re: [QUESTION] How to specific image size attributes under headline scope? [not found] ` <m2o7whra7j.fsf@numbchild> @ 2022-08-22 17:10 ` Timothy 2022-08-23 0:24 ` Christopher M. Miles 0 siblings, 1 reply; 43+ messages in thread From: Timothy @ 2022-08-22 17:10 UTC (permalink / raw) To: numbchild; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 656 bytes --] Hi Christopher, >>> I want to specify image size under headline properties. Is it possible to do >>> this? >> >> As I understand org.el, this is solely governed by >> `org-display-inline-image–width’, which only looks at `#+attr_*’ keywords when >> setting an image width. >> >> All the best, >> Timothy > > Yes, what about letting org-mode support headline level image size specification? > Is this a good idea and easy to implement? Hmm, so would this basically be setting all images within a certain section to inherit a different `org-image-actual-width' / `org-latex-image-default-width' parameter? All the best, Timothy ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [QUESTION] How to specific image size attributes under headline scope? 2022-08-22 17:10 ` Timothy @ 2022-08-23 0:24 ` Christopher M. Miles 0 siblings, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-08-23 0:24 UTC (permalink / raw) To: Timothy; +Cc: numbchild, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 1825 bytes --] Timothy <orgmode@tec.tecosaur.net> writes: > Hi Christopher, > >>>> I want to specify image size under headline properties. Is it possible to do >>>> this? >>> >>> As I understand org.el, this is solely governed by >>> `org-display-inline-image–width’, which only looks at `#+attr_*’ keywords when >>> setting an image width. >>> >>> All the best, >>> Timothy >> >> Yes, what about letting org-mode support headline level image size specification? >> Is this a good idea and easy to implement? > > Hmm, so would this basically be setting all images within a certain section to > inherit a different `org-image-actual-width' / `org-latex-image-default-width' > parameter? > > All the best, > Timothy Yes, like this: #+begin_src org ,* headline 1 This image will be displayed in 200 width. ,#+ATTR_ORG: :width 200 ,#+ATTR_LATEX: :width 2.0in ,#+ATTR_HTML: :width 200px [[file:kk.png]] This image will be displayed in 600 width, it has no manually specified image size, it will use ~org-image-actual-width~. [[file:kk.png]] ,** headline 2 :PROPERTIES: :IMAGE-WIDTH: 500 :END: This image will be displayed in 200 width. ,#+ATTR_ORG: :width 200 ,#+ATTR_LATEX: :width 2.0in ,#+ATTR_HTML: :width 200px [[file:kk.png]] This image will be displayed in 500 width, it has no manually specified image size, it will use "headline 2" scope property ":IMAGE-WIDTH: 500". This is what I want. (I assume there is a new property which maybe named like :IMAGE-WIDTH:.) [[file:kk.png]] #+end_src -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
* [SOLVED] Re: [QUESTION] How to specific image size attributes under headline scope? 2021-11-22 6:34 [QUESTION] How to specific image size attributes under headline scope? Christopher M. Miles 2021-11-22 18:31 ` Timothy @ 2022-09-11 2:20 ` Christopher M. Miles 2022-09-11 2:25 ` Christopher M. Miles [not found] ` <631d472b.c80a0220.2b4b2.bf86SMTPIN_ADDED_BROKEN@mx.google.com> 3 siblings, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-11 2:20 UTC (permalink / raw) Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 3664 bytes --] "Christopher M. Miles" <numbchild@gmail.com> writes: > [[PGP Signed Part:Undecided]] > There is attributes setting above image link to specify image inline preview size. Like this: > > #+begin_src org > ,#+ATTR_ORG: :width 500 > ,#+ATTR_LATEX: :width 5.0in > ,#+ATTR_HTML: :width 500px > [[file:kk/88320740_p0.jpg]] > > #+end_src > > When I put it on beginning of org document, then preview inline images, but those global attributes > not affected. The inline images still display in actual image size. I want to specify image size > under headline properties. Is it possible to do this? I implemented this feature by written a hook. Hope this can be helpful for someone who also has this needs. Here is the code: #+begin_src emacs-lisp ;;; auto display inline images under current TAB cycle expanded "visible" subtree. (defun org-display-subtree-with-inline-images (&optional state) "Toggle the display of inline images under current expanded visible subtree. INCLUDE-LINKED is passed to `org-display-inline-images'." (interactive) ;; (not (memq state '(overview folded contents))) ; global state change (let ((display-inline-images-local (lambda (beg end) (org-display-inline-images t t beg end) ;; display number of inline images which is intersection of two image overlays lists. ;; (message "%d images displayed inline" ;; (length (cl-intersection org-inline-image-overlays (overlays-in beg end)))) )) (hide-inline-images-local (lambda () (setq org-inline-image-overlays nil) ; (org-remove-inline-images) (message "Inline image display turned off"))) (inline-image-width-override ; get headline property value as inline image width. (lambda () ;; The property "INLINE-IMAGE-WIDTH" value should be integer. (let* ((property-value (ignore-errors (org-property-or-variable-value 'INLINE-IMAGE-WIDTH))) (width-integer (or (and property-value (if (numberp property-value) property-value (string-to-number property-value))) (- (/ (window-width (selected-window) t) 2) 100)))) (setq-local org-image-actual-width width-integer))))) (pcase state ('children (save-excursion (save-restriction (org-narrow-to-subtree) ;; If has nested headlines, beg,end only from parent headline ;; to first child headline which reference to upper let-binding ;; `org-next-visible-heading'. (funcall display-inline-images-local (point-min) (progn (org-next-visible-heading 1) (point)))))) ('subtree (save-excursion (save-restriction (org-narrow-to-subtree) (funcall inline-image-width-override) ;; If has nested headlines, also inline display images under all sub-headlines. (funcall display-inline-images-local (point-min) (point-max))))) ('folded (funcall hide-inline-images-local))))) (add-to-list 'org-default-properties "INLINE-IMAGE-WIDTH") (add-hook 'org-cycle-hook #'org-display-subtree-with-inline-images) (define-key org-mode-map (kbd "C-c C-x C-v") 'org-display-subtree-with-inline-images) #+end_src -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
* [SOLVED] Re: [QUESTION] How to specific image size attributes under headline scope? 2021-11-22 6:34 [QUESTION] How to specific image size attributes under headline scope? Christopher M. Miles 2021-11-22 18:31 ` Timothy 2022-09-11 2:20 ` [SOLVED] " Christopher M. Miles @ 2022-09-11 2:25 ` Christopher M. Miles [not found] ` <631d472b.c80a0220.2b4b2.bf86SMTPIN_ADDED_BROKEN@mx.google.com> 3 siblings, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-11 2:25 UTC (permalink / raw) Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 3664 bytes --] "Christopher M. Miles" <numbchild@gmail.com> writes: > [[PGP Signed Part:Undecided]] > There is attributes setting above image link to specify image inline preview size. Like this: > > #+begin_src org > ,#+ATTR_ORG: :width 500 > ,#+ATTR_LATEX: :width 5.0in > ,#+ATTR_HTML: :width 500px > [[file:kk/88320740_p0.jpg]] > > #+end_src > > When I put it on beginning of org document, then preview inline images, but those global attributes > not affected. The inline images still display in actual image size. I want to specify image size > under headline properties. Is it possible to do this? I implemented this feature by written a hook. Hope this can be helpful for someone who also has this needs. Here is the code: #+begin_src emacs-lisp ;;; auto display inline images under current TAB cycle expanded "visible" subtree. (defun org-display-subtree-with-inline-images (&optional state) "Toggle the display of inline images under current expanded visible subtree. INCLUDE-LINKED is passed to `org-display-inline-images'." (interactive) ;; (not (memq state '(overview folded contents))) ; global state change (let ((display-inline-images-local (lambda (beg end) (org-display-inline-images t t beg end) ;; display number of inline images which is intersection of two image overlays lists. ;; (message "%d images displayed inline" ;; (length (cl-intersection org-inline-image-overlays (overlays-in beg end)))) )) (hide-inline-images-local (lambda () (setq org-inline-image-overlays nil) ; (org-remove-inline-images) (message "Inline image display turned off"))) (inline-image-width-override ; get headline property value as inline image width. (lambda () ;; The property "INLINE-IMAGE-WIDTH" value should be integer. (let* ((property-value (ignore-errors (org-property-or-variable-value 'INLINE-IMAGE-WIDTH))) (width-integer (or (and property-value (if (numberp property-value) property-value (string-to-number property-value))) (- (/ (window-width (selected-window) t) 2) 100)))) (setq-local org-image-actual-width width-integer))))) (pcase state ('children (save-excursion (save-restriction (org-narrow-to-subtree) ;; If has nested headlines, beg,end only from parent headline ;; to first child headline which reference to upper let-binding ;; `org-next-visible-heading'. (funcall display-inline-images-local (point-min) (progn (org-next-visible-heading 1) (point)))))) ('subtree (save-excursion (save-restriction (org-narrow-to-subtree) (funcall inline-image-width-override) ;; If has nested headlines, also inline display images under all sub-headlines. (funcall display-inline-images-local (point-min) (point-max))))) ('folded (funcall hide-inline-images-local))))) (add-to-list 'org-default-properties "INLINE-IMAGE-WIDTH") (add-hook 'org-cycle-hook #'org-display-subtree-with-inline-images) (define-key org-mode-map (kbd "C-c C-x C-v") 'org-display-subtree-with-inline-images) #+end_src -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
[parent not found: <631d472b.c80a0220.2b4b2.bf86SMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [SOLVED] Re: [QUESTION] How to specific image size attributes under headline scope? [not found] ` <631d472b.c80a0220.2b4b2.bf86SMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-09-11 12:34 ` Ihor Radchenko 2022-09-12 1:54 ` [PATCH] " Christopher M. Miles ` (3 more replies) 0 siblings, 4 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-09-11 12:34 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: >> When I put it on beginning of org document, then preview inline images, but those global attributes >> not affected. The inline images still display in actual image size. I want to specify image size >> under headline properties. Is it possible to do this? > > I implemented this feature by written a hook. Hope this can be helpful > for someone who also has this needs. Here is the code: This looks useful. Would you be interested to write a patch? -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 43+ messages in thread
* [PATCH] Re: [SOLVED] Re: [QUESTION] How to specific image size attributes under headline scope? 2022-09-11 12:34 ` Ihor Radchenko @ 2022-09-12 1:54 ` Christopher M. Miles 2022-09-12 1:59 ` [PATCH] New: auto display inline images under subtree when `org-cycle' Christopher M. Miles ` (2 subsequent siblings) 3 siblings, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-12 1:54 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 569 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >>> When I put it on beginning of org document, then preview inline images, but those global attributes >>> not affected. The inline images still display in actual image size. I want to specify image size >>> under headline properties. Is it possible to do this? >> >> I implemented this feature by written a hook. Hope this can be helpful >> for someone who also has this needs. Here is the code: > > This looks useful. > Would you be interested to write a patch? [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Add-hook-function-to-auto-display-inline-imag.patch --] [-- Type: text/x-patch, Size: 4279 bytes --] From 2ba9c048dd2609eb22a3924dd15f041b648ef859 Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Mon, 12 Sep 2022 09:45:09 +0800 Subject: [PATCH] org.el: Add hook function to auto display inline images of subtree * lisp/org.el (org-display-subtree-with-inline-images): Add an option and hook function to auto display of inline images under current expanded visible subtree. --- lisp/org.el | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/lisp/org.el b/lisp/org.el index 6e6c437d5..594006551 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -1108,6 +1108,14 @@ the following lines anywhere in the buffer: :version "24.1" :type 'boolean) +(defcustom org-cycle-display-inline-images nil + "Non-nil means show inline images when `org-cycle'. +When this is t, org-mode will add function +`org-display-subtree-with-inline-images' on hook `org-cycle-hook'." + :group 'org-startup + :version "24.1" + :type 'boolean) + (defcustom org-startup-with-latex-preview nil "Non-nil means preview LaTeX fragments when loading a new Org file. @@ -16284,6 +16292,57 @@ buffer boundaries with possible narrowing." (mapc #'delete-overlay org-inline-image-overlays) (setq org-inline-image-overlays nil)) +(defun org-display-subtree-with-inline-images (&optional state) + "Toggle the display of inline images under current expanded visible subtree. +This hook function will auto display or hide inline images after `org-cycle'. +It is used to hook on `org-cycle-hook'. +The function behavior is controlled by `org-cycle-display-inline-images'." + (interactive) + ;; (not (memq state '(overview folded contents))) ; global state change + (when org-cycle-display-inline-images + (let ((display-inline-images-local + (lambda (beg end) + (org-display-inline-images t t beg end) + ;; display number of inline images which is intersection of two image overlays lists. + ;; (message "%d images displayed inline" + ;; (length (cl-intersection org-inline-image-overlays (overlays-in beg end)))) + )) + (hide-inline-images-local + (lambda () + (setq org-inline-image-overlays nil) ; (org-remove-inline-images) + (message "Inline image display turned off"))) + (inline-image-width-override ; get headline property value as inline image width. + (lambda () + ;; The property "INLINE-IMAGE-WIDTH" value should be integer. Reference `org-display-inline-image--width'. + (let* ((property-value (ignore-errors (org-property-or-variable-value 'INLINE-IMAGE-WIDTH))) + (width-integer (or (and property-value + (if (numberp property-value) property-value (string-to-number property-value))) + (- (/ (window-width (selected-window) t) 2) 100)))) + (setq-local org-image-actual-width width-integer))))) + (pcase state + ('children + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headline + ;; to first child headline which reference to upper let-binding + ;; `org-next-visible-heading'. + (funcall display-inline-images-local (point-min) (progn (org-next-visible-heading 1) (point)))))) + ('subtree + (save-excursion + (save-restriction + (org-narrow-to-subtree) + (funcall inline-image-width-override) + ;; If has nested headlines, also inline display images under all sub-headlines. + (funcall display-inline-images-local (point-min) (point-max))))) + ('folded + (funcall hide-inline-images-local)) + ('nil (funcall 'org-toggle-inline-images)))))) + +(add-hook 'org-cycle-hook #'org-display-subtree-with-inline-images) + +(add-to-list 'org-default-properties "INLINE-IMAGE-WIDTH") + (defvar org-self-insert-command-undo-counter 0) (defvar org-speed-command nil) -- 2.37.2 [-- Attachment #1.3: Type: text/plain, Size: 267 bytes --] -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH] New: auto display inline images under subtree when `org-cycle'. 2022-09-11 12:34 ` Ihor Radchenko 2022-09-12 1:54 ` [PATCH] " Christopher M. Miles @ 2022-09-12 1:59 ` Christopher M. Miles [not found] ` <m2wna9bbc2.fsf@numbchild> [not found] ` <631e92ee.050a0220.f9c18.92f5SMTPIN_ADDED_BROKEN@mx.google.com> 3 siblings, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-12 1:59 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 663 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >>> When I put it on beginning of org document, then preview inline images, but those global attributes >>> not affected. The inline images still display in actual image size. I want to specify image size >>> under headline properties. Is it possible to do this? >> >> I implemented this feature by written a hook. Hope this can be helpful >> for someone who also has this needs. Here is the code: > > This looks useful. > Would you be interested to write a patch? The is the new patch which updated the defcustom variable docstring has correct description. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Add-hook-function-to-auto-display-inline-imag.patch --] [-- Type: text/x-patch, Size: 4271 bytes --] From 4f66d9d10de5593b863da605ddc375d8f2e06456 Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Mon, 12 Sep 2022 09:45:09 +0800 Subject: [PATCH] org.el: Add hook function to auto display inline images of subtree * lisp/org.el (org-display-subtree-with-inline-images): Add an option and hook function to auto display of inline images under current expanded visible subtree. --- lisp/org.el | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/lisp/org.el b/lisp/org.el index 6e6c437d5..92086704e 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -1108,6 +1108,13 @@ the following lines anywhere in the buffer: :version "24.1" :type 'boolean) +(defcustom org-cycle-display-inline-images nil + "Non-nil means auto display inline images under subtree when `org-cycle' +by the function `org-display-subtree-with-inline-images' on hook `org-cycle-hook'." + :group 'org-startup + :version "24.1" + :type 'boolean) + (defcustom org-startup-with-latex-preview nil "Non-nil means preview LaTeX fragments when loading a new Org file. @@ -16284,6 +16291,57 @@ buffer boundaries with possible narrowing." (mapc #'delete-overlay org-inline-image-overlays) (setq org-inline-image-overlays nil)) +(defun org-display-subtree-with-inline-images (&optional state) + "Toggle the display of inline images under current expanded visible subtree. +This hook function will auto display or hide inline images after `org-cycle'. +It is used to hook on `org-cycle-hook'. +The function behavior is controlled by `org-cycle-display-inline-images'." + (interactive) + ;; (not (memq state '(overview folded contents))) ; global state change + (when org-cycle-display-inline-images + (let ((display-inline-images-local + (lambda (beg end) + (org-display-inline-images t t beg end) + ;; display number of inline images which is intersection of two image overlays lists. + ;; (message "%d images displayed inline" + ;; (length (cl-intersection org-inline-image-overlays (overlays-in beg end)))) + )) + (hide-inline-images-local + (lambda () + (setq org-inline-image-overlays nil) ; (org-remove-inline-images) + (message "Inline image display turned off"))) + (inline-image-width-override ; get headline property value as inline image width. + (lambda () + ;; The property "INLINE-IMAGE-WIDTH" value should be integer. Reference `org-display-inline-image--width'. + (let* ((property-value (ignore-errors (org-property-or-variable-value 'INLINE-IMAGE-WIDTH))) + (width-integer (or (and property-value + (if (numberp property-value) property-value (string-to-number property-value))) + (- (/ (window-width (selected-window) t) 2) 100)))) + (setq-local org-image-actual-width width-integer))))) + (pcase state + ('children + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headline + ;; to first child headline which reference to upper let-binding + ;; `org-next-visible-heading'. + (funcall display-inline-images-local (point-min) (progn (org-next-visible-heading 1) (point)))))) + ('subtree + (save-excursion + (save-restriction + (org-narrow-to-subtree) + (funcall inline-image-width-override) + ;; If has nested headlines, also inline display images under all sub-headlines. + (funcall display-inline-images-local (point-min) (point-max))))) + ('folded + (funcall hide-inline-images-local)) + ('nil (funcall 'org-toggle-inline-images)))))) + +(add-hook 'org-cycle-hook #'org-display-subtree-with-inline-images) + +(add-to-list 'org-default-properties "INLINE-IMAGE-WIDTH") + (defvar org-self-insert-command-undo-counter 0) (defvar org-speed-command nil) -- 2.37.2 [-- Attachment #1.3: Type: text/plain, Size: 267 bytes --] -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
[parent not found: <m2wna9bbc2.fsf@numbchild>]
* [ISSUE] Re: [PATCH] New: auto display inline images under subtree when `org-cycle'. [not found] ` <m2wna9bbc2.fsf@numbchild> @ 2022-09-12 6:03 ` Christopher M. Miles 0 siblings, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-12 6:03 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 1554 bytes --] "Christopher M. Miles" <numbchild@gmail.com> writes: > [[PGP Signed Part:Undecided]] > > Ihor Radchenko <yantar92@gmail.com> writes: > >> "Christopher M. Miles" <numbchild@gmail.com> writes: >> >>>> When I put it on beginning of org document, then preview inline images, but those global attributes >>>> not affected. The inline images still display in actual image size. I want to specify image size >>>> under headline properties. Is it possible to do this? >>> >>> I implemented this feature by written a hook. Hope this can be helpful >>> for someone who also has this needs. Here is the code: >> >> This looks useful. >> Would you be interested to write a patch? > > The is the new patch which updated the defcustom variable docstring has correct description. > > [2. text/x-patch; 0001-org.el-Add-hook-function-to-auto-display-inline-imag.patch]... I found an issue of this patch, this patch logic will ignore existing ~#+ATTR_ORG:~ size. How to let this patch code also obey the ~#+ATTR_ORG:~ size too? For example: * heading 1 :PROPERTIES: :INLINE-IMAGE-WIDTH: 100 :END: #+ATTR_ORG: :width 300 #+ATTR_LATEX: :width 3.0in #+ATTR_HTML: :width 300px [[file:image-displayed-in-300-width.png]] [[file:image-displayed-in-100-width.png]] -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
[parent not found: <631e92ee.050a0220.f9c18.92f5SMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH] New: auto display inline images under subtree when `org-cycle'. [not found] ` <631e92ee.050a0220.f9c18.92f5SMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-09-12 10:51 ` Ihor Radchenko 2022-09-13 1:09 ` [PATCH 2] " Christopher M. Miles [not found] ` <m2leqogiz8.fsf@numbchild> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-09-12 10:51 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: > Ihor Radchenko <yantar92@gmail.com> writes: > >> "Christopher M. Miles" <numbchild@gmail.com> writes: >> >>>> When I put it on beginning of org document, then preview inline images, but those global attributes >>>> not affected. The inline images still display in actual image size. I want to specify image size >>>> under headline properties. Is it possible to do this? >>> >>> I implemented this feature by written a hook. Hope this can be helpful >>> for someone who also has this needs. Here is the code: >> >> This looks useful. >> Would you be interested to write a patch? > > The is the new patch which updated the defcustom variable docstring has correct description. Thanks for the patch! Before extending org-cycle functionality, let's first try to sort out subtree-level setting of the image size. In the patch, you are suggesting to use INLINE-IMAGE-WIDTH property. However, if we apply the patch as is, this property will only be useful when calling a single function - `org-display-subtree-with-inline-images'. It is not ideal. If we introduce subtree-level setting for inline image size, it should also work when displaying inline images by other existing means (org-toggle-inline-images). Instead of working around the existing code of `org-display-inline-images' and setting a custom `org-image-actual-width' variable in buffer, it is much better to change `org-display-inline-images' directly. At the end, the patch is not bound to your personal config - feel free to alter the existing Org functions. Similarly, you do not need to do (add-to-list 'org-default-properties "INLINE-IMAGE-WIDTH") Simply change the default value of `org-default-properties'. Finally, it will be more consistent to name the property closer to the variable name: ORG-IMAGE-ACTUAL-WIDTH. -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 43+ messages in thread
* [PATCH 2] New: auto display inline images under subtree when `org-cycle'. 2022-09-12 10:51 ` Ihor Radchenko @ 2022-09-13 1:09 ` Christopher M. Miles [not found] ` <m2leqogiz8.fsf@numbchild> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-13 1:09 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 3164 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> Ihor Radchenko <yantar92@gmail.com> writes: >> >>> "Christopher M. Miles" <numbchild@gmail.com> writes: >>> >>>>> When I put it on beginning of org document, then preview inline images, but those global attributes >>>>> not affected. The inline images still display in actual image size. I want to specify image size >>>>> under headline properties. Is it possible to do this? >>>> >>>> I implemented this feature by written a hook. Hope this can be helpful >>>> for someone who also has this needs. Here is the code: >>> >>> This looks useful. >>> Would you be interested to write a patch? >> >> The is the new patch which updated the defcustom variable docstring has correct description. > > Thanks for the patch! > Before extending org-cycle functionality, let's first try to sort out > subtree-level setting of the image size. This is implemented by retrieve subtree-level property value in function ~~org-display-inline-image--width~~. I submitted two separated patches. > > In the patch, you are suggesting to use INLINE-IMAGE-WIDTH property. > However, if we apply the patch as is, this property will only be useful > when calling a single function - > `org-display-subtree-with-inline-images'. > It is not ideal. The patch's purpose is auto display inline images when [TAB] (~org-cycle~) expanding heading or subtrees. Not for global ~org-toggle-inline-images~. Also, introduce a new extra argument "~state~" for ~org-display-inline-images~ like bellowing is not ideal. I think should separate the ~org-cycle~ logic instead of put in ~org-display-inline-images~. In global scope, ~org-toggle-inline-images~ already respect the updated function ~org-display-inline-image--width~, it should respect the subtree property width. #+begin_src emacs-lisp ;; V ;; ----- (defun org-display-inline-images (&optional state include-linked refresh beg end) ...) #+end_src *NOTE*: Because ~org-cycle-hook~ will pass a ~state~ variable to hook function. > > If we introduce subtree-level setting for inline image size, it should > also work when displaying inline images by other existing means > (org-toggle-inline-images). This is implemented by retrieve subtree-level property value in function ~~org-display-inline-image--width~~. > > Instead of working around the existing code of > `org-display-inline-images' and setting a custom > `org-image-actual-width' variable in buffer, it is much better to change > `org-display-inline-images' directly. At the end, the patch is not bound > to your personal config - feel free to alter the existing Org functions. This is implemented by retrieve subtree-level property value in function ~~org-display-inline-image--width~~. > > Similarly, you do not need to do > (add-to-list 'org-default-properties "INLINE-IMAGE-WIDTH") > Simply change the default value of `org-default-properties'. Updated > > Finally, it will be more consistent to name the property closer to the > variable name: ORG-IMAGE-ACTUAL-WIDTH. Updated [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: subtree-level property width support --] [-- Type: text/x-patch, Size: 2436 bytes --] From cc322145c2248e95bc76fee7e6d33f575d93e79f Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Mon, 12 Sep 2022 09:45:09 +0800 Subject: [PATCH 1/2] org.el: Support subtree-level image width specification * lisp/org.el (org-display-inline-image--width): Detect subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" value as image width before fallback. --- lisp/org.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 6e6c437d5..70333c609 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -12199,7 +12199,8 @@ but in some other way.") "EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME" "EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED" "ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE" - "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS") + "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS" + "ORG-IMAGE-ACTUAL-WIDTH") "Some properties that are used by Org mode for various purposes. Being in this list makes sure that they are offered for completion.") @@ -16241,14 +16242,19 @@ buffer boundaries with possible narrowing." (org-element-property :begin par) (re-search-forward attr-re par-end t))) (match-string 1))) + ;; support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified width. + (subtree-property-width + (ignore-errors (org-property-or-variable-value 'ORG-IMAGE-ACTUAL-WIDTH))) (width (cond ;; Treat :width t as if `org-image-actual-width' were t. ((string= attr-width "t") nil) - ;; Fallback to `org-image-actual-width' if no interprable width is given. ((or (null attr-width) (string-match-p "\\`[^0-9]" attr-width)) - (car org-image-actual-width)) + ;; Try to use subtree-level width before fallback. + (or subtree-property-width + ;; Fallback to `org-image-actual-width' if no interprable width is given. + (car org-image-actual-width))) ;; Convert numeric widths to numbers, converting percentages. ((string-match-p "\\`[0-9.]+%" attr-width) (/ (string-to-number attr-width) 100.0)) -- 2.37.2 [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.3: org-cycle-hook function support --] [-- Type: text/x-patch, Size: 2997 bytes --] From 98babf12b2d9dbc38250186e0284fad6d937e3f3 Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Tue, 13 Sep 2022 09:04:03 +0800 Subject: [PATCH 2/2] org.el: Add hook function to auto display inline images of subtree * lisp/org.el (org-display-subtree-with-inline-images): Add an option and hook function to auto display of inline images under current expanded visible subtree. --- lisp/org.el | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/lisp/org.el b/lisp/org.el index 70333c609..30716c04e 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -1108,6 +1108,13 @@ the following lines anywhere in the buffer: :version "24.1" :type 'boolean) +(defcustom org-cycle-display-inline-images nil + "Non-nil means auto display inline images under subtree when `org-cycle' +by the function `org-display-subtree-with-inline-images' on hook `org-cycle-hook'." + :group 'org-startup + :version "24.1" + :type 'boolean) + (defcustom org-startup-with-latex-preview nil "Non-nil means preview LaTeX fragments when loading a new Org file. @@ -16216,6 +16223,38 @@ buffer boundaries with possible narrowing." (overlay-put ov 'keymap image-map)) (push ov org-inline-image-overlays)))))))))))))))) +(defun org-display-subtree-inline-images (&optional state) + "Toggle the display of inline images under current expanded visible subtree. +This hook function will auto display or hide inline images after `org-cycle'. +It is used to hook on `org-cycle-hook'. +The function behavior is controlled by `org-cycle-display-inline-images'." + (interactive) + (when (and org-cycle-display-inline-images + ;; not global state change from `org-cycle-global'. + (not (memq state '(overview contents all)))) + (pcase state + ('children + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headling + ;; to first child headline which reference to upper let-binding + ;; `org-next-visible-heading'. + (org-display-inline-images t t (point-min) (progn (org-next-visible-heading 1) (point)))))) + ('subtree + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, also display inline images under all subtrees. + (org-display-inline-images t t (point-min) (point-max))))) + ('folded + (org-narrow-to-subtree) + (mapc #'delete-overlay (overlays-in (point-min) (point-max)))) + ('nil (funcall 'org-toggle-inline-images)) + (t nil)))) + +(add-hook 'org-cycle-hook #'org-display-subtree-inline-images) + (defvar visual-fill-column-width) ; Silence compiler warning (defun org-display-inline-image--width (link) "Determine the display width of the image LINK, in pixels. -- 2.37.2 [-- Attachment #1.4: Type: text/plain, Size: 269 bytes --] -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
[parent not found: <m2leqogiz8.fsf@numbchild>]
* [PATCH 3] New: auto display inline images under subtree when `org-cycle'. [not found] ` <m2leqogiz8.fsf@numbchild> @ 2022-09-13 1:48 ` Christopher M. Miles [not found] ` <631fe1c9.050a0220.3ab2b.3f52SMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-13 1:48 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 183 bytes --] "Christopher M. Miles" <numbchild@gmail.com> writes: Ihor, My new patch still have some issue in the 'fold state which I added "FIXME" marker. Hope can get some solution from you. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Support-subtree-level-image-width-specificati.patch --] [-- Type: text/x-patch, Size: 2436 bytes --] From 4a56ec6b09e09d92a81e3aa72f4197d716d0ca87 Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Mon, 12 Sep 2022 09:45:09 +0800 Subject: [PATCH 1/2] org.el: Support subtree-level image width specification * lisp/org.el (org-display-inline-image--width): Detect subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" value as image width before fallback. --- lisp/org.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 4eef56f45..07c86229b 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -12128,7 +12128,8 @@ but in some other way.") "EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME" "EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED" "ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE" - "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS") + "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS" + "ORG-IMAGE-ACTUAL-WIDTH") "Some properties that are used by Org mode for various purposes. Being in this list makes sure that they are offered for completion.") @@ -16164,14 +16165,19 @@ buffer boundaries with possible narrowing." (org-element-property :begin par) (re-search-forward attr-re par-end t))) (match-string 1))) + ;; support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified width. + (subtree-property-width + (ignore-errors (org-property-or-variable-value 'ORG-IMAGE-ACTUAL-WIDTH))) (width (cond ;; Treat :width t as if `org-image-actual-width' were t. ((string= attr-width "t") nil) - ;; Fallback to `org-image-actual-width' if no interprable width is given. ((or (null attr-width) (string-match-p "\\`[^0-9]" attr-width)) - (car org-image-actual-width)) + ;; Try to use subtree-level width before fallback. + (or subtree-property-width + ;; Fallback to `org-image-actual-width' if no interprable width is given. + (car org-image-actual-width))) ;; Convert numeric widths to numbers, converting percentages. ((string-match-p "\\`[0-9.]+%" attr-width) (/ (string-to-number attr-width) 100.0)) -- 2.37.2 [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.3: 0002-org.el-Add-hook-function-to-auto-display-inline-imag.patch --] [-- Type: text/x-patch, Size: 3177 bytes --] From 2fc76c4581b60c6631186bfdc489732075432c26 Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Tue, 13 Sep 2022 09:04:03 +0800 Subject: [PATCH 2/2] org.el: Add hook function to auto display inline images of subtree * lisp/org.el (org-display-subtree-with-inline-images): Add an option and hook function to auto display of inline images under current expanded visible subtree. --- lisp/org.el | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/lisp/org.el b/lisp/org.el index 07c86229b..0bd942e07 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -1104,6 +1104,13 @@ the following lines anywhere in the buffer: :version "24.1" :type 'boolean) +(defcustom org-cycle-display-inline-images nil + "Non-nil means auto display inline images under subtree when `org-cycle' +by the function `org-display-subtree-with-inline-images' on hook `org-cycle-hook'." + :group 'org-startup + :version "24.1" + :type 'boolean) + (defcustom org-startup-with-latex-preview nil "Non-nil means preview LaTeX fragments when loading a new Org file. @@ -16139,6 +16146,42 @@ buffer boundaries with possible narrowing." (overlay-put ov 'keymap image-map)) (push ov org-inline-image-overlays)))))))))))))))) +(defun org-display-subtree-inline-images (&optional state) + "Toggle the display of inline images under current expanded visible subtree. +This hook function will auto display or hide inline images after `org-cycle'. +It is used to hook on `org-cycle-hook'. +The function behavior is controlled by `org-cycle-display-inline-images'." + (interactive) + (when (and org-cycle-display-inline-images + ;; not global state change from `org-cycle-global'. + (not (memq state '(overview contents all)))) + (pcase state + ('children + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headling + ;; to first child headline which reference to upper let-binding + ;; `org-next-visible-heading'. + (org-display-inline-images t t (point-min) (progn (org-next-visible-heading 1) (point)))))) + ('subtree + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, also display inline images under all subtrees. + (org-display-inline-images t t (point-min) (point-max))))) + ('folded + ;; (save-excursion + ;; (save-restriction + ;; (org-narrow-to-subtree) + ;; ;; FIXME: this will auto expand heading caused `org-cycle' folded failed. + ;; (mapc #'delete-overlay (overlays-in (point-min) (point-max))))) + ) + ('nil (funcall 'org-toggle-inline-images)) + (t nil)))) + +(add-hook 'org-cycle-hook #'org-display-subtree-inline-images) + (defvar visual-fill-column-width) ; Silence compiler warning (defun org-display-inline-image--width (link) "Determine the display width of the image LINK, in pixels. -- 2.37.2 [-- Attachment #1.4: Type: text/plain, Size: 269 bytes --] -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
[parent not found: <631fe1c9.050a0220.3ab2b.3f52SMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH 3] New: auto display inline images under subtree when `org-cycle'. [not found] ` <631fe1c9.050a0220.3ab2b.3f52SMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-09-15 3:27 ` Ihor Radchenko 2022-09-15 4:53 ` [PATCH 4] " Christopher M. Miles [not found] ` <6322b0a8.050a0220.59bb8.6923SMTPIN_ADDED_BROKEN@mx.google.com> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-09-15 3:27 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: > Ihor, My new patch still have some issue in the 'fold state which I > added "FIXME" marker. Hope can get some solution from you. I will comment only on the first patch for now. > "EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME" > "EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED" > "ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE" > - "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS") > + "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS" > + "ORG-IMAGE-ACTUAL-WIDTH") This change should also be mentioned in the commit message. > @@ -16164,14 +16165,19 @@ buffer boundaries with possible narrowing." > (org-element-property :begin par) > (re-search-forward attr-re par-end t))) > (match-string 1))) > + ;; support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified width. > + (subtree-property-width > + (ignore-errors (org-property-or-variable-value 'ORG-IMAGE-ACTUAL-WIDTH))) You are checking the property too late. I suggest to let-bind org-image-actual-width around the whole `cond' instead. That way, subtree-local value of ORG-IMAGE-ACTUAL-WIDTH will have an effect of setting `org-image-actual-width' value. Also, is there any particular reason why you wrap `org-property-or-variable-value' into `ignore-errors'? Finally, you can simply do (org-property-or-variable-value 'org-image-actual-width) It will return the property value _or_ org-image-actual-width value. > - (car org-image-actual-width)) > + ;; Try to use subtree-level width before fallback. > + (or subtree-property-width > + ;; Fallback to `org-image-actual-width' if no interprable width is given. > + (car org-image-actual-width))) With my last suggestion, this code will not be needed. Also, this change should be documented in etc/NEWS and also in "12.7 Images" section of the manual. -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 43+ messages in thread
* [PATCH 4] New: auto display inline images under subtree when `org-cycle'. 2022-09-15 3:27 ` Ihor Radchenko @ 2022-09-15 4:53 ` Christopher M. Miles [not found] ` <6322b0a8.050a0220.59bb8.6923SMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-15 4:53 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 2681 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> Ihor, My new patch still have some issue in the 'fold state which I >> added "FIXME" marker. Hope can get some solution from you. > > I will comment only on the first patch for now. > >> "EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME" >> "EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED" >> "ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE" >> - "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS") >> + "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS" >> + "ORG-IMAGE-ACTUAL-WIDTH") > > This change should also be mentioned in the commit message. Done > >> @@ -16164,14 +16165,19 @@ buffer boundaries with possible narrowing." >> (org-element-property :begin par) >> (re-search-forward attr-re par-end t))) >> (match-string 1))) >> + ;; support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified width. >> + (subtree-property-width >> + (ignore-errors (org-property-or-variable-value 'ORG-IMAGE-ACTUAL-WIDTH))) > > You are checking the property too late. I suggest to let-bind > org-image-actual-width around the whole `cond' instead. > > That way, subtree-local value of ORG-IMAGE-ACTUAL-WIDTH will have an > effect of setting `org-image-actual-width' value. Done > > Also, is there any particular reason why you wrap > `org-property-or-variable-value' into `ignore-errors'? Remove, I originally use another property keyword instead of ORG-IMAGE-ACTUAL-WIDTH, so ~org-property-or-variable-value~ will raise error if property does not exist. SO I added ~ignore-errors~. Now removed. > > Finally, you can simply do > > (org-property-or-variable-value 'org-image-actual-width) > > It will return the property value _or_ org-image-actual-width value. > Done >> - (car org-image-actual-width)) >> + ;; Try to use subtree-level width before fallback. >> + (or subtree-property-width >> + ;; Fallback to `org-image-actual-width' if no interprable width is given. >> + (car org-image-actual-width))) > > With my last suggestion, this code will not be needed. Done > > Also, this change should be documented in etc/NEWS and also in > "12.7 Images" section of the manual. Done. (the manual, you mean org-manual.org right? I found too many documents under doc/ folder, confused for a while....) P.S: I merged two commits into one for clear. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Add-hook-function-to-auto-display-inline-imag.patch --] [-- Type: text/x-patch, Size: 10536 bytes --] From 4ba9bb3063bde50511457b1d30f1299a85e3ffaf Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Mon, 12 Sep 2022 09:45:09 +0800 Subject: [PATCH] org.el: Add hook function to auto display inline images of subtree * lisp/org.el (org-display-subtree-with-inline-images): Add an option and hook function to auto display of inline images under current expanded visible subtree. * lisp/org.el (org-display-inline-image--width): support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified width. * lisp/org.el (org-default-properties): Add a new property in to override global org-image-actual-width subtree level. --- doc/org-manual.org | 5 ++ etc/ORG-NEWS | 5 ++ lisp/org.el | 133 ++++++++++++++++++++++++++++++--------------- 3 files changed, 100 insertions(+), 43 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index a37b8390c..77274e250 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -11314,6 +11314,11 @@ command: startup by configuring the variable ~org-startup-with-inline-images~[fn:119]. +If you want to override global variable ~org-image-actual-width~ of +inline image display width, you can specify property +"=ORG-IMAGE-ACTUAL-WIDTH=" in subtree level. It will only affect +inline images under the specified subtree. + ** Captions :PROPERTIES: :DESCRIPTION: Describe tables, images... diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index a7f32671e..42e7e4292 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -296,6 +296,11 @@ headings in HTML export. Use the header argument =:var x=code-block[]= or : #+CALL: fn(x=code-block[]) to pass the contents of a named code block as a string argument. +*** New default property =ORG-IMAGE-ACTUAL-WIDTH= for overriding global ~org-image-actual-width~ + +The subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" can override the +global variable ~org-image-actual-width~ settings for inline images +width under current property specified subtree. ** New options *** New custom settings =org-icalendar-scheduled-summary-prefix= and =org-icalendar-deadline-summary-prefix= diff --git a/lisp/org.el b/lisp/org.el index 6e6c437d5..98cac1c1c 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -1108,6 +1108,13 @@ the following lines anywhere in the buffer: :version "24.1" :type 'boolean) +(defcustom org-cycle-display-inline-images nil + "Non-nil means auto display inline images under subtree when `org-cycle' +by the function `org-display-subtree-with-inline-images' on hook `org-cycle-hook'." + :group 'org-startup + :version "24.1" + :type 'boolean) + (defcustom org-startup-with-latex-preview nil "Non-nil means preview LaTeX fragments when loading a new Org file. @@ -12199,7 +12206,8 @@ but in some other way.") "EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME" "EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED" "ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE" - "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS") + "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS" + "ORG-IMAGE-ACTUAL-WIDTH") "Some properties that are used by Org mode for various purposes. Being in this list makes sure that they are offered for completion.") @@ -16215,6 +16223,42 @@ buffer boundaries with possible narrowing." (overlay-put ov 'keymap image-map)) (push ov org-inline-image-overlays)))))))))))))))) +(defun org-display-subtree-inline-images (&optional state) + "Toggle the display of inline images under current expanded visible subtree. +This hook function will auto display or hide inline images after `org-cycle'. +It is used to hook on `org-cycle-hook'. +The function behavior is controlled by `org-cycle-display-inline-images'." + (interactive) + (when (and org-cycle-display-inline-images + ;; not global state change from `org-cycle-global'. + (not (memq state '(overview contents all)))) + (pcase state + ('children + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headling + ;; to first child headline which reference to upper let-binding + ;; `org-next-visible-heading'. + (org-display-inline-images t t (point-min) (progn (org-next-visible-heading 1) (point)))))) + ('subtree + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, also display inline images under all subtrees. + (org-display-inline-images t t (point-min) (point-max))))) + ('folded + ;; (save-excursion + ;; (save-restriction + ;; (org-narrow-to-subtree) + ;; ;; FIXME: this will auto expand heading caused `org-cycle' folded failed. + ;; (mapc #'delete-overlay (overlays-in (point-min) (point-max))))) + ) + ('nil (funcall 'org-toggle-inline-images)) + (_ nil)))) + +(add-hook 'org-cycle-hook #'org-display-subtree-inline-images) + (defvar visual-fill-column-width) ; Silence compiler warning (defun org-display-inline-image--width (link) "Determine the display width of the image LINK, in pixels. @@ -16228,48 +16272,51 @@ buffer boundaries with possible narrowing." If the value is a float between 0 and 2, it interpreted as that proportion of the text width in the buffer." ;; Apply `org-image-actual-width' specifications. - (cond - ((eq org-image-actual-width t) nil) - ((listp org-image-actual-width) - (let* ((case-fold-search t) - (par (org-element-lineage link '(paragraph))) - (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)") - (par-end (org-element-property :post-affiliated par)) - ;; Try to find an attribute providing a :width. - (attr-width - (when (and par (org-with-point-at - (org-element-property :begin par) - (re-search-forward attr-re par-end t))) - (match-string 1))) - (width - (cond - ;; Treat :width t as if `org-image-actual-width' were t. - ((string= attr-width "t") nil) - ;; Fallback to `org-image-actual-width' if no interprable width is given. - ((or (null attr-width) - (string-match-p "\\`[^0-9]" attr-width)) - (car org-image-actual-width)) - ;; Convert numeric widths to numbers, converting percentages. - ((string-match-p "\\`[0-9.]+%" attr-width) - (/ (string-to-number attr-width) 100.0)) - (t (string-to-number attr-width))))) - (if (and (floatp width) (<= 0.0 width 2.0)) - ;; A float in [0,2] should be interpereted as this portion of - ;; the text width in the window. This works well with cases like - ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width, - ;; as the "0.X" is pulled out as a float. We use 2 as the upper - ;; bound as cases such as 1.2\linewidth are feasible. - (round (* width - (window-pixel-width) - (/ (or (and (bound-and-true-p visual-fill-column-mode) - (or visual-fill-column-width auto-fill-function)) - (when auto-fill-function fill-column) - (- (window-text-width) (line-number-display-width))) - (float (window-total-width))))) - width))) - ((numberp org-image-actual-width) - org-image-actual-width) - (t nil))) + ;; support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified width. + (let ((org-image-actual-width (org-property-or-variable-value 'org-image-actual-width))) + (cond + ((eq org-image-actual-width t) nil) + ((listp org-image-actual-width) + (let* ((case-fold-search t) + (par (org-element-lineage link '(paragraph))) + (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)") + (par-end (org-element-property :post-affiliated par)) + ;; Try to find an attribute providing a :width. + (attr-width + (when (and par (org-with-point-at + (org-element-property :begin par) + (re-search-forward attr-re par-end t))) + (match-string 1))) + (width + (cond + ;; Treat :width t as if `org-image-actual-width' were t. + ((string= attr-width "t") nil) + ((or (null attr-width) + (string-match-p "\\`[^0-9]" attr-width)) + ;; Try to use subtree-level width before fallback. + ;; Fallback to `org-image-actual-width' if no interprable width is given. + (car org-image-actual-width)) + ;; Convert numeric widths to numbers, converting percentages. + ((string-match-p "\\`[0-9.]+%" attr-width) + (/ (string-to-number attr-width) 100.0)) + (t (string-to-number attr-width))))) + (if (and (floatp width) (<= 0.0 width 2.0)) + ;; A float in [0,2] should be interpereted as this portion of + ;; the text width in the window. This works well with cases like + ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width, + ;; as the "0.X" is pulled out as a float. We use 2 as the upper + ;; bound as cases such as 1.2\linewidth are feasible. + (round (* width + (window-pixel-width) + (/ (or (and (bound-and-true-p visual-fill-column-mode) + (or visual-fill-column-width auto-fill-function)) + (when auto-fill-function fill-column) + (- (window-text-width) (line-number-display-width))) + (float (window-total-width))))) + width))) + ((numberp org-image-actual-width) + org-image-actual-width) + (t nil)))) (defun org-display-inline-remove-overlay (ov after _beg _end &optional _len) "Remove inline-display overlay if a corresponding region is modified." -- 2.37.2 [-- Attachment #1.3: Type: text/plain, Size: 267 bytes --] -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
[parent not found: <6322b0a8.050a0220.59bb8.6923SMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH 4] New: auto display inline images under subtree when `org-cycle'. [not found] ` <6322b0a8.050a0220.59bb8.6923SMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-09-15 8:47 ` Ihor Radchenko 2022-09-15 9:43 ` [PATCH 5] " Christopher M. Miles [not found] ` <6322f5ad.c80a0220.5e936.823eSMTPIN_ADDED_BROKEN@mx.google.com> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-09-15 8:47 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: >> Also, this change should be documented in etc/NEWS and also in >> "12.7 Images" section of the manual. > > Done. (the manual, you mean org-manual.org right? I found too many > documents under doc/ folder, confused for a while....) I meant doc/org-manual.org Note doc/Documentation_Standards.org for the conventions we use in the manual. Your patch does not follow those conventions (double space between sentences). > P.S: I merged two commits into one for clear. Let's not do it. They are two distinct changes and I will have significant comments regarding subtree cycling. (I had plans to implement <TAB> cycling at point for images, and we may as well take this chance to create some generic infrastructure for showing/hiding the inline images). For now, lets sort out the ORG-IMAGE-ACTUAL-WIDTH property and get it merges. Then, we can move ahead to the subtree cycling feature. > * lisp/org.el (org-display-inline-image--width): support subtree-level ^S > +If you want to override global variable ~org-image-actual-width~ of > +inline image display width, you can specify property > +"=ORG-IMAGE-ACTUAL-WIDTH=" in subtree level. It will only affect > +inline images under the specified subtree. Could you also add a paragraph describing what org-image-actual-width does? > +*** New default property =ORG-IMAGE-ACTUAL-WIDTH= for overriding global ~org-image-actual-width~ I think that people may be confused by "default property" here. Just say "new property". > +The subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" can override the > +global variable ~org-image-actual-width~ settings for inline images > +width under current property specified subtree. It is not necessarily subtree-level. You can as well set it in document-wide property drawer. Just say "The new property ... overrides ...". -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 43+ messages in thread
* [PATCH 5] New: auto display inline images under subtree when `org-cycle'. 2022-09-15 8:47 ` Ihor Radchenko @ 2022-09-15 9:43 ` Christopher M. Miles [not found] ` <6322f5ad.c80a0220.5e936.823eSMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-15 9:43 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 2414 bytes --] Sorry for this hard work on this patch. And thanks for your carefully code reviewing. I have not contribute to org-mode for a long time, already forgot most guidelines. Regards Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >>> Also, this change should be documented in etc/NEWS and also in >>> "12.7 Images" section of the manual. >> >> Done. (the manual, you mean org-manual.org right? I found too many >> documents under doc/ folder, confused for a while....) > > I meant doc/org-manual.org > Note doc/Documentation_Standards.org for the conventions we use in the > manual. Your patch does not follow those conventions (double space > between sentences). Done > >> P.S: I merged two commits into one for clear. > > Let's not do it. They are two distinct changes and I will have > significant comments regarding subtree cycling. (I had plans to > implement <TAB> cycling at point for images, and we may as well take this > chance to create some generic infrastructure for showing/hiding the > inline images). > > For now, lets sort out the ORG-IMAGE-ACTUAL-WIDTH property and get it > merges. Then, we can move ahead to the subtree cycling feature. > Ok, I will submit the first patch of new property at first. If you're going to implement this <TAB> cycling inline image display feature, that's great! >> * lisp/org.el (org-display-inline-image--width): support subtree-level > ^S > >> +If you want to override global variable ~org-image-actual-width~ of >> +inline image display width, you can specify property >> +"=ORG-IMAGE-ACTUAL-WIDTH=" in subtree level. It will only affect >> +inline images under the specified subtree. > > Could you also add a paragraph describing what org-image-actual-width > does? Done in doc/org-manual.org > >> +*** New default property =ORG-IMAGE-ACTUAL-WIDTH= for overriding global ~org-image-actual-width~ > > I think that people may be confused by "default property" here. Just say > "new property". Done > >> +The subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" can override the >> +global variable ~org-image-actual-width~ settings for inline images >> +width under current property specified subtree. > > It is not necessarily subtree-level. You can as well set it in > document-wide property drawer. Just say "The new property ... > overrides ...". Done [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Support-subtree-level-org-image-actual-width-.patch --] [-- Type: text/x-patch, Size: 8384 bytes --] From 1bc3224220ec71292e08ebc6b25e0064f7243f2e Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Thu, 15 Sep 2022 17:25:13 +0800 Subject: [PATCH] org.el: Support subtree-level org-image-actual-width overriding * lisp/org.el (org-display-inline-image--width): Support new property "ORG-IMAGE-ACTUAL-WIDTH" overriding global variable `org-image-actual-width'. --- doc/org-manual.org | 21 +++++++++++ etc/ORG-NEWS | 4 +++ lisp/org.el | 89 ++++++++++++++++++++++++---------------------- 3 files changed, 71 insertions(+), 43 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index a37b8390c..2d2b93694 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -11314,6 +11314,27 @@ command: startup by configuring the variable ~org-startup-with-inline-images~[fn:119]. + #+vindex: org-image-actual-width + Control the display size of inline images. + The value can be bellowing formats: + - When non-nil, use the actual width of images when inlining them. + - When set to a number, use imagemagick (when available) to set the + image's width to this value. + - When set to a number in a list, try to get the width from any + =#+ATTR.*= keyword if it matches a width specification like: + #+ATTR_HTML: :width 300px + and fall back on that number if none is found. + - When set to nil, try to get the width from an =#+ATTR.*= keyword + and fall back on the original width if none is found. + - When set to any other non-nil value, always use the image width. + + This requires Emacs >= 24.1, built with imagemagick support. + + #+cindex: @samp{NOBLOCKING}, property + If you want to override the global variable ~org-image-actual-width~ + of inline image display width, you can specify property + "=ORG-IMAGE-ACTUAL-WIDTH=". + ** Captions :PROPERTIES: :DESCRIPTION: Describe tables, images... diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index a7f32671e..f30809973 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -296,6 +296,10 @@ headings in HTML export. Use the header argument =:var x=code-block[]= or : #+CALL: fn(x=code-block[]) to pass the contents of a named code block as a string argument. +*** New property =ORG-IMAGE-ACTUAL-WIDTH= for overriding global ~org-image-actual-width~ + +The new property "=ORG-IMAGE-ACTUAL-WIDTH=" can override the global +variable ~org-image-actual-width~ value for inline images display width. ** New options *** New custom settings =org-icalendar-scheduled-summary-prefix= and =org-icalendar-deadline-summary-prefix= diff --git a/lisp/org.el b/lisp/org.el index 6e6c437d5..d2d66038d 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -12199,7 +12199,8 @@ but in some other way.") "EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME" "EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED" "ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE" - "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS") + "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS" + "ORG-IMAGE-ACTUAL-WIDTH") "Some properties that are used by Org mode for various purposes. Being in this list makes sure that they are offered for completion.") @@ -16228,48 +16229,50 @@ buffer boundaries with possible narrowing." If the value is a float between 0 and 2, it interpreted as that proportion of the text width in the buffer." ;; Apply `org-image-actual-width' specifications. - (cond - ((eq org-image-actual-width t) nil) - ((listp org-image-actual-width) - (let* ((case-fold-search t) - (par (org-element-lineage link '(paragraph))) - (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)") - (par-end (org-element-property :post-affiliated par)) - ;; Try to find an attribute providing a :width. - (attr-width - (when (and par (org-with-point-at - (org-element-property :begin par) - (re-search-forward attr-re par-end t))) - (match-string 1))) - (width - (cond - ;; Treat :width t as if `org-image-actual-width' were t. - ((string= attr-width "t") nil) - ;; Fallback to `org-image-actual-width' if no interprable width is given. - ((or (null attr-width) - (string-match-p "\\`[^0-9]" attr-width)) - (car org-image-actual-width)) - ;; Convert numeric widths to numbers, converting percentages. - ((string-match-p "\\`[0-9.]+%" attr-width) - (/ (string-to-number attr-width) 100.0)) - (t (string-to-number attr-width))))) - (if (and (floatp width) (<= 0.0 width 2.0)) - ;; A float in [0,2] should be interpereted as this portion of - ;; the text width in the window. This works well with cases like - ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width, - ;; as the "0.X" is pulled out as a float. We use 2 as the upper - ;; bound as cases such as 1.2\linewidth are feasible. - (round (* width - (window-pixel-width) - (/ (or (and (bound-and-true-p visual-fill-column-mode) - (or visual-fill-column-width auto-fill-function)) - (when auto-fill-function fill-column) - (- (window-text-width) (line-number-display-width))) - (float (window-total-width))))) - width))) - ((numberp org-image-actual-width) - org-image-actual-width) - (t nil))) + ;; support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified width. + (let ((org-image-actual-width (org-property-or-variable-value 'org-image-actual-width))) + (cond + ((eq org-image-actual-width t) nil) + ((listp org-image-actual-width) + (let* ((case-fold-search t) + (par (org-element-lineage link '(paragraph))) + (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)") + (par-end (org-element-property :post-affiliated par)) + ;; Try to find an attribute providing a :width. + (attr-width + (when (and par (org-with-point-at + (org-element-property :begin par) + (re-search-forward attr-re par-end t))) + (match-string 1))) + (width + (cond + ;; Treat :width t as if `org-image-actual-width' were t. + ((string= attr-width "t") nil) + ;; Fallback to `org-image-actual-width' if no interprable width is given. + ((or (null attr-width) + (string-match-p "\\`[^0-9]" attr-width)) + (car org-image-actual-width)) + ;; Convert numeric widths to numbers, converting percentages. + ((string-match-p "\\`[0-9.]+%" attr-width) + (/ (string-to-number attr-width) 100.0)) + (t (string-to-number attr-width))))) + (if (and (floatp width) (<= 0.0 width 2.0)) + ;; A float in [0,2] should be interpereted as this portion of + ;; the text width in the window. This works well with cases like + ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width, + ;; as the "0.X" is pulled out as a float. We use 2 as the upper + ;; bound as cases such as 1.2\linewidth are feasible. + (round (* width + (window-pixel-width) + (/ (or (and (bound-and-true-p visual-fill-column-mode) + (or visual-fill-column-width auto-fill-function)) + (when auto-fill-function fill-column) + (- (window-text-width) (line-number-display-width))) + (float (window-total-width))))) + width))) + ((numberp org-image-actual-width) + org-image-actual-width) + (t nil)))) (defun org-display-inline-remove-overlay (ov after _beg _end &optional _len) "Remove inline-display overlay if a corresponding region is modified." -- 2.37.2 [-- Attachment #1.3: Type: text/plain, Size: 267 bytes --] -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
[parent not found: <6322f5ad.c80a0220.5e936.823eSMTPIN_ADDED_BROKEN@mx.google.com>]
* [PATCH v6] Re: [PATCH 5] New: auto display inline images under subtree when `org-cycle'. [not found] ` <6322f5ad.c80a0220.5e936.823eSMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-09-20 7:01 ` Ihor Radchenko 2022-09-20 11:32 ` [PATCH v6] " Christopher M. Miles [not found] ` <6329c8b0.050a0220.412d.0a6cSMTPIN_ADDED_BROKEN@mx.google.com> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-09-20 7:01 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 522 bytes --] "Christopher M. Miles" <numbchild@gmail.com> writes: > Ok, I will submit the first patch of new property at first. If you're > going to implement this <TAB> cycling inline image display feature, > that's great! The changes to the manual are confusing after exporting. Note that #+vindex: org-image-actual-width will not be visible in html/pdf export. They only serve as info search nodes and do not appear in the actual text. I am attaching an alternative version of the patch. Let me know if you have any objections. [-- Attachment #2: v6-0001-org.el-Support-subtree-level-org-image-actual-wid.patch --] [-- Type: text/x-patch, Size: 34756 bytes --] From 475c607f874e4e78c1e13d15e36ae894b121acad Mon Sep 17 00:00:00 2001 Message-Id: <475c607f874e4e78c1e13d15e36ae894b121acad.1663656903.git.yantar92@gmail.com> From: stardiviner <numbchild@gmail.com> Date: Thu, 15 Sep 2022 17:25:13 +0800 Subject: [PATCH v6] org.el: Support subtree-level org-image-actual-width overriding * lisp/org.el (org-display-inline-image--width): Support new property "ORG-IMAGE-ACTUAL-WIDTH" overriding global variable `org-image-actual-width'. --- doc/org-manual.org | 186 +++++++++++++++++++++++++-------------------- etc/ORG-NEWS | 4 + lisp/org.el | 90 +++++++++++----------- 3 files changed, 155 insertions(+), 125 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index a37b8390c..4c9c087a7 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -11314,6 +11314,24 @@ ** Images startup by configuring the variable ~org-startup-with-inline-images~[fn:119]. + + #+vindex: org-image-actual-width + #+cindex: @samp{ORG-IMAGE-ACTUAL-WIDTH}, property + By default, Org mode displays inline images according to their actual width. + You can customize the displayed image width using ~org-image-actual-width~ variable (globally) or =ORG-IMAGE-ACTUAL-WIDTH= property (subtree-level)[fn:120]. + Their value can be the following: + - (default) Non-nil, use the actual width of images when inlining them. + - When set to a number, use imagemagick (when available) to set the + image's width to this value. + - When set to a number in a list, try to get the width from any + =#+ATTR.*= keyword if it matches a width specification like: + #+begin_example + ,#+ATTR_HTML: :width 300px + #+end_example + and fall back on that number if none is found. + - When set to nil, try to get the width from an =#+ATTR.*= keyword + and fall back on the original width if none is found. + ** Captions :PROPERTIES: :DESCRIPTION: Describe tables, images... @@ -11404,7 +11422,7 @@ ** Creating Footnotes #+vindex: org-footnote-define-inline #+vindex: org-footnote-section Otherwise, create a new footnote. Depending on the variable - ~org-footnote-define-inline~[fn:120], the definition is placed right + ~org-footnote-define-inline~[fn:121], the definition is placed right into the text as part of the reference, or separately into the location determined by the variable ~org-footnote-section~. @@ -11419,7 +11437,7 @@ ** Creating Footnotes | {{{kbd(d)}}} | Delete the footnote at point, including definition and references. | #+vindex: org-footnote-auto-adjust - Depending on the variable ~org-footnote-auto-adjust~[fn:121], + Depending on the variable ~org-footnote-auto-adjust~[fn:122], renumbering and sorting footnotes can be automatic after each insertion or deletion. @@ -11609,7 +11627,7 @@ ** Export Settings #+cindex: @samp{DATE}, keyword #+vindex: org-export-date-timestamp-format - A date or a time-stamp[fn:122]. + A date or a time-stamp[fn:123]. - =EMAIL= :: @@ -11624,7 +11642,7 @@ ** Export Settings Language to use for translating certain strings (~org-export-default-language~). With =#+LANGUAGE: fr=, for example, Org translates =Table of contents= to the French =Table des - matières=[fn:123]. + matières=[fn:124]. - =SELECT_TAGS= :: @@ -11901,7 +11919,7 @@ ** Table of Contents #+cindex: excluding entries from table of contents #+cindex: table of contents, exclude entries Org includes both numbered and unnumbered headlines in the table of -contents[fn:124]. If you need to exclude an unnumbered headline, +contents[fn:125]. If you need to exclude an unnumbered headline, along with all its children, set the =UNNUMBERED= property to =notoc= value. @@ -12020,7 +12038,7 @@ ** Include Files | =#+INCLUDE: "~/.emacs" :lines "10-"= | Include lines from 10 to EOF | Inclusions may specify a file-link to extract an object matched by -~org-link-search~[fn:125] (see [[*Search Options in File Links]]). The +~org-link-search~[fn:126] (see [[*Search Options in File Links]]). The ranges for =:lines= keyword are relative to the requested element. Therefore, @@ -12060,7 +12078,7 @@ ** Macro Replacement : #+MACRO: name replacement text; $1, $2 are arguments #+texinfo: @noindent -which can be referenced using ={{{name(arg1, arg2)}}}=[fn:126]. For +which can be referenced using ={{{name(arg1, arg2)}}}=[fn:127]. For example #+begin_example @@ -12179,7 +12197,7 @@ ** Comment Lines Finally, a =COMMENT= keyword at the beginning of an entry, but after any other keyword or priority cookie, comments out the entire subtree. In this case, the subtree is not exported and no code block within it -is executed either[fn:127]. The command below helps changing the +is executed either[fn:128]. The command below helps changing the comment status of a headline. - {{{kbd(C-c ;)}}} (~org-toggle-comment~) :: @@ -12451,7 +12469,7 @@ *** Frames and Blocks in Beamer - Org exports a Beamer frame's objects as block environments. Org can enforce wrapping in special block types when =BEAMER_ENV= property - is set[fn:128]. For valid values see + is set[fn:129]. For valid values see ~org-beamer-environments-default~. To add more values, see ~org-beamer-environments-extra~. #+vindex: org-beamer-environments-default @@ -13039,7 +13057,7 @@ *** Math formatting in HTML export #+vindex: org-html-mathjax-options~ LaTeX math snippets (see [[*LaTeX fragments]]) can be displayed in two different ways on HTML pages. The default is to use the [[https://www.mathjax.org][MathJax]], -which should work out of the box with Org[fn:129][fn:130]. Some MathJax +which should work out of the box with Org[fn:130][fn:131]. Some MathJax display options can be configured via ~org-html-mathjax-options~, or in the buffer. For example, with the following settings, @@ -13051,7 +13069,7 @@ *** Math formatting in HTML export #+texinfo: @noindent equation labels are displayed on the left margin and equations are five em from the left margin. In addition, it loads the two MathJax -extensions =cancel.js= and =noErrors.js=[fn:131]. +extensions =cancel.js= and =noErrors.js=[fn:132]. #+vindex: org-html-mathjax-template See the docstring of ~org-html-mathjax-options~ for all supported @@ -13114,7 +13132,7 @@ *** CSS support #+vindex: org-export-html-todo-kwd-class-prefix #+vindex: org-export-html-tag-class-prefix You can modify the CSS style definitions for the exported file. The -HTML exporter assigns the following special CSS classes[fn:132] to +HTML exporter assigns the following special CSS classes[fn:133] to appropriate parts of the document---your style specifications may change these, in addition to any of the standard classes like for headlines, tables, etc. @@ -13351,7 +13369,7 @@ *** LaTeX/PDF export commands Org file. See the docstring for the ~org-latex-default-packages-alist~ for loading packages with certain compilers. Also see ~org-latex-bibtex-compiler~ to set the -bibliography compiler[fn:133]. +bibliography compiler[fn:134]. *** LaTeX specific export settings :PROPERTIES: @@ -13889,7 +13907,7 @@ *** Source blocks in LaTeX export packages for customization of that specific source block. In the example below, the =:options= are set for Engraved or Minted. Minted is a source code highlighting LaTeX package with many configurable -options[fn:134]. Both Minted and Engraved are built on [[https://www.ctan.org/pkg/fvextra][fvextra]], and +options[fn:135]. Both Minted and Engraved are built on [[https://www.ctan.org/pkg/fvextra][fvextra]], and so support many of the same options. #+begin_example @@ -14142,7 +14160,7 @@ ** OpenDocument Text Export The ODT export back-end handles creating of OpenDocument Text (ODT) format. Documents created by this exporter use the -{{{cite(OpenDocument-v1.2 specification)}}}[fn:135] and are compatible +{{{cite(OpenDocument-v1.2 specification)}}}[fn:136] and are compatible with LibreOffice 3.4. *** Pre-requisites for ODT export @@ -14543,7 +14561,7 @@ **** LaTeX math snippets variables ~org-latex-to-mathml-convert-command~ and ~org-latex-to-mathml-jar-file~. - If you prefer to use MathToWeb[fn:136] as your converter, you can + If you prefer to use MathToWeb[fn:137] as your converter, you can configure the above variables as shown below. #+begin_src emacs-lisp @@ -14554,7 +14572,7 @@ **** LaTeX math snippets #+end_src #+texinfo: @noindent - or, to use LaTeXML[fn:137] instead, + or, to use LaTeXML[fn:138] instead, #+begin_src emacs-lisp (setq org-latex-to-mathml-convert-command @@ -14873,7 +14891,7 @@ **** Customizing tables in ODT export tables, see [[*Tables in ODT export]]. This feature closely mimics the way table templates are defined in the -OpenDocument-v1.2 specification[fn:138]. +OpenDocument-v1.2 specification[fn:139]. #+vindex: org-odt-table-styles For quick preview of this feature, install the settings below and export the @@ -14907,7 +14925,7 @@ **** Customizing tables in ODT export To use this feature proceed as follows: -1. Create a table template[fn:139]. +1. Create a table template[fn:140]. A table template is set of =table-cell= and =paragraph= styles for each of the following table cell categories: @@ -14946,7 +14964,7 @@ **** Customizing tables in ODT export =</office:automatic-styles>= element of the content template file (see [[x-orgodtcontenttemplate-xml][Factory styles]]). -2. Define a table style[fn:140]. +2. Define a table style[fn:141]. #+vindex: org-odt-table-styles To define a table style, create an entry for the style in the @@ -16177,7 +16195,7 @@ *** Publishing action ~org-org-publish-to-org~. This produces =file.org= and puts it in the publishing directory. If you want a htmlized version of this file, set the parameter ~:htmlized-source~ to ~t~. It produces -=file.org.html= in the publishing directory[fn:141]. +=file.org.html= in the publishing directory[fn:142]. Other files like images only need to be copied to the publishing destination; for this you can use ~org-publish-attachment~. For @@ -17795,13 +17813,13 @@ *** How to evaluate source code #+kindex: C-c C-v e #+findex: org-babel-execute-src-block Org provides many ways to execute code blocks. {{{kbd(C-c C-c)}}} or -{{{kbd(C-c C-v e)}}} with the point on a code block[fn:142] calls the +{{{kbd(C-c C-v e)}}} with the point on a code block[fn:143] calls the ~org-babel-execute-src-block~ function, which executes the code in the block, collects the results, and inserts them in the buffer. #+cindex: @samp{CALL}, keyword #+vindex: org-babel-inline-result-wrap -By calling a named code block[fn:143] from an Org mode buffer or +By calling a named code block[fn:144] from an Org mode buffer or a table. Org can call the named code blocks from the current Org mode buffer or from the "Library of Babel" (see [[*Library of Babel]]). @@ -18002,7 +18020,7 @@ *** Collection - =value= :: - Default for most Babel libraries[fn:143]. Functional mode. Org + Default for most Babel libraries[fn:144]. Functional mode. Org gets the value by wrapping the code in a function definition in the language of the source block. That is why when using =:results value=, code should execute like a function and return a value. For @@ -18731,7 +18749,7 @@ ** Noweb Reference Syntax #+cindex: @samp{noweb-ref}, header argument Source code blocks can include references to other source code blocks, -using a noweb[fn:144] style syntax: +using a noweb[fn:145] style syntax: : <<CODE-BLOCK-ID>> @@ -19259,7 +19277,7 @@ ** Structure Templates ~org-structure-template-alist~ and ~org-tempo-keywords-alist~. For example, {{{kbd(< s TAB)}}} creates a code block. Enable it by customizing ~org-modules~ or add =(require 'org-tempo)= to your Emacs -init file[fn:145]. +init file[fn:146]. #+attr_texinfo: :columns 0.1 0.9 | {{{kbd(a)}}} | =#+BEGIN_EXPORT ascii= ... =#+END_EXPORT= | @@ -19339,7 +19357,7 @@ *** Org Indent Mode To display the buffer in the indented view, activate Org Indent minor mode, using {{{kbd(M-x org-indent-mode)}}}. Text lines that are not headlines are prefixed with virtual spaces to vertically align with -the headline text[fn:146]. +the headline text[fn:147]. #+vindex: org-indent-indentation-per-level To make more horizontal space, the headlines are shifted by two @@ -19367,9 +19385,9 @@ *** Hard indentation It is possible to use hard spaces to achieve the indentation instead, if the bare ASCII file should have the indented look also outside -Emacs[fn:147]. With Org's support, you have to indent all lines to +Emacs[fn:148]. With Org's support, you have to indent all lines to line up with the outline headers. You would use these -settings[fn:148]: +settings[fn:149]: #+begin_src emacs-lisp (setq org-adapt-indentation t @@ -19640,7 +19658,7 @@ ** Summary of In-Buffer Settings #+vindex: org-startup-indented Dynamic virtual indentation is controlled by the variable - ~org-startup-indented~[fn:149]. + ~org-startup-indented~[fn:150]. | =indent= | Start with Org Indent mode turned on. | | =noindent= | Start with Org Indent mode turned off. | @@ -20498,7 +20516,7 @@ *** Setting up the staging area #+vindex: org-mobile-directory The mobile application needs access to a file directory on -a server[fn:150] to interact with Emacs. Pass its location through +a server[fn:151] to interact with Emacs. Pass its location through the ~org-mobile-directory~ variable. If you can mount that directory locally just set the variable to point to that directory: @@ -20519,7 +20537,7 @@ *** Setting up the staging area requires OpenSSL installed on the local computer. To turn on encryption, set the same password in the mobile application and in Emacs. Set the password in the variable -~org-mobile-use-encryption~[fn:151]. Note that even after the mobile +~org-mobile-use-encryption~[fn:152]. Note that even after the mobile application encrypts the file contents, the file name remains visible on the file systems of the local computer, the server, and the mobile device. @@ -20535,15 +20553,15 @@ *** Pushing to the mobile application ~org-mobile-files~ into the staging area. Files include agenda files (as listed in ~org-agenda-files~). Customize ~org-mobile-files~ to add other files. File names are staged with paths relative to -~org-directory~, so all files should be inside this directory[fn:152]. +~org-directory~, so all files should be inside this directory[fn:153]. Push creates a special Org file =agendas.org= with custom agenda views -defined by the user[fn:153]. +defined by the user[fn:154]. Finally, Org writes the file =index.org=, containing links to other files. The mobile application reads this file first from the server to determine what other files to download for agendas. For faster -downloads, it is expected to only read files whose checksums[fn:154] +downloads, it is expected to only read files whose checksums[fn:155] have changed. *** Pulling from the mobile application @@ -20560,7 +20578,7 @@ *** Pulling from the mobile application 1. #+vindex: org-mobile-inbox-for-pull - Org moves all entries found in =mobileorg.org=[fn:155] and appends + Org moves all entries found in =mobileorg.org=[fn:156] and appends them to the file pointed to by the variable ~org-mobile-inbox-for-pull~. It should reside neither in the staging area nor on the server. Each captured entry and each @@ -20854,9 +20872,9 @@ *** A LaTeX example of radio tables #+cindex: @LaTeX{}, and Orgtbl mode To wrap a source table in LaTeX, use the =comment= environment -provided by =comment.sty=[fn:156]. To activate it, put +provided by =comment.sty=[fn:157]. To activate it, put ~\usepackage{comment}~ in the document header. Orgtbl mode inserts -a radio table skeleton[fn:157] with the command {{{kbd(M-x +a radio table skeleton[fn:158] with the command {{{kbd(M-x orgtbl-insert-radio-table)}}}, which prompts for a table name. For example, if =salesfigures= is the name, the template inserts: @@ -20875,7 +20893,7 @@ *** A LaTeX example of radio tables ~orgtbl-to-latex~ to convert the table to LaTeX format, then insert the table at the target (receive) location named =salesfigures=. Now the table is ready for data entry. It can even use spreadsheet -features[fn:158]: +features[fn:159]: #+begin_example % BEGIN RECEIVE ORGTBL salesfigures @@ -21091,7 +21109,7 @@ ** Special Agenda Views #+vindex: org-agenda-skip-function #+vindex: org-agenda-skip-function-global Org provides a special hook to further limit items in agenda views: -~agenda~, ~agenda*~[fn:159], ~todo~, ~alltodo~, ~tags~, ~tags-todo~, +~agenda~, ~agenda*~[fn:160], ~todo~, ~alltodo~, ~tags~, ~tags-todo~, ~tags-tree~. Specify a custom function that tests inclusion of every matched item in the view. This function can also skip as much as is needed. @@ -21134,7 +21152,7 @@ ** Special Agenda Views #+vindex: org-agenda-skip-function Search for entries with a limit set on levels for the custom search. This is a general approach to creating custom searches in Org. To -include all levels, use =LEVEL>0=[fn:160]. Then to selectively pick +include all levels, use =LEVEL>0=[fn:161]. Then to selectively pick the matched entries, use ~org-agenda-skip-function~, which also accepts Lisp forms, such as ~org-agenda-skip-entry-if~ and ~org-agenda-skip-subtree-if~. For example: @@ -22258,6 +22276,7 @@ * Footnotes #+findex: org-anniversary #+findex: org-cyclic #+findex: org-block + [fn:60] When working with the standard diary expression functions, you need to be very careful with the order of the arguments. That order depends evilly on the variable ~calendar-date-style~. For example, to @@ -22496,140 +22515,143 @@ * Footnotes within a buffer with the =STARTUP= options =inlineimages= and =noinlineimages=. -[fn:120] The corresponding in-buffer setting is: =#+STARTUP: fninline= +[fn:120] The width can be customized in Emacs >= 24.1, built with +imagemagick support. + +[fn:121] The corresponding in-buffer setting is: =#+STARTUP: fninline= or =#+STARTUP: nofninline=. -[fn:121] The corresponding in-buffer options are =#+STARTUP: fnadjust= +[fn:122] The corresponding in-buffer options are =#+STARTUP: fnadjust= and =#+STARTUP: nofnadjust=. -[fn:122] The variable ~org-export-date-timestamp-format~ defines how +[fn:123] The variable ~org-export-date-timestamp-format~ defines how this timestamp are exported. -[fn:123] For export to LaTeX format---or LaTeX-related formats such as +[fn:124] For export to LaTeX format---or LaTeX-related formats such as Beamer---, the =org-latex-package-alist= variable needs further configuration. See [[LaTeX specific export settings]]. -[fn:124] At the moment, some export back-ends do not obey this +[fn:125] At the moment, some export back-ends do not obey this specification. For example, LaTeX export excludes every unnumbered headline from the table of contents. -[fn:125] Note that ~org-link-search-must-match-exact-headline~ is +[fn:126] Note that ~org-link-search-must-match-exact-headline~ is locally bound to non-~nil~. Therefore, ~org-link-search~ only matches headlines and named elements. -[fn:126] Since commas separate the arguments, commas within arguments +[fn:127] Since commas separate the arguments, commas within arguments have to be escaped with the backslash character. So only those backslash characters before a comma need escaping with another backslash character. -[fn:127] For a less drastic behavior, consider using a select tag (see +[fn:128] For a less drastic behavior, consider using a select tag (see [[*Export Settings]]) instead. -[fn:128] If =BEAMER_ENV= is set, Org export adds =B_environment= tag +[fn:129] If =BEAMER_ENV= is set, Org export adds =B_environment= tag to make it visible. The tag serves as a visual aid and has no semantic relevance. -[fn:129] By default Org loads MathJax from [[https://cdnjs.com][cdnjs.com]] as recommended by +[fn:130] By default Org loads MathJax from [[https://cdnjs.com][cdnjs.com]] as recommended by [[https://www.mathjax.org][MathJax]]. -[fn:130] Please note that exported formulas are part of an HTML +[fn:131] Please note that exported formulas are part of an HTML document, and that signs such as =<=, =>=, or =&= have special meanings. See [[http://docs.mathjax.org/en/latest/input/tex/html.html#tex-and-latex-in-html-documents][MathJax TeX and LaTeX in HTML documents]]. -[fn:131] See [[http://docs.mathjax.org/en/latest/input/tex/extensions.html#tex-and-latex-extensions][TeX and LaTeX extensions]] in the [[http://docs.mathjax.org][MathJax manual]] to learn +[fn:132] See [[http://docs.mathjax.org/en/latest/input/tex/extensions.html#tex-and-latex-extensions][TeX and LaTeX extensions]] in the [[http://docs.mathjax.org][MathJax manual]] to learn about extensions. -[fn:132] If the classes on TODO keywords and tags lead to conflicts, +[fn:133] If the classes on TODO keywords and tags lead to conflicts, use the variables ~org-html-todo-kwd-class-prefix~ and ~org-html-tag-class-prefix~ to make them unique. -[fn:133] This does not allow setting different bibliography compilers +[fn:134] This does not allow setting different bibliography compilers for different files. However, "smart" LaTeX compilation systems, such as latexmk, can select the correct bibliography compiler. -[fn:134] Minted uses an external Python package for code highlighting, +[fn:135] Minted uses an external Python package for code highlighting, which requires the flag =-shell-escape= to be added to ~org-latex-pdf-process~. -[fn:135] See [[http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html][Open Document Format for Office Applications +[fn:136] See [[http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html][Open Document Format for Office Applications (OpenDocument) Version 1.2]]. -[fn:136] See [[http://www.mathtoweb.com/cgi-bin/mathtoweb_home.pl][MathToWeb]]. +[fn:137] See [[http://www.mathtoweb.com/cgi-bin/mathtoweb_home.pl][MathToWeb]]. -[fn:137] See [[http://dlmf.nist.gov/LaTeXML/]]. +[fn:138] See [[http://dlmf.nist.gov/LaTeXML/]]. -[fn:138] [[http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html][OpenDocument-v1.2 Specification]] +[fn:139] [[http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html][OpenDocument-v1.2 Specification]] -[fn:139] See the =<table:table-template>= element of the +[fn:140] See the =<table:table-template>= element of the OpenDocument-v1.2 specification. -[fn:140] See the attributes =table:template-name=, +[fn:141] See the attributes =table:template-name=, =table:use-first-row-styles=, =table:use-last-row-styles=, =table:use-first-column-styles=, =table:use-last-column-styles=, =table:use-banding-rows-styles=, and =table:use-banding-column-styles= of the =<table:table>= element in the OpenDocument-v1.2 specification. -[fn:141] If the publishing directory is the same as the source +[fn:142] If the publishing directory is the same as the source directory, =file.org= is exported as =file.org.org=, so you probably do not want to do this. -[fn:142] The option ~org-babel-no-eval-on-ctrl-c-ctrl-c~ can be used +[fn:143] The option ~org-babel-no-eval-on-ctrl-c-ctrl-c~ can be used to remove code evaluation from the {{{kbd(C-c C-c)}}} key binding. -[fn:143] Actually, the constructs =call_<name>()= and =src_<lang>{}= +[fn:144] Actually, the constructs =call_<name>()= and =src_<lang>{}= are not evaluated when they appear in a keyword (see [[*Summary of In-Buffer Settings]]). -[fn:144] For noweb literate programming details, see +[fn:145] For noweb literate programming details, see http://www.cs.tufts.edu/~nr/noweb/. -[fn:145] For more information, please refer to the commentary section +[fn:146] For more information, please refer to the commentary section in =org-tempo.el=. -[fn:146] Org Indent mode also sets ~wrap-prefix~ correctly for +[fn:147] Org Indent mode also sets ~wrap-prefix~ correctly for indenting and wrapping long lines of headlines or text. This minor mode also handles Visual Line mode and directly applied settings through ~word-wrap~. -[fn:147] This works, but requires extra effort. Org Indent mode is +[fn:148] This works, but requires extra effort. Org Indent mode is more convenient for most applications. -[fn:148] ~org-adapt-indentation~ can also be set to ='headline-data=, +[fn:149] ~org-adapt-indentation~ can also be set to ='headline-data=, in which case only data lines below the headline will be indented. -[fn:149] Note that Org Indent mode also sets the ~wrap-prefix~ +[fn:150] Note that Org Indent mode also sets the ~wrap-prefix~ property, such that Visual Line mode (or purely setting ~word-wrap~) wraps long lines, including headlines, correctly indented. -[fn:150] For a server to host files, consider using a WebDAV server, +[fn:151] For a server to host files, consider using a WebDAV server, such as [[https://nextcloud.com][Nextcloud]]. Additional help is at this [[https://orgmode.org/worg/org-faq.html#mobileorg_webdav][FAQ entry]]. -[fn:151] If Emacs is configured for safe storing of passwords, then +[fn:152] If Emacs is configured for safe storing of passwords, then configure the variable ~org-mobile-encryption-password~; please read the docstring of that variable. -[fn:152] Symbolic links in ~org-directory~ need to have the same name +[fn:153] Symbolic links in ~org-directory~ need to have the same name as their targets. -[fn:153] While creating the agendas, Org mode forces =ID= properties +[fn:154] While creating the agendas, Org mode forces =ID= properties on all referenced entries, so that these entries can be uniquely identified if Org Mobile flags them for further action. To avoid setting properties configure the variable ~org-mobile-force-id-on-agenda-items~ to ~nil~. Org mode then relies on outline paths, assuming they are unique. -[fn:154] Checksums are stored automatically in the file +[fn:155] Checksums are stored automatically in the file =checksums.dat=. -[fn:155] The file will be empty after this operation. +[fn:156] The file will be empty after this operation. -[fn:156] https://www.ctan.org/pkg/comment +[fn:157] https://www.ctan.org/pkg/comment -[fn:157] By default this works only for LaTeX, HTML, and Texinfo. +[fn:158] By default this works only for LaTeX, HTML, and Texinfo. Configure the variable ~orgtbl-radio-table-templates~ to install templates for other modes. -[fn:158] If the =TBLFM= keyword contains an odd number of dollar +[fn:159] If the =TBLFM= keyword contains an odd number of dollar characters, this may cause problems with Font Lock in LaTeX mode. As shown in the example you can fix this by adding an extra line inside the =comment= environment that is used to balance the dollar @@ -22637,9 +22659,9 @@ * Footnotes a much better solution is to add the =comment= environment to the variable ~LaTeX-verbatim-environments~. -[fn:159] The ~agenda*~ view is the same as ~agenda~ except that it +[fn:160] The ~agenda*~ view is the same as ~agenda~ except that it only considers /appointments/, i.e., scheduled and deadline items that have a time specification =[h]h:mm= in their time-stamps. -[fn:160] Note that, for ~org-odd-levels-only~, a level number +[fn:161] Note that, for ~org-odd-levels-only~, a level number corresponds to order in the hierarchy, not to the number of stars. diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index a7f32671e..d9b41515b 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -296,6 +296,10 @@ headings in HTML export. Use the header argument =:var x=code-block[]= or : #+CALL: fn(x=code-block[]) to pass the contents of a named code block as a string argument. +*** New property =ORG-IMAGE-ACTUAL-WIDTH= for overriding global ~org-image-actual-width~ + +The new property =ORG-IMAGE-ACTUAL-WIDTH= can override the global +variable ~org-image-actual-width~ value for inline images display width. ** New options *** New custom settings =org-icalendar-scheduled-summary-prefix= and =org-icalendar-deadline-summary-prefix= diff --git a/lisp/org.el b/lisp/org.el index a50921519..bba1b5233 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -12224,7 +12224,8 @@ (defconst org-default-properties "EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME" "EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED" "ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE" - "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS") + "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS" + "ORG-IMAGE-ACTUAL-WIDTH") "Some properties that are used by Org mode for various purposes. Being in this list makes sure that they are offered for completion.") @@ -16255,48 +16256,51 @@ (defun org-display-inline-image--width (link) If the value is a float between 0 and 2, it interpreted as that proportion of the text width in the buffer." ;; Apply `org-image-actual-width' specifications. - (cond - ((eq org-image-actual-width t) nil) - ((listp org-image-actual-width) - (let* ((case-fold-search t) - (par (org-element-lineage link '(paragraph))) - (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)") - (par-end (org-element-property :post-affiliated par)) - ;; Try to find an attribute providing a :width. - (attr-width - (when (and par (org-with-point-at - (org-element-property :begin par) - (re-search-forward attr-re par-end t))) - (match-string 1))) - (width - (cond - ;; Treat :width t as if `org-image-actual-width' were t. - ((string= attr-width "t") nil) - ;; Fallback to `org-image-actual-width' if no interprable width is given. - ((or (null attr-width) - (string-match-p "\\`[^0-9]" attr-width)) - (car org-image-actual-width)) - ;; Convert numeric widths to numbers, converting percentages. - ((string-match-p "\\`[0-9.]+%" attr-width) - (/ (string-to-number attr-width) 100.0)) - (t (string-to-number attr-width))))) - (if (and (floatp width) (<= 0.0 width 2.0)) - ;; A float in [0,2] should be interpereted as this portion of - ;; the text width in the window. This works well with cases like - ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width, - ;; as the "0.X" is pulled out as a float. We use 2 as the upper - ;; bound as cases such as 1.2\linewidth are feasible. - (round (* width - (window-pixel-width) - (/ (or (and (bound-and-true-p visual-fill-column-mode) - (or visual-fill-column-width auto-fill-function)) - (when auto-fill-function fill-column) - (- (window-text-width) (line-number-display-width))) - (float (window-total-width))))) - width))) - ((numberp org-image-actual-width) - org-image-actual-width) - (t nil))) + ;; Support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified + ;; width. + (let ((org-image-actual-width (org-property-or-variable-value 'org-image-actual-width))) + (cond + ((eq org-image-actual-width t) nil) + ((listp org-image-actual-width) + (let* ((case-fold-search t) + (par (org-element-lineage link '(paragraph))) + (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)") + (par-end (org-element-property :post-affiliated par)) + ;; Try to find an attribute providing a :width. + (attr-width + (when (and par (org-with-point-at + (org-element-property :begin par) + (re-search-forward attr-re par-end t))) + (match-string 1))) + (width + (cond + ;; Treat :width t as if `org-image-actual-width' were t. + ((string= attr-width "t") nil) + ;; Fallback to `org-image-actual-width' if no interprable width is given. + ((or (null attr-width) + (string-match-p "\\`[^0-9]" attr-width)) + (car org-image-actual-width)) + ;; Convert numeric widths to numbers, converting percentages. + ((string-match-p "\\`[0-9.]+%" attr-width) + (/ (string-to-number attr-width) 100.0)) + (t (string-to-number attr-width))))) + (if (and (floatp width) (<= 0.0 width 2.0)) + ;; A float in [0,2] should be interpereted as this portion of + ;; the text width in the window. This works well with cases like + ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width, + ;; as the "0.X" is pulled out as a float. We use 2 as the upper + ;; bound as cases such as 1.2\linewidth are feasible. + (round (* width + (window-pixel-width) + (/ (or (and (bound-and-true-p visual-fill-column-mode) + (or visual-fill-column-width auto-fill-function)) + (when auto-fill-function fill-column) + (- (window-text-width) (line-number-display-width))) + (float (window-total-width))))) + width))) + ((numberp org-image-actual-width) + org-image-actual-width) + (t nil)))) (defun org-display-inline-remove-overlay (ov after _beg _end &optional _len) "Remove inline-display overlay if a corresponding region is modified." -- 2.35.1 [-- Attachment #3: Type: text/plain, Size: 207 bytes --] -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply related [flat|nested] 43+ messages in thread
* Re: [PATCH v6] New: auto display inline images under subtree when `org-cycle'. 2022-09-20 7:01 ` [PATCH v6] " Ihor Radchenko @ 2022-09-20 11:32 ` Christopher M. Miles [not found] ` <6329c8b0.050a0220.412d.0a6cSMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-20 11:32 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 37144 bytes --] I checked out your patch, it's fine to me. Should be fine to apply. Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> Ok, I will submit the first patch of new property at first. If you're >> going to implement this <TAB> cycling inline image display feature, >> that's great! > > The changes to the manual are confusing after exporting. Note that > > #+vindex: org-image-actual-width will not be visible in html/pdf export. > They only serve as info search nodes and do not appear in the actual > > text. > > I am attaching an alternative version of the patch. Let me know if you > have any objections. > > From 475c607f874e4e78c1e13d15e36ae894b121acad Mon Sep 17 00:00:00 2001 > Message-Id: <475c607f874e4e78c1e13d15e36ae894b121acad.1663656903.git.yantar92@gmail.com> > From: stardiviner <numbchild@gmail.com> > Date: Thu, 15 Sep 2022 17:25:13 +0800 > Subject: [PATCH v6] org.el: Support subtree-level org-image-actual-width > overriding > > * lisp/org.el (org-display-inline-image--width): Support new property > "ORG-IMAGE-ACTUAL-WIDTH" overriding global variable > `org-image-actual-width'. > --- > doc/org-manual.org | 186 +++++++++++++++++++++++++-------------------- > etc/ORG-NEWS | 4 + > lisp/org.el | 90 +++++++++++----------- > 3 files changed, 155 insertions(+), 125 deletions(-) > > diff --git a/doc/org-manual.org b/doc/org-manual.org > index a37b8390c..4c9c087a7 100644 > --- a/doc/org-manual.org > +++ b/doc/org-manual.org > @@ -11314,6 +11314,24 @@ ** Images > startup by configuring the variable > ~org-startup-with-inline-images~[fn:119]. > > + > + #+vindex: org-image-actual-width > + #+cindex: @samp{ORG-IMAGE-ACTUAL-WIDTH}, property > + By default, Org mode displays inline images according to their actual width. > + You can customize the displayed image width using ~org-image-actual-width~ variable (globally) or =ORG-IMAGE-ACTUAL-WIDTH= property (subtree-level)[fn:120]. > + Their value can be the following: > + - (default) Non-nil, use the actual width of images when inlining them. > + - When set to a number, use imagemagick (when available) to set the > + image's width to this value. > + - When set to a number in a list, try to get the width from any > + =#+ATTR.*= keyword if it matches a width specification like: > + #+begin_example > + ,#+ATTR_HTML: :width 300px > + #+end_example > + and fall back on that number if none is found. > + - When set to nil, try to get the width from an =#+ATTR.*= keyword > + and fall back on the original width if none is found. > + > ** Captions > :PROPERTIES: > :DESCRIPTION: Describe tables, images... > @@ -11404,7 +11422,7 @@ ** Creating Footnotes > #+vindex: org-footnote-define-inline > #+vindex: org-footnote-section > Otherwise, create a new footnote. Depending on the variable > - ~org-footnote-define-inline~[fn:120], the definition is placed right > + ~org-footnote-define-inline~[fn:121], the definition is placed right > into the text as part of the reference, or separately into the > location determined by the variable ~org-footnote-section~. > > @@ -11419,7 +11437,7 @@ ** Creating Footnotes > | {{{kbd(d)}}} | Delete the footnote at point, including definition and references. | > > #+vindex: org-footnote-auto-adjust > - Depending on the variable ~org-footnote-auto-adjust~[fn:121], > + Depending on the variable ~org-footnote-auto-adjust~[fn:122], > renumbering and sorting footnotes can be automatic after each > insertion or deletion. > > @@ -11609,7 +11627,7 @@ ** Export Settings > > #+cindex: @samp{DATE}, keyword > #+vindex: org-export-date-timestamp-format > - A date or a time-stamp[fn:122]. > + A date or a time-stamp[fn:123]. > > - =EMAIL= :: > > @@ -11624,7 +11642,7 @@ ** Export Settings > Language to use for translating certain strings > (~org-export-default-language~). With =#+LANGUAGE: fr=, for > example, Org translates =Table of contents= to the French =Table des > - matières=[fn:123]. > + matières=[fn:124]. > > - =SELECT_TAGS= :: > > @@ -11901,7 +11919,7 @@ ** Table of Contents > #+cindex: excluding entries from table of contents > #+cindex: table of contents, exclude entries > Org includes both numbered and unnumbered headlines in the table of > -contents[fn:124]. If you need to exclude an unnumbered headline, > +contents[fn:125]. If you need to exclude an unnumbered headline, > along with all its children, set the =UNNUMBERED= property to =notoc= > value. > > @@ -12020,7 +12038,7 @@ ** Include Files > | =#+INCLUDE: "~/.emacs" :lines "10-"= | Include lines from 10 to EOF | > > Inclusions may specify a file-link to extract an object matched by > -~org-link-search~[fn:125] (see [[*Search Options in File Links]]). The > +~org-link-search~[fn:126] (see [[*Search Options in File Links]]). The > ranges for =:lines= keyword are relative to the requested element. > Therefore, > > @@ -12060,7 +12078,7 @@ ** Macro Replacement > : #+MACRO: name replacement text; $1, $2 are arguments > > #+texinfo: @noindent > -which can be referenced using ={{{name(arg1, arg2)}}}=[fn:126]. For > +which can be referenced using ={{{name(arg1, arg2)}}}=[fn:127]. For > example > > #+begin_example > @@ -12179,7 +12197,7 @@ ** Comment Lines > Finally, a =COMMENT= keyword at the beginning of an entry, but after > any other keyword or priority cookie, comments out the entire subtree. > In this case, the subtree is not exported and no code block within it > -is executed either[fn:127]. The command below helps changing the > +is executed either[fn:128]. The command below helps changing the > comment status of a headline. > > - {{{kbd(C-c ;)}}} (~org-toggle-comment~) :: > @@ -12451,7 +12469,7 @@ *** Frames and Blocks in Beamer > > - Org exports a Beamer frame's objects as block environments. Org can > enforce wrapping in special block types when =BEAMER_ENV= property > - is set[fn:128]. For valid values see > + is set[fn:129]. For valid values see > ~org-beamer-environments-default~. To add more values, see > ~org-beamer-environments-extra~. > #+vindex: org-beamer-environments-default > @@ -13039,7 +13057,7 @@ *** Math formatting in HTML export > #+vindex: org-html-mathjax-options~ > LaTeX math snippets (see [[*LaTeX fragments]]) can be displayed in two > different ways on HTML pages. The default is to use the [[https://www.mathjax.org][MathJax]], > -which should work out of the box with Org[fn:129][fn:130]. Some MathJax > +which should work out of the box with Org[fn:130][fn:131]. Some MathJax > display options can be configured via ~org-html-mathjax-options~, or > in the buffer. For example, with the following settings, > > @@ -13051,7 +13069,7 @@ *** Math formatting in HTML export > #+texinfo: @noindent > equation labels are displayed on the left margin and equations are > five em from the left margin. In addition, it loads the two MathJax > -extensions =cancel.js= and =noErrors.js=[fn:131]. > +extensions =cancel.js= and =noErrors.js=[fn:132]. > > #+vindex: org-html-mathjax-template > See the docstring of ~org-html-mathjax-options~ for all supported > @@ -13114,7 +13132,7 @@ *** CSS support > #+vindex: org-export-html-todo-kwd-class-prefix > #+vindex: org-export-html-tag-class-prefix > You can modify the CSS style definitions for the exported file. The > -HTML exporter assigns the following special CSS classes[fn:132] to > +HTML exporter assigns the following special CSS classes[fn:133] to > appropriate parts of the document---your style specifications may > change these, in addition to any of the standard classes like for > headlines, tables, etc. > @@ -13351,7 +13369,7 @@ *** LaTeX/PDF export commands > Org file. See the docstring for the > ~org-latex-default-packages-alist~ for loading packages with certain > compilers. Also see ~org-latex-bibtex-compiler~ to set the > -bibliography compiler[fn:133]. > +bibliography compiler[fn:134]. > > *** LaTeX specific export settings > :PROPERTIES: > @@ -13889,7 +13907,7 @@ *** Source blocks in LaTeX export > packages for customization of that specific source block. In the > example below, the =:options= are set for Engraved or Minted. Minted > is a source code highlighting LaTeX package with many configurable > -options[fn:134]. Both Minted and Engraved are built on [[https://www.ctan.org/pkg/fvextra][fvextra]], and > +options[fn:135]. Both Minted and Engraved are built on [[https://www.ctan.org/pkg/fvextra][fvextra]], and > so support many of the same options. > > #+begin_example > @@ -14142,7 +14160,7 @@ ** OpenDocument Text Export > > The ODT export back-end handles creating of OpenDocument Text (ODT) > format. Documents created by this exporter use the > -{{{cite(OpenDocument-v1.2 specification)}}}[fn:135] and are compatible > +{{{cite(OpenDocument-v1.2 specification)}}}[fn:136] and are compatible > with LibreOffice 3.4. > > *** Pre-requisites for ODT export > @@ -14543,7 +14561,7 @@ **** LaTeX math snippets > variables ~org-latex-to-mathml-convert-command~ and > ~org-latex-to-mathml-jar-file~. > > - If you prefer to use MathToWeb[fn:136] as your converter, you can > + If you prefer to use MathToWeb[fn:137] as your converter, you can > configure the above variables as shown below. > > #+begin_src emacs-lisp > @@ -14554,7 +14572,7 @@ **** LaTeX math snippets > #+end_src > > #+texinfo: @noindent > - or, to use LaTeXML[fn:137] instead, > + or, to use LaTeXML[fn:138] instead, > > #+begin_src emacs-lisp > (setq org-latex-to-mathml-convert-command > @@ -14873,7 +14891,7 @@ **** Customizing tables in ODT export > tables, see [[*Tables in ODT export]]. > > This feature closely mimics the way table templates are defined in the > -OpenDocument-v1.2 specification[fn:138]. > +OpenDocument-v1.2 specification[fn:139]. > > #+vindex: org-odt-table-styles > For quick preview of this feature, install the settings below and export the > @@ -14907,7 +14925,7 @@ **** Customizing tables in ODT export > > To use this feature proceed as follows: > > -1. Create a table template[fn:139]. > +1. Create a table template[fn:140]. > > A table template is set of =table-cell= and =paragraph= styles for > each of the following table cell categories: > @@ -14946,7 +14964,7 @@ **** Customizing tables in ODT export > =</office:automatic-styles>= element of the content template file > (see [[x-orgodtcontenttemplate-xml][Factory styles]]). > > -2. Define a table style[fn:140]. > +2. Define a table style[fn:141]. > > #+vindex: org-odt-table-styles > To define a table style, create an entry for the style in the > @@ -16177,7 +16195,7 @@ *** Publishing action > ~org-org-publish-to-org~. This produces =file.org= and puts it in the > publishing directory. If you want a htmlized version of this file, > set the parameter ~:htmlized-source~ to ~t~. It produces > -=file.org.html= in the publishing directory[fn:141]. > +=file.org.html= in the publishing directory[fn:142]. > > Other files like images only need to be copied to the publishing > destination; for this you can use ~org-publish-attachment~. For > @@ -17795,13 +17813,13 @@ *** How to evaluate source code > #+kindex: C-c C-v e > #+findex: org-babel-execute-src-block > Org provides many ways to execute code blocks. {{{kbd(C-c C-c)}}} or > -{{{kbd(C-c C-v e)}}} with the point on a code block[fn:142] calls the > +{{{kbd(C-c C-v e)}}} with the point on a code block[fn:143] calls the > ~org-babel-execute-src-block~ function, which executes the code in the > block, collects the results, and inserts them in the buffer. > > #+cindex: @samp{CALL}, keyword > #+vindex: org-babel-inline-result-wrap > -By calling a named code block[fn:143] from an Org mode buffer or > +By calling a named code block[fn:144] from an Org mode buffer or > a table. Org can call the named code blocks from the current Org mode > buffer or from the "Library of Babel" (see [[*Library of Babel]]). > > @@ -18002,7 +18020,7 @@ *** Collection > > - =value= :: > > - Default for most Babel libraries[fn:143]. Functional mode. Org > + Default for most Babel libraries[fn:144]. Functional mode. Org > gets the value by wrapping the code in a function definition in the > language of the source block. That is why when using =:results > value=, code should execute like a function and return a value. For > @@ -18731,7 +18749,7 @@ ** Noweb Reference Syntax > > #+cindex: @samp{noweb-ref}, header argument > Source code blocks can include references to other source code blocks, > -using a noweb[fn:144] style syntax: > +using a noweb[fn:145] style syntax: > > : <<CODE-BLOCK-ID>> > > @@ -19259,7 +19277,7 @@ ** Structure Templates > ~org-structure-template-alist~ and ~org-tempo-keywords-alist~. For > example, {{{kbd(< s TAB)}}} creates a code block. Enable it by > customizing ~org-modules~ or add =(require 'org-tempo)= to your Emacs > -init file[fn:145]. > +init file[fn:146]. > > #+attr_texinfo: :columns 0.1 0.9 > | {{{kbd(a)}}} | =#+BEGIN_EXPORT ascii= ... =#+END_EXPORT= | > @@ -19339,7 +19357,7 @@ *** Org Indent Mode > To display the buffer in the indented view, activate Org Indent minor > mode, using {{{kbd(M-x org-indent-mode)}}}. Text lines that are not > headlines are prefixed with virtual spaces to vertically align with > -the headline text[fn:146]. > +the headline text[fn:147]. > > #+vindex: org-indent-indentation-per-level > To make more horizontal space, the headlines are shifted by two > @@ -19367,9 +19385,9 @@ *** Hard indentation > > It is possible to use hard spaces to achieve the indentation instead, > if the bare ASCII file should have the indented look also outside > -Emacs[fn:147]. With Org's support, you have to indent all lines to > +Emacs[fn:148]. With Org's support, you have to indent all lines to > line up with the outline headers. You would use these > -settings[fn:148]: > +settings[fn:149]: > > #+begin_src emacs-lisp > (setq org-adapt-indentation t > @@ -19640,7 +19658,7 @@ ** Summary of In-Buffer Settings > > #+vindex: org-startup-indented > Dynamic virtual indentation is controlled by the variable > - ~org-startup-indented~[fn:149]. > + ~org-startup-indented~[fn:150]. > > | =indent= | Start with Org Indent mode turned on. | > | =noindent= | Start with Org Indent mode turned off. | > @@ -20498,7 +20516,7 @@ *** Setting up the staging area > > #+vindex: org-mobile-directory > The mobile application needs access to a file directory on > -a server[fn:150] to interact with Emacs. Pass its location through > +a server[fn:151] to interact with Emacs. Pass its location through > the ~org-mobile-directory~ variable. If you can mount that directory > locally just set the variable to point to that directory: > > @@ -20519,7 +20537,7 @@ *** Setting up the staging area > requires OpenSSL installed on the local computer. To turn on > encryption, set the same password in the mobile application and in > Emacs. Set the password in the variable > -~org-mobile-use-encryption~[fn:151]. Note that even after the mobile > +~org-mobile-use-encryption~[fn:152]. Note that even after the mobile > application encrypts the file contents, the file name remains visible > on the file systems of the local computer, the server, and the mobile > device. > @@ -20535,15 +20553,15 @@ *** Pushing to the mobile application > ~org-mobile-files~ into the staging area. Files include agenda files > (as listed in ~org-agenda-files~). Customize ~org-mobile-files~ to > add other files. File names are staged with paths relative to > -~org-directory~, so all files should be inside this directory[fn:152]. > +~org-directory~, so all files should be inside this directory[fn:153]. > > Push creates a special Org file =agendas.org= with custom agenda views > -defined by the user[fn:153]. > +defined by the user[fn:154]. > > Finally, Org writes the file =index.org=, containing links to other > files. The mobile application reads this file first from the server > to determine what other files to download for agendas. For faster > -downloads, it is expected to only read files whose checksums[fn:154] > +downloads, it is expected to only read files whose checksums[fn:155] > have changed. > > *** Pulling from the mobile application > @@ -20560,7 +20578,7 @@ *** Pulling from the mobile application > > 1. > #+vindex: org-mobile-inbox-for-pull > - Org moves all entries found in =mobileorg.org=[fn:155] and appends > + Org moves all entries found in =mobileorg.org=[fn:156] and appends > them to the file pointed to by the variable > ~org-mobile-inbox-for-pull~. It should reside neither in the > staging area nor on the server. Each captured entry and each > @@ -20854,9 +20872,9 @@ *** A LaTeX example of radio tables > #+cindex: @LaTeX{}, and Orgtbl mode > > To wrap a source table in LaTeX, use the =comment= environment > -provided by =comment.sty=[fn:156]. To activate it, put > +provided by =comment.sty=[fn:157]. To activate it, put > ~\usepackage{comment}~ in the document header. Orgtbl mode inserts > -a radio table skeleton[fn:157] with the command {{{kbd(M-x > +a radio table skeleton[fn:158] with the command {{{kbd(M-x > orgtbl-insert-radio-table)}}}, which prompts for a table name. For > example, if =salesfigures= is the name, the template inserts: > > @@ -20875,7 +20893,7 @@ *** A LaTeX example of radio tables > ~orgtbl-to-latex~ to convert the table to LaTeX format, then insert > the table at the target (receive) location named =salesfigures=. Now > the table is ready for data entry. It can even use spreadsheet > -features[fn:158]: > +features[fn:159]: > > #+begin_example > % BEGIN RECEIVE ORGTBL salesfigures > @@ -21091,7 +21109,7 @@ ** Special Agenda Views > #+vindex: org-agenda-skip-function > #+vindex: org-agenda-skip-function-global > Org provides a special hook to further limit items in agenda views: > -~agenda~, ~agenda*~[fn:159], ~todo~, ~alltodo~, ~tags~, ~tags-todo~, > +~agenda~, ~agenda*~[fn:160], ~todo~, ~alltodo~, ~tags~, ~tags-todo~, > ~tags-tree~. Specify a custom function that tests inclusion of every > matched item in the view. This function can also skip as much as is > needed. > @@ -21134,7 +21152,7 @@ ** Special Agenda Views > #+vindex: org-agenda-skip-function > Search for entries with a limit set on levels for the custom search. > This is a general approach to creating custom searches in Org. To > -include all levels, use =LEVEL>0=[fn:160]. Then to selectively pick > +include all levels, use =LEVEL>0=[fn:161]. Then to selectively pick > the matched entries, use ~org-agenda-skip-function~, which also > accepts Lisp forms, such as ~org-agenda-skip-entry-if~ and > ~org-agenda-skip-subtree-if~. For example: > @@ -22258,6 +22276,7 @@ * Footnotes > #+findex: org-anniversary > #+findex: org-cyclic > #+findex: org-block > + > [fn:60] When working with the standard diary expression functions, you > need to be very careful with the order of the arguments. That order > depends evilly on the variable ~calendar-date-style~. For example, to > @@ -22496,140 +22515,143 @@ * Footnotes > within a buffer with the =STARTUP= options =inlineimages= and > =noinlineimages=. > > -[fn:120] The corresponding in-buffer setting is: =#+STARTUP: fninline= > +[fn:120] The width can be customized in Emacs >= 24.1, built with > +imagemagick support. > + > +[fn:121] The corresponding in-buffer setting is: =#+STARTUP: fninline= > or =#+STARTUP: nofninline=. > > -[fn:121] The corresponding in-buffer options are =#+STARTUP: fnadjust= > +[fn:122] The corresponding in-buffer options are =#+STARTUP: fnadjust= > and =#+STARTUP: nofnadjust=. > > -[fn:122] The variable ~org-export-date-timestamp-format~ defines how > +[fn:123] The variable ~org-export-date-timestamp-format~ defines how > this timestamp are exported. > > -[fn:123] For export to LaTeX format---or LaTeX-related formats such as > +[fn:124] For export to LaTeX format---or LaTeX-related formats such as > Beamer---, the =org-latex-package-alist= variable needs further > configuration. See [[LaTeX specific export settings]]. > > -[fn:124] At the moment, some export back-ends do not obey this > +[fn:125] At the moment, some export back-ends do not obey this > specification. For example, LaTeX export excludes every unnumbered > headline from the table of contents. > > -[fn:125] Note that ~org-link-search-must-match-exact-headline~ is > +[fn:126] Note that ~org-link-search-must-match-exact-headline~ is > locally bound to non-~nil~. Therefore, ~org-link-search~ only matches > headlines and named elements. > > -[fn:126] Since commas separate the arguments, commas within arguments > +[fn:127] Since commas separate the arguments, commas within arguments > have to be escaped with the backslash character. So only those > backslash characters before a comma need escaping with another > backslash character. > > -[fn:127] For a less drastic behavior, consider using a select tag (see > +[fn:128] For a less drastic behavior, consider using a select tag (see > [[*Export Settings]]) instead. > > -[fn:128] If =BEAMER_ENV= is set, Org export adds =B_environment= tag > +[fn:129] If =BEAMER_ENV= is set, Org export adds =B_environment= tag > to make it visible. The tag serves as a visual aid and has no > semantic relevance. > > -[fn:129] By default Org loads MathJax from [[https://cdnjs.com][cdnjs.com]] as recommended by > +[fn:130] By default Org loads MathJax from [[https://cdnjs.com][cdnjs.com]] as recommended by > [[https://www.mathjax.org][MathJax]]. > > -[fn:130] Please note that exported formulas are part of an HTML > +[fn:131] Please note that exported formulas are part of an HTML > document, and that signs such as =<=, =>=, or =&= have special > meanings. See [[http://docs.mathjax.org/en/latest/input/tex/html.html#tex-and-latex-in-html-documents][MathJax TeX and LaTeX in HTML documents]]. > > -[fn:131] See [[http://docs.mathjax.org/en/latest/input/tex/extensions.html#tex-and-latex-extensions][TeX and LaTeX extensions]] in the [[http://docs.mathjax.org][MathJax manual]] to learn > +[fn:132] See [[http://docs.mathjax.org/en/latest/input/tex/extensions.html#tex-and-latex-extensions][TeX and LaTeX extensions]] in the [[http://docs.mathjax.org][MathJax manual]] to learn > about extensions. > > -[fn:132] If the classes on TODO keywords and tags lead to conflicts, > +[fn:133] If the classes on TODO keywords and tags lead to conflicts, > use the variables ~org-html-todo-kwd-class-prefix~ and > ~org-html-tag-class-prefix~ to make them unique. > > -[fn:133] This does not allow setting different bibliography compilers > +[fn:134] This does not allow setting different bibliography compilers > for different files. However, "smart" LaTeX compilation systems, such > as latexmk, can select the correct bibliography compiler. > > -[fn:134] Minted uses an external Python package for code highlighting, > +[fn:135] Minted uses an external Python package for code highlighting, > which requires the flag =-shell-escape= to be added to > ~org-latex-pdf-process~. > > -[fn:135] See [[http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html][Open Document Format for Office Applications > +[fn:136] See [[http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html][Open Document Format for Office Applications > (OpenDocument) Version 1.2]]. > > -[fn:136] See [[http://www.mathtoweb.com/cgi-bin/mathtoweb_home.pl][MathToWeb]]. > +[fn:137] See [[http://www.mathtoweb.com/cgi-bin/mathtoweb_home.pl][MathToWeb]]. > > -[fn:137] See [[http://dlmf.nist.gov/LaTeXML/]]. > +[fn:138] See [[http://dlmf.nist.gov/LaTeXML/]]. > > -[fn:138] [[http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html][OpenDocument-v1.2 Specification]] > +[fn:139] [[http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html][OpenDocument-v1.2 Specification]] > > -[fn:139] See the =<table:table-template>= element of the > +[fn:140] See the =<table:table-template>= element of the > OpenDocument-v1.2 specification. > > -[fn:140] See the attributes =table:template-name=, > +[fn:141] See the attributes =table:template-name=, > =table:use-first-row-styles=, =table:use-last-row-styles=, > =table:use-first-column-styles=, =table:use-last-column-styles=, > =table:use-banding-rows-styles=, and =table:use-banding-column-styles= > of the =<table:table>= element in the OpenDocument-v1.2 specification. > > -[fn:141] If the publishing directory is the same as the source > +[fn:142] If the publishing directory is the same as the source > directory, =file.org= is exported as =file.org.org=, so you probably > do not want to do this. > > -[fn:142] The option ~org-babel-no-eval-on-ctrl-c-ctrl-c~ can be used > +[fn:143] The option ~org-babel-no-eval-on-ctrl-c-ctrl-c~ can be used > to remove code evaluation from the {{{kbd(C-c C-c)}}} key binding. > > -[fn:143] Actually, the constructs =call_<name>()= and =src_<lang>{}= > +[fn:144] Actually, the constructs =call_<name>()= and =src_<lang>{}= > are not evaluated when they appear in a keyword (see [[*Summary of > In-Buffer Settings]]). > > -[fn:144] For noweb literate programming details, see > +[fn:145] For noweb literate programming details, see > http://www.cs.tufts.edu/~nr/noweb/. > > -[fn:145] For more information, please refer to the commentary section > +[fn:146] For more information, please refer to the commentary section > in =org-tempo.el=. > > -[fn:146] Org Indent mode also sets ~wrap-prefix~ correctly for > +[fn:147] Org Indent mode also sets ~wrap-prefix~ correctly for > indenting and wrapping long lines of headlines or text. This minor > mode also handles Visual Line mode and directly applied settings > through ~word-wrap~. > > -[fn:147] This works, but requires extra effort. Org Indent mode is > +[fn:148] This works, but requires extra effort. Org Indent mode is > more convenient for most applications. > > -[fn:148] ~org-adapt-indentation~ can also be set to ='headline-data=, > +[fn:149] ~org-adapt-indentation~ can also be set to ='headline-data=, > in which case only data lines below the headline will be indented. > > -[fn:149] Note that Org Indent mode also sets the ~wrap-prefix~ > +[fn:150] Note that Org Indent mode also sets the ~wrap-prefix~ > property, such that Visual Line mode (or purely setting ~word-wrap~) > wraps long lines, including headlines, correctly indented. > > -[fn:150] For a server to host files, consider using a WebDAV server, > +[fn:151] For a server to host files, consider using a WebDAV server, > such as [[https://nextcloud.com][Nextcloud]]. Additional help is at this [[https://orgmode.org/worg/org-faq.html#mobileorg_webdav][FAQ entry]]. > > -[fn:151] If Emacs is configured for safe storing of passwords, then > +[fn:152] If Emacs is configured for safe storing of passwords, then > configure the variable ~org-mobile-encryption-password~; please read > the docstring of that variable. > > -[fn:152] Symbolic links in ~org-directory~ need to have the same name > +[fn:153] Symbolic links in ~org-directory~ need to have the same name > as their targets. > > -[fn:153] While creating the agendas, Org mode forces =ID= properties > +[fn:154] While creating the agendas, Org mode forces =ID= properties > on all referenced entries, so that these entries can be uniquely > identified if Org Mobile flags them for further action. To avoid > setting properties configure the variable > ~org-mobile-force-id-on-agenda-items~ to ~nil~. Org mode then relies > on outline paths, assuming they are unique. > > -[fn:154] Checksums are stored automatically in the file > +[fn:155] Checksums are stored automatically in the file > =checksums.dat=. > > -[fn:155] The file will be empty after this operation. > +[fn:156] The file will be empty after this operation. > > -[fn:156] https://www.ctan.org/pkg/comment > +[fn:157] https://www.ctan.org/pkg/comment > > -[fn:157] By default this works only for LaTeX, HTML, and Texinfo. > +[fn:158] By default this works only for LaTeX, HTML, and Texinfo. > Configure the variable ~orgtbl-radio-table-templates~ to install > templates for other modes. > > -[fn:158] If the =TBLFM= keyword contains an odd number of dollar > +[fn:159] If the =TBLFM= keyword contains an odd number of dollar > characters, this may cause problems with Font Lock in LaTeX mode. As > shown in the example you can fix this by adding an extra line inside > the =comment= environment that is used to balance the dollar > @@ -22637,9 +22659,9 @@ * Footnotes > a much better solution is to add the =comment= environment to the > variable ~LaTeX-verbatim-environments~. > > -[fn:159] The ~agenda*~ view is the same as ~agenda~ except that it > +[fn:160] The ~agenda*~ view is the same as ~agenda~ except that it > only considers /appointments/, i.e., scheduled and deadline items that > have a time specification =[h]h:mm= in their time-stamps. > > -[fn:160] Note that, for ~org-odd-levels-only~, a level number > +[fn:161] Note that, for ~org-odd-levels-only~, a level number > corresponds to order in the hierarchy, not to the number of stars. > diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS > index a7f32671e..d9b41515b 100644 > --- a/etc/ORG-NEWS > +++ b/etc/ORG-NEWS > @@ -296,6 +296,10 @@ headings in HTML export. > Use the header argument =:var x=code-block[]= or > : #+CALL: fn(x=code-block[]) > to pass the contents of a named code block as a string argument. > +*** New property =ORG-IMAGE-ACTUAL-WIDTH= for overriding global ~org-image-actual-width~ > + > +The new property =ORG-IMAGE-ACTUAL-WIDTH= can override the global > +variable ~org-image-actual-width~ value for inline images display width. > > ** New options > *** New custom settings =org-icalendar-scheduled-summary-prefix= and =org-icalendar-deadline-summary-prefix= > diff --git a/lisp/org.el b/lisp/org.el > index a50921519..bba1b5233 100644 > --- a/lisp/org.el > +++ b/lisp/org.el > @@ -12224,7 +12224,8 @@ (defconst org-default-properties > "EXPORT_OPTIONS" "EXPORT_TEXT" "EXPORT_FILE_NAME" > "EXPORT_TITLE" "EXPORT_AUTHOR" "EXPORT_DATE" "UNNUMBERED" > "ORDERED" "NOBLOCKING" "COOKIE_DATA" "LOG_INTO_DRAWER" "REPEAT_TO_STATE" > - "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS") > + "CLOCK_MODELINE_TOTAL" "STYLE" "HTML_CONTAINER_CLASS" > + "ORG-IMAGE-ACTUAL-WIDTH") > "Some properties that are used by Org mode for various purposes. > Being in this list makes sure that they are offered for completion.") > > @@ -16255,48 +16256,51 @@ (defun org-display-inline-image--width (link) > If the value is a float between 0 and 2, it interpreted as that proportion > of the text width in the buffer." > ;; Apply `org-image-actual-width' specifications. > - (cond > - ((eq org-image-actual-width t) nil) > - ((listp org-image-actual-width) > - (let* ((case-fold-search t) > - (par (org-element-lineage link '(paragraph))) > - (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)") > - (par-end (org-element-property :post-affiliated par)) > - ;; Try to find an attribute providing a :width. > - (attr-width > - (when (and par (org-with-point-at > - (org-element-property :begin par) > - (re-search-forward attr-re par-end t))) > - (match-string 1))) > - (width > - (cond > - ;; Treat :width t as if `org-image-actual-width' were t. > - ((string= attr-width "t") nil) > - ;; Fallback to `org-image-actual-width' if no interprable width is given. > - ((or (null attr-width) > - (string-match-p "\\`[^0-9]" attr-width)) > - (car org-image-actual-width)) > - ;; Convert numeric widths to numbers, converting percentages. > - ((string-match-p "\\`[0-9.]+%" attr-width) > - (/ (string-to-number attr-width) 100.0)) > - (t (string-to-number attr-width))))) > - (if (and (floatp width) (<= 0.0 width 2.0)) > - ;; A float in [0,2] should be interpereted as this portion of > - ;; the text width in the window. This works well with cases like > - ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width, > - ;; as the "0.X" is pulled out as a float. We use 2 as the upper > - ;; bound as cases such as 1.2\linewidth are feasible. > - (round (* width > - (window-pixel-width) > - (/ (or (and (bound-and-true-p visual-fill-column-mode) > - (or visual-fill-column-width auto-fill-function)) > - (when auto-fill-function fill-column) > - (- (window-text-width) (line-number-display-width))) > - (float (window-total-width))))) > - width))) > - ((numberp org-image-actual-width) > - org-image-actual-width) > - (t nil))) > + ;; Support subtree-level property "ORG-IMAGE-ACTUAL-WIDTH" specified > + ;; width. > + (let ((org-image-actual-width (org-property-or-variable-value 'org-image-actual-width))) > + (cond > + ((eq org-image-actual-width t) nil) > + ((listp org-image-actual-width) > + (let* ((case-fold-search t) > + (par (org-element-lineage link '(paragraph))) > + (attr-re "^[ \t]*#\\+attr_.*?: +.*?:width +\\(\\S-+\\)") > + (par-end (org-element-property :post-affiliated par)) > + ;; Try to find an attribute providing a :width. > + (attr-width > + (when (and par (org-with-point-at > + (org-element-property :begin par) > + (re-search-forward attr-re par-end t))) > + (match-string 1))) > + (width > + (cond > + ;; Treat :width t as if `org-image-actual-width' were t. > + ((string= attr-width "t") nil) > + ;; Fallback to `org-image-actual-width' if no interprable width is given. > + ((or (null attr-width) > + (string-match-p "\\`[^0-9]" attr-width)) > + (car org-image-actual-width)) > + ;; Convert numeric widths to numbers, converting percentages. > + ((string-match-p "\\`[0-9.]+%" attr-width) > + (/ (string-to-number attr-width) 100.0)) > + (t (string-to-number attr-width))))) > + (if (and (floatp width) (<= 0.0 width 2.0)) > + ;; A float in [0,2] should be interpereted as this portion of > + ;; the text width in the window. This works well with cases like > + ;; #+attr_latex: :width 0.X\{line,page,column,etc.}width, > + ;; as the "0.X" is pulled out as a float. We use 2 as the upper > + ;; bound as cases such as 1.2\linewidth are feasible. > + (round (* width > + (window-pixel-width) > + (/ (or (and (bound-and-true-p visual-fill-column-mode) > + (or visual-fill-column-width auto-fill-function)) > + (when auto-fill-function fill-column) > + (- (window-text-width) (line-number-display-width))) > + (float (window-total-width))))) > + width))) > + ((numberp org-image-actual-width) > + org-image-actual-width) > + (t nil)))) > > (defun org-display-inline-remove-overlay (ov after _beg _end &optional _len) > "Remove inline-display overlay if a corresponding region is modified." > -- > 2.35.1 -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
[parent not found: <6329c8b0.050a0220.412d.0a6cSMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH v6] New: auto display inline images under subtree when `org-cycle'. [not found] ` <6329c8b0.050a0220.412d.0a6cSMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-09-21 7:54 ` Ihor Radchenko 2022-09-28 12:55 ` [PATCH 2-v1] " Christopher M. Miles [not found] ` <633454e3.050a0220.7278b.1fa5SMTPIN_ADDED_BROKEN@mx.google.com> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-09-21 7:54 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: > I checked out your patch, it's fine to me. Should be fine to apply. Done. Applied onto main. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=95df82c5fcf926088da2aaab9354a902956ae881 Going back to cycling inline image visibility now. I think that the first step should be extending `org-remove-inline-images' and `org-display-inline-images' to work on regions. `org-display-inline-images' already provides BEG and END optional arguments, but it currently clears all the images in buffer unconditionally. We will need to make `org-remove-inline-images' work on region and modify `org-display-inline-images' to not affect images outside the provided region. Then, we can modify `org-toggle-inline-images' accordingly and make use of it in org-cycle.el to toggle images in section/subtree. -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 43+ messages in thread
* [PATCH 2-v1] New: auto display inline images under subtree when `org-cycle'. 2022-09-21 7:54 ` Ihor Radchenko @ 2022-09-28 12:55 ` Christopher M. Miles [not found] ` <633454e3.050a0220.7278b.1fa5SMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-28 12:55 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 376 bytes --] Ok, I created the patch for subtree cycling display inline images. Tested by edebug when org cycling, it should works fine. I don't know how to write test for this. But I got a little problem: When ~org-fold-core-style~ is ~'overlays~, the ~delete-overlay~ will cause subtree unfolded. More detailed check out the "org.el" function ~org-remove-inline-images~ in my patch. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Support-auto-display-inline-images-when-cycli.patch --] [-- Type: text/x-patch, Size: 6781 bytes --] From 173772d166c9974db1a76f59fe58988fe8da401a Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Wed, 28 Sep 2022 20:46:52 +0800 Subject: [PATCH] org.el: Support auto display inline images when cycling * lisp/org.el (org-toggle-inline-images): Support region. (org-display-inline-images): Fix refresh argument logic. (org-remove-inline-images): Support region. * lisp/org-keys.el (org-toggle-inline-images): Update arguments. * lisp/org-cycle.el (org-cycle-inline-images-display): Add new option to control whether auto display inline images when cycling. (org-cycle-display-inline-images): Add new hook function to auto display inline images when cycling. (org-cycle-hook): Add `org-cycle-display-inline-images' into cycling hook by default. --- lisp/org-cycle.el | 36 ++++++++++++++++++++++++++++++++++-- lisp/org-keys.el | 2 +- lisp/org.el | 25 +++++++++++++++++-------- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el index 656ca83f2..da7a7a34e 100644 --- a/lisp/org-cycle.el +++ b/lisp/org-cycle.el @@ -208,8 +208,9 @@ the values `folded', `children', or `subtree'." :type 'hook) (defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees - org-cycle-show-empty-lines - org-cycle-optimize-window-after-visibility-change) + org-cycle-show-empty-lines + org-cycle-optimize-window-after-visibility-change + org-cycle-display-inline-images) "Hook that is run after `org-cycle' has changed the buffer visibility. The function(s) in this hook must accept a single argument which indicates the new state that was set by the most recent `org-cycle' command. The @@ -229,6 +230,12 @@ normal outline commands like `show-all', but not with the cycling commands." :group 'org-cycle :type 'boolean) +(defcustom org-cycle-inline-images-display nil + "Non-nil means auto display inline images under subtree when cycling." + :group 'org-startup + :group 'org-cycle + :type 'boolean) + (defvar org-cycle-tab-first-hook nil "Hook for functions to attach themselves to TAB. See `org-ctrl-c-ctrl-c-hook' for more information. @@ -776,6 +783,31 @@ STATE should be one of the symbols listed in the docstring of "Subtree is archived and stays closed. Use \ `\\[org-cycle-force-archived]' to cycle it anyway.")))))) +(defun org-cycle-display-inline-images (state) + "Auto display inline images under subtree when cycling. +It works when `org-cycle-inline-images-display' is non-nil." + (when org-cycle-inline-images-display + (pcase state + ('children + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent + ;; headline to first child headline which reference to + ;; upper let-binding `org-next-visible-heading'. + (org-display-inline-images + nil nil + (point-min) (progn (org-next-visible-heading 1) (point)))))) + ('subtree + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, also inline display images under all sub-headlines. + (org-display-inline-images nil nil (point-min) (point-max))))) + ('folded + (org-narrow-to-subtree) + (org-remove-inline-images (point-min) (point-max)))))) + (provide 'org-cycle) ;;; org-cycle.el ends here diff --git a/lisp/org-keys.el b/lisp/org-keys.el index d65379a72..79e34cbd1 100644 --- a/lisp/org-keys.el +++ b/lisp/org-keys.el @@ -204,7 +204,7 @@ (declare-function org-toggle-radio-button "org" (&optional arg)) (declare-function org-toggle-comment "org" ()) (declare-function org-toggle-fixed-width "org" ()) -(declare-function org-toggle-inline-images "org" (&optional include-linked)) +(declare-function org-toggle-inline-images "org" (&optional include-linked beg end)) (declare-function org-latex-preview "org" (&optional arg)) (declare-function org-toggle-narrow-to-subtree "org" ()) (declare-function org-toggle-ordered-property "org" ()) diff --git a/lisp/org.el b/lisp/org.el index 036384a04..e7eba25cc 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -16071,16 +16071,16 @@ SNIPPETS-P indicates if this is run to create snippet images for HTML." (defvar-local org-inline-image-overlays nil) -(defun org-toggle-inline-images (&optional include-linked) +(defun org-toggle-inline-images (&optional include-linked beg end) "Toggle the display of inline images. INCLUDE-LINKED is passed to `org-display-inline-images'." (interactive "P") (if org-inline-image-overlays (progn - (org-remove-inline-images) + (org-remove-inline-images beg end) (when (called-interactively-p 'interactive) (message "Inline image display turned off"))) - (org-display-inline-images include-linked) + (org-display-inline-images include-linked nil beg end) (when (called-interactively-p 'interactive) (message (if org-inline-image-overlays (format "%d images displayed inline" @@ -16170,8 +16170,8 @@ BEG and END define the considered part. They default to the buffer boundaries with possible narrowing." (interactive "P") (when (display-graphic-p) - (unless refresh - (org-remove-inline-images) + (when refresh + (org-remove-inline-images beg end) (when (fboundp 'clear-image-cache) (clear-image-cache))) (let ((end (or end (point-max)))) (org-with-point-at (or beg (point-min)) @@ -16322,11 +16322,20 @@ buffer boundaries with possible narrowing." (delete ov org-inline-image-overlays) (delete-overlay ov)))) -(defun org-remove-inline-images () +(defun org-remove-inline-images (&optional beg end) "Remove inline display of images." (interactive) - (mapc #'delete-overlay org-inline-image-overlays) - (setq org-inline-image-overlays nil)) + (let* ((beg (or beg (point-min))) + (end (or end (point-max))) + (overlays (overlays-in beg end))) + (dolist (ov overlays) + (delete ov org-inline-image-overlays)) + (mapc #'delete-overlay overlays) + ;; FIXME: `org-cycle-display-inline-images' can't fold because `delete-overlay' will unfold subtree. + (when (eq org-fold-core-style 'overlays) + ;; FIXME: don't know how to get the correct `spec'. + (let ((spec (alist-get 'org-fold-hidden org-fold-core--specs))) + (org-fold-core-region beg end t spec))))) (defvar org-self-insert-command-undo-counter 0) (defvar org-speed-command nil) -- 2.37.2 [-- Attachment #1.3: Type: text/plain, Size: 1240 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> I checked out your patch, it's fine to me. Should be fine to apply. > > Done. > Applied onto main. > https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=95df82c5fcf926088da2aaab9354a902956ae881 > > Going back to cycling inline image visibility now. > > I think that the first step should be extending > `org-remove-inline-images' and `org-display-inline-images' to work on > regions. `org-display-inline-images' already provides BEG and END > optional arguments, but it currently clears all the images in buffer > unconditionally. > > We will need to make `org-remove-inline-images' work on region and > modify `org-display-inline-images' to not affect images outside the > provided region. > > Then, we can modify `org-toggle-inline-images' accordingly and make use > of it in org-cycle.el to toggle images in section/subtree. -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
[parent not found: <633454e3.050a0220.7278b.1fa5SMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH 2-v1] New: auto display inline images under subtree when `org-cycle'. [not found] ` <633454e3.050a0220.7278b.1fa5SMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-09-29 3:05 ` Ihor Radchenko 2022-09-29 6:06 ` Christopher M. Miles ` (2 more replies) 0 siblings, 3 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-09-29 3:05 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: > Ok, I created the patch for subtree cycling display inline images. > Tested by edebug when org cycling, it should works fine. I don't know > how to write test for this. Thanks for the update! For tests, you will need to test the existence of image overlays. You can refer to test-org-fold/org-fold-reveal-broken-structure but need to test overlays-at instead of just org-invisible-p. > But I got a little problem: > > When ~org-fold-core-style~ is ~'overlays~, the ~delete-overlay~ will > cause subtree unfolded. More detailed check out the "org.el" function > ~org-remove-inline-images~ in my patch. I will comment in the code. > (defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees > - org-cycle-show-empty-lines > - org-cycle-optimize-window-after-visibility-change) > + org-cycle-show-empty-lines > + org-cycle-optimize-window-after-visibility-change > + org-cycle-display-inline-images) > "Hook that is run after `org-cycle' has changed the buffer visibility. > The function(s) in this hook must accept a single argument which indicates > the new state that was set by the most recent `org-cycle' command. The > @@ -229,6 +230,12 @@ normal outline commands like `show-all', but not with the cycling commands." > :group 'org-cycle > :type 'boolean) > > +(defcustom org-cycle-inline-images-display nil > + "Non-nil means auto display inline images under subtree when cycling." > + :group 'org-startup > + :group 'org-cycle > + :type 'boolean) You are providing both hook and a customization. It is redundant. Users can already remove the hook when desired. In this area, we generally do not use custom variables (see M-x customize-group org-cycle). So, it is better to use hook. > -(defun org-remove-inline-images () > +(defun org-remove-inline-images (&optional beg end) > "Remove inline display of images." > (interactive) > - (mapc #'delete-overlay org-inline-image-overlays) > - (setq org-inline-image-overlays nil)) > + (let* ((beg (or beg (point-min))) > + (end (or end (point-max))) > + (overlays (overlays-in beg end))) > + (dolist (ov overlays) > + (delete ov org-inline-image-overlays)) > + (mapc #'delete-overlay overlays) > + ;; FIXME: `org-cycle-display-inline-images' can't fold because `delete-overlay' will unfold subtree. > + (when (eq org-fold-core-style 'overlays) > + ;; FIXME: don't know how to get the correct `spec'. > + (let ((spec (alist-get 'org-fold-hidden org-fold-core--specs))) > + (org-fold-core-region beg end t spec))))) You can just (dolist (ov overlays) (when (memq ov org-inline-image-overlays) (setq org-inline-image-overlays (delq ov org-inline-image-overlays)) (delete-overlay ov))) Note that `delete' and `delq' are not safe to use on their own. You should always use (setq foo (delq 'member foo)). It is detailed in the docstring. -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v1] New: auto display inline images under subtree when `org-cycle'. 2022-09-29 3:05 ` Ihor Radchenko @ 2022-09-29 6:06 ` Christopher M. Miles 2022-09-29 6:57 ` [PATCH 2-v1 (test v1)] " Christopher M. Miles [not found] ` <63353c69.370a0220.67788.e8a1SMTPIN_ADDED_BROKEN@mx.google.com> 2 siblings, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-29 6:06 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 4178 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: I got a new problem in patch, the (point-max) in function ~org-cycle-display-inline-images~ SOMETIMES return EOF error instead of correct max point value when org-cycle `state' is ~'folded~. I can't find out what caused this even using Edebug. Do you have any clue? > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> Ok, I created the patch for subtree cycling display inline images. >> Tested by edebug when org cycling, it should works fine. I don't know >> how to write test for this. > > Thanks for the update! > > For tests, you will need to test the existence of image overlays. > You can refer to test-org-fold/org-fold-reveal-broken-structure but > need to test overlays-at instead of just org-invisible-p. > I will try to write tests later. >> But I got a little problem: >> >> When ~org-fold-core-style~ is ~'overlays~, the ~delete-overlay~ will >> cause subtree unfolded. More detailed check out the "org.el" function >> ~org-remove-inline-images~ in my patch. > > I will comment in the code. > >> (defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees >> - org-cycle-show-empty-lines >> - org-cycle-optimize-window-after-visibility-change) >> + org-cycle-show-empty-lines >> + org-cycle-optimize-window-after-visibility-change >> + org-cycle-display-inline-images) >> "Hook that is run after `org-cycle' has changed the buffer visibility. >> The function(s) in this hook must accept a single argument which indicates >> the new state that was set by the most recent `org-cycle' command. The >> @@ -229,6 +230,12 @@ normal outline commands like `show-all', but not with the cycling commands." >> :group 'org-cycle >> :type 'boolean) >> >> +(defcustom org-cycle-inline-images-display nil >> + "Non-nil means auto display inline images under subtree when cycling." >> + :group 'org-startup >> + :group 'org-cycle >> + :type 'boolean) > > You are providing both hook and a customization. It is redundant. Users > can already remove the hook when desired. I mock this style from a very similar existing hook function ~org-cycle-hide-archived-subtrees~ and custom variable ~org-cycle-open-archived-trees~. I think removing a hook function from ~org-cycle-hook~ is a way, but not as convenient as defcustom option. (P.S: I think users prefer this defcustom customization style.) > > In this area, we generally do not use custom variables (see M-x > customize-group org-cycle). So, it is better to use hook. > >> -(defun org-remove-inline-images () >> +(defun org-remove-inline-images (&optional beg end) >> "Remove inline display of images." >> (interactive) >> - (mapc #'delete-overlay org-inline-image-overlays) >> - (setq org-inline-image-overlays nil)) >> + (let* ((beg (or beg (point-min))) >> + (end (or end (point-max))) >> + (overlays (overlays-in beg end))) >> + (dolist (ov overlays) >> + (delete ov org-inline-image-overlays)) >> + (mapc #'delete-overlay overlays) >> + ;; FIXME: `org-cycle-display-inline-images' can't fold because `delete-overlay' will unfold subtree. >> + (when (eq org-fold-core-style 'overlays) >> + ;; FIXME: don't know how to get the correct `spec'. >> + (let ((spec (alist-get 'org-fold-hidden org-fold-core--specs))) >> + (org-fold-core-region beg end t spec))))) > > You can just > > (dolist (ov overlays) > (when (memq ov org-inline-image-overlays) > (setq org-inline-image-overlays (delq ov org-inline-image-overlays)) > (delete-overlay ov))) Done > Note that `delete' and `delq' are not safe to use on their own. You > should always use (setq foo (delq 'member foo)). It is detailed in the > docstring. Thanks for teaching. -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v1 (test v1)] New: auto display inline images under subtree when `org-cycle'. 2022-09-29 3:05 ` Ihor Radchenko 2022-09-29 6:06 ` Christopher M. Miles @ 2022-09-29 6:57 ` Christopher M. Miles [not found] ` <63353c69.370a0220.67788.e8a1SMTPIN_ADDED_BROKEN@mx.google.com> 2 siblings, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-29 6:57 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 2476 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> Ok, I created the patch for subtree cycling display inline images. >> Tested by edebug when org cycling, it should works fine. I don't know >> how to write test for this. > > Thanks for the update! > > For tests, you will need to test the existence of image overlays. > You can refer to test-org-fold/org-fold-reveal-broken-structure but > need to test overlays-at instead of just org-invisible-p. I write a testing prototype, got a problem which I marked TODO in code. And can you check whether my tests correct? Thanks #+begin_src emacs-lisp ;;; TODO: reference `test-org-fold/org-fold-reveal-broken-structure' (ert-deftest test-org-fold/org-fold-display-inline-images () "Test inline images displaying when cycling." (let ((org-fold-core-style 'text-properties) (org-cycle-inline-images-display t)) ;; `org-cycle' -(state)-> `'children' display child inline images. (org-test-with-temp-text "<point>* Heading 1 [[file:image.png]]" (org-overview) (org-cycle) (org-next-link) (should (overlays-at (point))) (org-toggle-inline-images) (should-not (overlays-at (point)))) ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. (org-test-with-temp-text "<point>* Heading 1 [[file:image.png]] ** Subheading 1 [[file:image2.png]] ** Subheading 2 [[file:image3.png]]" (org-overview) (org-cycle) (org-cycle) (org-next-link) (org-next-link) (should (overlays-at (point))) (org-toggle-inline-images) (should-not (overlays-at (point)))) ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. (org-test-with-temp-text "<point>* Heading 1 [[file:image.png]] ** Subheading 1 [[file:image2.png]] ** Subheading 2 [[file:image3.png]]" (org-overview) (org-cycle) (org-cycle) (org-cycle) ;; TODO: how to detect inline image overlays are deleted after folded? (should (overlays-at (point))) (org-toggle-inline-images) (should-not (overlays-at (point)))))) #+end_src -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
[parent not found: <63353c69.370a0220.67788.e8a1SMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH 2-v1] New: auto display inline images under subtree when `org-cycle'. [not found] ` <63353c69.370a0220.67788.e8a1SMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-09-30 3:19 ` Ihor Radchenko 2022-09-30 8:27 ` [PATCH 2-v2] " Christopher M. Miles [not found] ` <6336a955.050a0220.4e72e.2b23SMTPIN_ADDED_BROKEN@mx.google.com> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-09-30 3:19 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: > Ihor Radchenko <yantar92@gmail.com> writes: > > I got a new problem in patch, the (point-max) in function > ~org-cycle-display-inline-images~ SOMETIMES return EOF error instead of > correct max point value when org-cycle `state' is ~'folded~. I can't > find out what caused this even using Edebug. Do you have any clue? Maybe because the 'folded branch in that function is not wrapped into `save-restriction'? >> You are providing both hook and a customization. It is redundant. Users >> can already remove the hook when desired. > > I mock this style from a very similar existing hook function > ~org-cycle-hide-archived-subtrees~ and custom variable > ~org-cycle-open-archived-trees~. I think removing a hook function from > ~org-cycle-hook~ is a way, but not as convenient as defcustom option. > (P.S: I think users prefer this defcustom customization style.) I see your point. I agree that having a variable is better and also leaves an option to introduce in-buffer setting for this. Let's leave the hook part for now - if we want to alter it, we may need to re-consider all the default hooks. -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v2] New: auto display inline images under subtree when `org-cycle'. 2022-09-30 3:19 ` [PATCH 2-v1] " Ihor Radchenko @ 2022-09-30 8:27 ` Christopher M. Miles [not found] ` <6336a955.050a0220.4e72e.2b23SMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-09-30 8:27 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 619 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> Ihor Radchenko <yantar92@gmail.com> writes: >> >> I got a new problem in patch, the (point-max) in function >> ~org-cycle-display-inline-images~ SOMETIMES return EOF error instead of >> correct max point value when org-cycle `state' is ~'folded~. I can't >> find out what caused this even using Edebug. Do you have any clue? > > Maybe because the 'folded branch in that function is not wrapped into > `save-restriction'? > Ah, Indeed, I forgot to wrap it. Now I fixed this error. I attached new version patch. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Support-auto-display-inline-images-when-cycli.patch --] [-- Type: text/x-patch, Size: 8922 bytes --] From 570551a39038cf4190cd7cb453a8d059326b9dcb Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Wed, 28 Sep 2022 20:46:52 +0800 Subject: [PATCH] org.el: Support auto display inline images when cycling * lisp/org.el (org-toggle-inline-images): Support region. (org-display-inline-images): Fix refresh argument logic. (org-remove-inline-images): Support region. * lisp/org-keys.el (org-toggle-inline-images): Update arguments. * lisp/org-cycle.el (org-cycle-inline-images-display): Add new option to control whether auto display inline images when cycling. (org-cycle-display-inline-images): Add new hook function to auto display inline images when cycling. (org-cycle-hook): Add `org-cycle-display-inline-images' into cycling hook by default. * testing/lisp/test-org-fold.el (test-org-fold/org-fold-display-inline-images): Add test for inline image displaying when cycling. --- lisp/org-cycle.el | 41 ++++++++++++++++++++++++++++-- lisp/org-keys.el | 2 +- lisp/org.el | 21 +++++++++------ testing/lisp/test-org-fold.el | 48 +++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 11 deletions(-) diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el index 656ca83f2..6204b8a4f 100644 --- a/lisp/org-cycle.el +++ b/lisp/org-cycle.el @@ -208,8 +208,9 @@ the values `folded', `children', or `subtree'." :type 'hook) (defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees - org-cycle-show-empty-lines - org-cycle-optimize-window-after-visibility-change) + org-cycle-show-empty-lines + org-cycle-optimize-window-after-visibility-change + org-cycle-display-inline-images) "Hook that is run after `org-cycle' has changed the buffer visibility. The function(s) in this hook must accept a single argument which indicates the new state that was set by the most recent `org-cycle' command. The @@ -229,6 +230,12 @@ normal outline commands like `show-all', but not with the cycling commands." :group 'org-cycle :type 'boolean) +(defcustom org-cycle-inline-images-display nil + "Non-nil means auto display inline images under subtree when cycling." + :group 'org-startup + :group 'org-cycle + :type 'boolean) + (defvar org-cycle-tab-first-hook nil "Hook for functions to attach themselves to TAB. See `org-ctrl-c-ctrl-c-hook' for more information. @@ -776,6 +783,36 @@ STATE should be one of the symbols listed in the docstring of "Subtree is archived and stays closed. Use \ `\\[org-cycle-force-archived]' to cycle it anyway.")))))) +(defun org-cycle-display-inline-images (state) + "Auto display inline images under subtree when cycling. +It works when `org-cycle-inline-images-display' is non-nil." + (when org-cycle-inline-images-display + (pcase state + ('children + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent + ;; headline to first child headline which reference to + ;; upper let-binding `org-next-visible-heading'. + (org-display-inline-images + nil nil + (point-min) (progn (org-next-visible-heading 1) (point)))))) + ('subtree + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; If has nested headlines, also inline display images under all sub-headlines. + (org-display-inline-images nil nil (point-min) (point-max))))) + ('folded + (save-excursion + (save-restriction + (org-narrow-to-subtree) + ;; FIXME: sometimes `point-max' is EOF. + (if (numberp (point-max)) + (org-remove-inline-images (point-min) (point-max)) + (ignore)))))))) + (provide 'org-cycle) ;;; org-cycle.el ends here diff --git a/lisp/org-keys.el b/lisp/org-keys.el index d65379a72..79e34cbd1 100644 --- a/lisp/org-keys.el +++ b/lisp/org-keys.el @@ -204,7 +204,7 @@ (declare-function org-toggle-radio-button "org" (&optional arg)) (declare-function org-toggle-comment "org" ()) (declare-function org-toggle-fixed-width "org" ()) -(declare-function org-toggle-inline-images "org" (&optional include-linked)) +(declare-function org-toggle-inline-images "org" (&optional include-linked beg end)) (declare-function org-latex-preview "org" (&optional arg)) (declare-function org-toggle-narrow-to-subtree "org" ()) (declare-function org-toggle-ordered-property "org" ()) diff --git a/lisp/org.el b/lisp/org.el index 036384a04..36db62f0c 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -16071,16 +16071,16 @@ SNIPPETS-P indicates if this is run to create snippet images for HTML." (defvar-local org-inline-image-overlays nil) -(defun org-toggle-inline-images (&optional include-linked) +(defun org-toggle-inline-images (&optional include-linked beg end) "Toggle the display of inline images. INCLUDE-LINKED is passed to `org-display-inline-images'." (interactive "P") (if org-inline-image-overlays (progn - (org-remove-inline-images) + (org-remove-inline-images beg end) (when (called-interactively-p 'interactive) (message "Inline image display turned off"))) - (org-display-inline-images include-linked) + (org-display-inline-images include-linked nil beg end) (when (called-interactively-p 'interactive) (message (if org-inline-image-overlays (format "%d images displayed inline" @@ -16170,8 +16170,8 @@ BEG and END define the considered part. They default to the buffer boundaries with possible narrowing." (interactive "P") (when (display-graphic-p) - (unless refresh - (org-remove-inline-images) + (when refresh + (org-remove-inline-images beg end) (when (fboundp 'clear-image-cache) (clear-image-cache))) (let ((end (or end (point-max)))) (org-with-point-at (or beg (point-min)) @@ -16322,11 +16322,16 @@ buffer boundaries with possible narrowing." (delete ov org-inline-image-overlays) (delete-overlay ov)))) -(defun org-remove-inline-images () +(defun org-remove-inline-images (&optional beg end) "Remove inline display of images." (interactive) - (mapc #'delete-overlay org-inline-image-overlays) - (setq org-inline-image-overlays nil)) + (let* ((beg (or beg (point-min))) + (end (or end (point-max))) + (overlays (overlays-in beg end))) + (dolist (ov overlays) + (when (memq ov org-inline-image-overlays) + (setq org-inline-image-overlays (delq ov org-inline-image-overlays)) + (delete-overlay ov))))) (defvar org-self-insert-command-undo-counter 0) (defvar org-speed-command nil) diff --git a/testing/lisp/test-org-fold.el b/testing/lisp/test-org-fold.el index 0fa800dee..5c47cafb4 100644 --- a/testing/lisp/test-org-fold.el +++ b/testing/lisp/test-org-fold.el @@ -604,6 +604,54 @@ Unfolded Paragraph. (org-fold-check-before-invisible-edit kind) (should (org-invisible-p (1- (point)))))))))) +;;; TODO: reference `test-org-fold/org-fold-reveal-broken-structure' +(ert-deftest test-org-fold/org-fold-display-inline-images () + "Test inline images displaying when cycling." + (let ((org-fold-core-style 'text-properties) + (org-cycle-inline-images-display t)) + ;; `org-cycle' -(state)-> `'children' display child inline images. + (org-test-with-temp-text + "<point>* Heading 1 +[[file:image.png]]" + (org-overview) + (org-cycle) + (org-next-link) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. + (org-test-with-temp-text + "<point>* Heading 1 +[[file:image.png]] +** Subheading 1 +[[file:image2.png]] +** Subheading 2 +[[file:image3.png]]" + (org-overview) + (org-cycle) + (org-cycle) + (org-next-link) + (org-next-link) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. + (org-test-with-temp-text + "<point>* Heading 1 +[[file:image.png]] +** Subheading 1 +[[file:image2.png]] +** Subheading 2 +[[file:image3.png]]" + (org-overview) + (org-cycle) + (org-cycle) + (org-cycle) + ;; TODO: how to detect inline image overlays are deleted after folded? + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))))) + (provide 'test-org-fold) ;;; test-org-fold.el ends here -- 2.37.2 [-- Attachment #1.3: Type: text/plain, Size: 1005 bytes --] >>> You are providing both hook and a customization. It is redundant. Users >>> can already remove the hook when desired. >> >> I mock this style from a very similar existing hook function >> ~org-cycle-hide-archived-subtrees~ and custom variable >> ~org-cycle-open-archived-trees~. I think removing a hook function from >> ~org-cycle-hook~ is a way, but not as convenient as defcustom option. >> (P.S: I think users prefer this defcustom customization style.) > > I see your point. > I agree that having a variable is better and also leaves an option to > introduce in-buffer setting for this. > > Let's leave the hook part for now - if we want to alter it, we may need > to re-consider all the default hooks. Thanks -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
[parent not found: <6336a955.050a0220.4e72e.2b23SMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH 2-v2] New: auto display inline images under subtree when `org-cycle'. [not found] ` <6336a955.050a0220.4e72e.2b23SMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-10-01 3:16 ` Ihor Radchenko 2022-10-01 9:51 ` [PATCH 2-v3] " Christopher M. Miles [not found] ` <63380f57.370a0220.a9d9a.dee8SMTPIN_ADDED_BROKEN@mx.google.com> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-10-01 3:16 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: > I attached new version patch. Thanks! > +(defcustom org-cycle-inline-images-display nil > + "Non-nil means auto display inline images under subtree when cycling." > + :group 'org-startup > + :group 'org-cycle > + :type 'boolean) Please add :package-version tag as well. > + ('folded > + (save-excursion > + (save-restriction > + (org-narrow-to-subtree) > + ;; FIXME: sometimes `point-max' is EOF. Do you still need this FIXME? Also, you can use `org-with-wide-buffer' instead of save-excursion/restriction. > +;;; TODO: reference `test-org-fold/org-fold-reveal-broken-structure' > +(ert-deftest test-org-fold/org-fold-display-inline-images () > + "Test inline images displaying when cycling." > + (let ((org-fold-core-style 'text-properties) Why do you need to set `org-fold-core-style' explicitly here? > + (org-cycle-inline-images-display t)) > + ;; `org-cycle' -(state)-> `'children' display child inline images. > + (org-test-with-temp-text > + "<point>* Heading 1 > +[[file:image.png]]" This will not work in real tests. image.png will not exist. You will need to provide a reference image in testing/examples > + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. > + (org-test-with-temp-text > + "<point>* Heading 1 > +[[file:image.png]] > +** Subheading 1 > +[[file:image2.png]] > +** Subheading 2 > +[[file:image3.png]]" > + (org-overview) > + (org-cycle) > + (org-cycle) > + (org-cycle) > + ;; TODO: how to detect inline image overlays are deleted after folded? > + (should (overlays-at (point))) > + (org-toggle-inline-images) > + (should-not (overlays-at (point)))))) This latest test will not work. The point is at BOB. -- Ihor Radchenko, Org mode contributor, Learn more about Org mode at https://orgmode.org/. Support Org development at https://liberapay.com/org-mode, or support my work at https://liberapay.com/yantar92 ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v3] New: auto display inline images under subtree when `org-cycle'. 2022-10-01 3:16 ` Ihor Radchenko @ 2022-10-01 9:51 ` Christopher M. Miles [not found] ` <63380f57.370a0220.a9d9a.dee8SMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-10-01 9:51 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 28 bytes --] I attached the new patch. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Support-auto-display-inline-images-when-cycli.patch --] [-- Type: text/x-patch, Size: 20036 bytes --] From 67a00b91f53412435a5fd29406cf583a85f2de6d Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Wed, 28 Sep 2022 20:46:52 +0800 Subject: [PATCH] org.el: Support auto display inline images when cycling * lisp/org.el (org-toggle-inline-images): Support region. (org-display-inline-images): Fix refresh argument logic. (org-remove-inline-images): Support region. * lisp/org-keys.el (org-toggle-inline-images): Update arguments. * lisp/org-cycle.el (org-cycle-inline-images-display): Add new option to control whether auto display inline images when cycling. (org-cycle-display-inline-images): Add new hook function to auto display inline images when cycling. (org-cycle-hook): Add `org-cycle-display-inline-images' into cycling hook by default. * testing/lisp/test-org-fold.el (test-org-fold/org-fold-display-inline-images): Add test for inline image displaying when cycling. --- etc/ORG-NEWS | 4 ++ lisp/org-cycle.el | 38 +++++++++++++- lisp/org-keys.el | 2 +- lisp/org.el | 21 +++++--- .../images/Org mode logo mono-color.png | Bin 0 -> 7523 bytes testing/lisp/test-org-fold.el | 49 ++++++++++++++++++ 6 files changed, 103 insertions(+), 11 deletions(-) create mode 100755 testing/examples/images/Org mode logo mono-color.png diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index cab64317f..ec2764b3b 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -307,6 +307,10 @@ to pass the contents of a named code block as a string argument. The new property =ORG-IMAGE-ACTUAL-WIDTH= can override the global variable ~org-image-actual-width~ value for inline images display width. +*** New ~org-cycle-hook~ function ~org-cycle-display-inline-images~ for auto displaying subtree inline images + +This behavior is toggled by custom option ~org-cycle-inline-images-display~. + *** New ~org-babel-tangle-finished-hook~ hook run at the very end of ~org-babel-tangle~ This provides a proper counterpart to ~org-babel-pre-tangle-hook~, as diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el index 656ca83f2..212d25a44 100644 --- a/lisp/org-cycle.el +++ b/lisp/org-cycle.el @@ -208,8 +208,9 @@ the values `folded', `children', or `subtree'." :type 'hook) (defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees - org-cycle-show-empty-lines - org-cycle-optimize-window-after-visibility-change) + org-cycle-show-empty-lines + org-cycle-optimize-window-after-visibility-change + org-cycle-display-inline-images) "Hook that is run after `org-cycle' has changed the buffer visibility. The function(s) in this hook must accept a single argument which indicates the new state that was set by the most recent `org-cycle' command. The @@ -229,6 +230,13 @@ normal outline commands like `show-all', but not with the cycling commands." :group 'org-cycle :type 'boolean) +(defcustom org-cycle-inline-images-display nil + "Non-nil means auto display inline images under subtree when cycling." + :group 'org-startup + :group 'org-cycle + :package-version '(Org . "9.6") + :type 'boolean) + (defvar org-cycle-tab-first-hook nil "Hook for functions to attach themselves to TAB. See `org-ctrl-c-ctrl-c-hook' for more information. @@ -776,6 +784,32 @@ STATE should be one of the symbols listed in the docstring of "Subtree is archived and stays closed. Use \ `\\[org-cycle-force-archived]' to cycle it anyway.")))))) +(defun org-cycle-display-inline-images (state) + "Auto display inline images under subtree when cycling. +It works when `org-cycle-inline-images-display' is non-nil." + (when org-cycle-inline-images-display + (pcase state + ('children + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headline + ;; to first child headline which reference to upper + ;; let-binding `org-next-visible-heading'. + (org-display-inline-images + nil nil + (point-min) (progn (org-next-visible-heading 1) (point))))) + ('subtree + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, also inline display images under all sub-headlines. + (org-display-inline-images nil nil (point-min) (point-max)))) + ('folded + (org-with-wide-buffer + (org-narrow-to-subtree) + (if (numberp (point-max)) + (org-remove-inline-images (point-min) (point-max)) + (ignore))))))) + (provide 'org-cycle) ;;; org-cycle.el ends here diff --git a/lisp/org-keys.el b/lisp/org-keys.el index d65379a72..79e34cbd1 100644 --- a/lisp/org-keys.el +++ b/lisp/org-keys.el @@ -204,7 +204,7 @@ (declare-function org-toggle-radio-button "org" (&optional arg)) (declare-function org-toggle-comment "org" ()) (declare-function org-toggle-fixed-width "org" ()) -(declare-function org-toggle-inline-images "org" (&optional include-linked)) +(declare-function org-toggle-inline-images "org" (&optional include-linked beg end)) (declare-function org-latex-preview "org" (&optional arg)) (declare-function org-toggle-narrow-to-subtree "org" ()) (declare-function org-toggle-ordered-property "org" ()) diff --git a/lisp/org.el b/lisp/org.el index 036384a04..36db62f0c 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -16071,16 +16071,16 @@ SNIPPETS-P indicates if this is run to create snippet images for HTML." (defvar-local org-inline-image-overlays nil) -(defun org-toggle-inline-images (&optional include-linked) +(defun org-toggle-inline-images (&optional include-linked beg end) "Toggle the display of inline images. INCLUDE-LINKED is passed to `org-display-inline-images'." (interactive "P") (if org-inline-image-overlays (progn - (org-remove-inline-images) + (org-remove-inline-images beg end) (when (called-interactively-p 'interactive) (message "Inline image display turned off"))) - (org-display-inline-images include-linked) + (org-display-inline-images include-linked nil beg end) (when (called-interactively-p 'interactive) (message (if org-inline-image-overlays (format "%d images displayed inline" @@ -16170,8 +16170,8 @@ BEG and END define the considered part. They default to the buffer boundaries with possible narrowing." (interactive "P") (when (display-graphic-p) - (unless refresh - (org-remove-inline-images) + (when refresh + (org-remove-inline-images beg end) (when (fboundp 'clear-image-cache) (clear-image-cache))) (let ((end (or end (point-max)))) (org-with-point-at (or beg (point-min)) @@ -16322,11 +16322,16 @@ buffer boundaries with possible narrowing." (delete ov org-inline-image-overlays) (delete-overlay ov)))) -(defun org-remove-inline-images () +(defun org-remove-inline-images (&optional beg end) "Remove inline display of images." (interactive) - (mapc #'delete-overlay org-inline-image-overlays) - (setq org-inline-image-overlays nil)) + (let* ((beg (or beg (point-min))) + (end (or end (point-max))) + (overlays (overlays-in beg end))) + (dolist (ov overlays) + (when (memq ov org-inline-image-overlays) + (setq org-inline-image-overlays (delq ov org-inline-image-overlays)) + (delete-overlay ov))))) (defvar org-self-insert-command-undo-counter 0) (defvar org-speed-command nil) diff --git a/testing/examples/images/Org mode logo mono-color.png b/testing/examples/images/Org mode logo mono-color.png new file mode 100755 index 0000000000000000000000000000000000000000..9ac57e6a205257fd2fd21944a025190aa2f2db49 GIT binary patch literal 7523 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 literal 0 HcmV?d00001 diff --git a/testing/lisp/test-org-fold.el b/testing/lisp/test-org-fold.el index 0fa800dee..ffcfde56b 100644 --- a/testing/lisp/test-org-fold.el +++ b/testing/lisp/test-org-fold.el @@ -604,6 +604,55 @@ Unfolded Paragraph. (org-fold-check-before-invisible-edit kind) (should (org-invisible-p (1- (point)))))))))) +(ert-deftest test-org-fold/org-fold-display-inline-images () + "Test inline images displaying when cycling." + (let* ((org-cycle-inline-images-display t) + (images-dir (expand-file-name "examples/images/" org-test-dir)) + (org-logo-image (expand-file-name "Org mode logo mono-color.png" images-dir))) + ;; `org-cycle' -(state)-> `'children' display child inline images. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]]" org-logo-image) + (org-overview) + (org-cycle) + (org-next-link) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + + ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]] +** Subheading 1 +[[file:%s]] +** Subheading 2 +[[file:%s]]" org-logo-image org-logo-image org-logo-image) + (org-overview) + (org-cycle) + (org-cycle) + (org-next-link) + (org-next-link) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. + ;; (org-test-with-temp-text + ;; (format "<point>* Heading 1 + ;; [[file:%s]] + ;; ** Subheading 1 + ;; [[file:%s]] + ;; ** Subheading 2 + ;; [[file:%s]]" org-logo-image org-logo-image org-logo-image) + ;; (org-overview) + ;; (org-cycle) + ;; (org-cycle) + ;; (org-cycle) + ;; ;; TODO: how to detect inline image overlays are deleted after folded? + ;; ) + )) + (provide 'test-org-fold) ;;; test-org-fold.el ends here -- 2.37.2 [-- Attachment #1.3: Type: text/plain, Size: 21071 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> I attached new version patch. > > Thanks! > >> +(defcustom org-cycle-inline-images-display nil >> + "Non-nil means auto display inline images under subtree when cycling." >> + :group 'org-startup >> + :group 'org-cycle >> + :type 'boolean) > > Please add :package-version tag as well. > Done >> + ('folded >> + (save-excursion >> + (save-restriction >> + (org-narrow-to-subtree) >> + ;; FIXME: sometimes `point-max' is EOF. > > Do you still need this FIXME? > Also, you can use `org-with-wide-buffer' instead of > save-excursion/restriction. > Done >> +;;; TODO: reference `test-org-fold/org-fold-reveal-broken-structure' >> +(ert-deftest test-org-fold/org-fold-display-inline-images () >> + "Test inline images displaying when cycling." >> + (let ((org-fold-core-style 'text-properties) > > Why do you need to set `org-fold-core-style' explicitly here? > Removed, Done >> + (org-cycle-inline-images-display t)) >> + ;; `org-cycle' -(state)-> `'children' display child inline images. >> + (org-test-with-temp-text >> + "<point>* Heading 1 >> +[[file:image.png]]" > > This will not work in real tests. image.png will not exist. > You will need to provide a reference image in testing/examples > Added image file and link now. >> + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. >> + (org-test-with-temp-text >> + "<point>* Heading 1 >> +[[file:image.png]] >> +** Subheading 1 >> +[[file:image2.png]] >> +** Subheading 2 >> +[[file:image3.png]]" >> + (org-overview) >> + (org-cycle) >> + (org-cycle) >> + (org-cycle) >> + ;; TODO: how to detect inline image overlays are deleted after folded? >> + (should (overlays-at (point))) >> + (org-toggle-inline-images) >> + (should-not (overlays-at (point)))))) > > This latest test will not work. The point is at BOB. I commented out the third test if someone can do this. I don't now how to test in fold state. ================================================================================================== Because I got error when running command "make test". I checked org-mode source code repo, the ob-vala.el is removed, don't know where it is introduced. #+begin_example ~/Code/Emacs/org-mode:subtree-display-inline-images λ make test /Applications/Xcode.app/Contents/Developer/usr/bin/make -C doc clean; /Applications/Xcode.app/Contents/Developer/usr/bin/make -C lisp clean; rm -f *.pdf *.html *.info *_letter.tex org-version.inc org-version.tex \ *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.pg *.pgs *.toc \ *.tp *.tps *.vr *.vrs *.log *.ps rm -f org-version.el org-loaddefs.el org-version.elc org-loaddefs.elc org-install.elc rm -f *.elc /Applications/Xcode.app/Contents/Developer/usr/bin/make -C lisp compile rm -f org-version.el org-loaddefs.el org-version.elc org-loaddefs.elc org-install.elc org-version: 9.6-pre (release_9.5.5-845-g67a00b) Loading /Users/stardiviner/Code/Emacs/org-mode/lisp/org-compat.el (source)... Loading /Users/stardiviner/Code/Emacs/org-mode/mk/org-fixup.el (source)... org-loaddefs: 9.6-pre (release_9.5.5-845-g67a00b) Loading /Users/stardiviner/Code/Emacs/org-mode/lisp/org-compat.el (source)... Loading /Users/stardiviner/Code/Emacs/org-mode/mk/org-fixup.el (source)... /Applications/Xcode.app/Contents/Developer/usr/bin/make compile-dirall ==================== dirall ==================== Checking /Users/stardiviner/Code/Emacs/org-mode/lisp... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-C.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-R.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-awk.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-calc.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-clojure.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-comint.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-core.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-css.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-ditaa.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-dot.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-emacs-lisp.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-eshell.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-eval.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-exp.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-forth.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-fortran.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-gnuplot.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-groovy.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-haskell.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-java.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-js.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-julia.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-latex.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-lilypond.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-lisp.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-lob.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-lua.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-makefile.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-matlab.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-maxima.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-ocaml.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-octave.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-org.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-perl.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-plantuml.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-processing.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-python.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-ref.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-ruby.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-sass.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-scheme.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-screen.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-sed.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-shell.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-sql.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-sqlite.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-table.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob-tangle.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ob.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/oc-basic.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/oc-biblatex.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/oc-bibtex.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/oc-csl.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/oc-natbib.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/oc.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-bbdb.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-bibtex.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-docview.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-doi.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-eshell.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-eww.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-gnus.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-info.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-irc.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-man.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-mhe.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-rmail.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol-w3m.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ol.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-agenda.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-archive.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-attach-git.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-attach.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-capture.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-clock.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-colview.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-compat.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-crypt.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-ctags.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-cycle.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-datetree.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-duration.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-element.el... In org-element--cache-active-p: org-element.el:5682:11: Warning: defsubst `org-element--cache-active-p' was used before it was defined Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-entities.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-faces.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-feed.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-fold-core.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-fold.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-footnote.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-goto.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-habit.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-id.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-indent.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-inlinetask.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-keys.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-lint.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-list.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-loaddefs.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-macro.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-macs.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-mobile.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-mouse.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-num.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-pcomplete.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-persist.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-plot.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-protocol.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-refile.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-src.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-table.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-tempo.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-timer.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org-version.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/org.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-ascii.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-beamer.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-html.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-icalendar.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-koma-letter.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-latex.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-man.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-md.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-odt.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-org.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-publish.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox-texinfo.el... Compiling /Users/stardiviner/Code/Emacs/org-mode/lisp/ox.el... Done (Total of 125 files compiled, 2 skipped) install -m 755 -d /var/folders/ym/f3v5_yk1279g5ls70x3hzblh0000gn/T//tmp-orgtest TMPDIR=/var/folders/ym/f3v5_yk1279g5ls70x3hzblh0000gn/T//tmp-orgtest emacs -Q -batch --eval '(setq vc-handled-backends nil org-startup-folded nil)' --eval '(add-to-list '"'"'load-path (concat default-directory "lisp"))' --eval '(add-to-list '"'"'load-path (concat default-directory "testing"))' -l org-batch-test-init --eval '(setq org-batch-test t org-babel-load-languages (quote ( (awk . t) (C . t) (fortran . t) (maxima . t) (lilypond . t) (octave . t) (perl . t) (python . t) (vala . t) (emacs-lisp . t) (shell . t) (org . t))) org-test-select-re "\\(org\\|ob\\)" )' -l org-loaddefs.el -l cl -l testing/org-test.el -l ert -l org -l ox --eval '(org-test-run-batch-tests org-test-select-re)' Package cl is deprecated Error: file-missing ("Cannot open load file" "No such file or directory" "ob-vala") mapbacktrace(#f(compiled-function (evald func args flags) #<bytecode -0xc87083326512f81>)) debug-early-backtrace() debug-early(error (file-missing "Cannot open load file" "No such file or directory" "ob-vala")) require(ob-vala) org-babel-do-load-languages(org-babel-load-languages ((awk . t) (C . t) (fortran . t) (maxima . t) (lilypond . t) (octave . t) (perl . t) (python . t) (vala . t) (emacs-lisp . t) (shell . t) (org . t))) custom-initialize-reset(org-babel-load-languages (funcall #'#f(compiled-function () #<bytecode 0x1dc00016fe914>))) custom-declare-variable(org-babel-load-languages (funcall #'#f(compiled-function () #<bytecode 0x1dc00016fe914>)) "Languages which can be evaluated in Org buffers.\n\\<org-mode-map>\nThis list can be used to load support for any of the available\nlanguages with babel support (see info node `(org) Languages'). Each\nlanguage will depend on a different set of system executables and/or\nEmacs modes.\n\nWhen a language is \"loaded\", code blocks in that language can\nbe evaluated with `org-babel-execute-src-block', which is bound\nby default to \\[org-ctrl-c-ctrl-c].\n\nThe `org-babel-no-eval-on-ctrl-c-ctrl-c' option can be set to\nremove code block evaluation from \\[org-ctrl-c-ctrl-c]. By\ndefault, only Emacs Lisp is loaded, since it has no specific\nrequirement." :group org-babel :set org-babel-do-load-languages :version "24.1" :type (alist :tag "Babel Languages" :key-type (choice (const :tag "Awk" awk) (const :tag "C" C) (const :tag "R" R) (const :tag "Calc" calc) (const :tag "Clojure" clojure) (const :tag "CSS" css) (const :tag "Ditaa" ditaa) (const :tag "Dot" dot) (const :tag "Emacs Lisp" emacs-lisp) (const :tag "Forth" forth) (const :tag "Fortran" fortran) (const :tag "Gnuplot" gnuplot) (const :tag "Haskell" haskell) (const :tag "Java" java) (const :tag "Javascript" js) (const :tag "LaTeX" latex) (const :tag "Lilypond" lilypond) (const :tag "Lisp" lisp) (const :tag "Makefile" makefile) (const :tag "Maxima" maxima) (const :tag "Matlab" matlab) (const :tag "Ocaml" ocaml) (const :tag "Octave" octave) (const :tag "Org" org) (const :tag "Perl" perl) (const :tag "Pico Lisp" picolisp) (const :tag "PlantUML" plantuml) (const :tag "Python" python) (const :tag "Ruby" ruby) (const :tag "Sass" sass) (const :tag "Scala" scala) (const :tag "Scheme" scheme) (const :tag "Screen" screen) (const :tag "Shell Script" shell) (const :tag "Sql" sql) (const :tag "Sqlite" sqlite) (const :tag "Stan" stan)) :value-type (boolean :tag "Activate" :value t))) byte-code("\300\301\302\303\304DD\305\306\307\310\311\312\313\314\315&\13\210\300\316\302\303\317DD\320\314\321\312\313\306\322&\11\210\323\324\325\"\210\323\326\325\"\207" [custom-declare-variable org-babel-load-languages funcall function #f(compiled-function () #<bytecode 0x1dc00016fe914>) "Languages which can be evaluated in Org buffers.\n\\<org-mode-map>\nThis list can be used to load support for any of the available\nlanguages with babel support (see info node `(org) Languages'). Each\nlanguage will depend on a different set of system executables and/or\nEmacs modes.\n\nWhen a language is \"loaded\", code blocks in that language can\nbe evaluated with `org-babel-execute-src-block', which is bound\nby default to \\[org-ctrl-c-ctrl-c].\n\nThe `org-babel-no-eval-on-ctrl-c-ctrl-c' option can be set to\nremove code block evaluation from \\[org-ctrl-c-ctrl-c]. By\ndefault, only Emacs Lisp is loaded, since it has no specific\nrequirement." :group org-babel :set org-babel-do-load-languages :version "24.1" :type (alist :tag "Babel Languages" :key-type (choice (const :tag "Awk" awk) (const :tag "C" C) (const :tag "R" R) (const :tag "Calc" calc) (const :tag "Clojure" clojure) (const :tag "CSS" css) (const :tag "Ditaa" ditaa) (const :tag "Dot" dot) (const :tag "Emacs Lisp" emacs-lisp) (const :tag "Forth" forth) (const :tag "Fortran" fortran) (const :tag "Gnuplot" gnuplot) (const :tag "Haskell" haskell) (const :tag "Java" java) (const :tag "Javascript" js) (const :tag "LaTeX" latex) (const :tag "Lilypond" lilypond) (const :tag "Lisp" lisp) (const :tag "Makefile" makefile) (const :tag "Maxima" maxima) (const :tag "Matlab" matlab) (const :tag "Ocaml" ocaml) (const :tag "Octave" octave) (const :tag "Org" org) (const :tag "Perl" perl) (const :tag "Pico Lisp" picolisp) (const :tag "PlantUML" plantuml) (const :tag "Python" python) (const :tag "Ruby" ruby) (const :tag "Sass" sass) (const :tag "Scala" scala) (const :tag "Scheme" scheme) (const :tag "Screen" screen) (const :tag "Shell Script" shell) (const :tag "Sql" sql) (const :tag "Sqlite" sqlite) (const :tag "Stan" stan)) :value-type (boolean :tag "Activate" :value t)) org-clone-delete-id #f(compiled-function () #<bytecode 0x1dc00016fe914>) "Remove ID property of clones of a subtree.\nWhen non-nil, clones of a subtree don't inherit the ID property.\nOtherwise they inherit the ID property with a new unique\nidentifier." boolean org-id autoload org-release "org-version.el" org-git-version] 12) require(org) eval-buffer(#<buffer *load*> nil "/Users/stardiviner/Code/Emacs/org-mode/testing/org-test.el" nil t) load-with-code-conversion("/Users/stardiviner/Code/Emacs/org-mode/testing/org-test.el" "/Users/stardiviner/Code/Emacs/org-mode/testing/org-test.el" nil t) load("/Users/stardiviner/Code/Emacs/org-mode/testing/org-test.el" nil t) command-line-1(("--eval" "(setq vc-handled-backends nil org-startup-folded nil)" "--eval" "(add-to-list 'load-path (concat default-directory \"lisp\"))" "--eval" "(add-to-list 'load-path (concat default-directory \"testing\"))" "-l" "org-batch-test-init" "--eval" "(setq org-batch-test t org-babel-load-languages (quote ( (awk . t) (C . t) (fortran . t) (maxima . t) (lilypond . t) (octave . t) (perl . t) (python . t) (vala . t) (emacs-lisp . t) (shell . t) (org . t))) org-test-select-re \"\\\\(org\\\\|ob\\\\)\" )" "-l" "org-loaddefs.el" "-l" "cl" "-l" "testing/org-test.el" "-l" "ert" "-l" "org" "-l" "ox" "--eval" "(org-test-run-batch-tests org-test-select-re)")) command-line() normal-top-level() Cannot open load file: No such file or directory, ob-vala make: *** [test] Error 255 ~/Code/Emacs/org-mode:subtree-display-inline-images λ #+end_example ================================================================================================== So I use another method =[M-x ert-run-tests-interactively]=. The first test is passed, but the second test failed. I got bellowing error output. I don't know why it failed. Ihor, If you can fix this test, please tell me. Thanks #+begin_example Selector: test-org-fold/org-fold-display-inline-images Passed: 0 Failed: 1 (1 unexpected) Skipped: 0 Total: 1/1 Started at: 2022-10-01 17:46:30+0800 Finished. Finished at: 2022-10-01 17:46:31+0800 F F test-org-fold/org-fold-display-inline-images Test inline images displaying when cycling. (ert-test-failed ((should (overlays-at (point))) :form (overlays-at 130) :value nil)) #+end_example -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
[parent not found: <63380f57.370a0220.a9d9a.dee8SMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH 2-v3] New: auto display inline images under subtree when `org-cycle'. [not found] ` <63380f57.370a0220.a9d9a.dee8SMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-10-03 3:21 ` Ihor Radchenko 2022-10-03 4:37 ` [PATCH 2-v4] " Christopher M. Miles [not found] ` <633a67d8.050a0220.733e8.e57dSMTPIN_ADDED_BROKEN@mx.google.com> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-10-03 3:21 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: > +*** New ~org-cycle-hook~ function ~org-cycle-display-inline-images~ for auto displaying subtree inline images > + > +This behavior is toggled by custom option ~org-cycle-inline-images-display~. > + I'd be a bit more direct. Something like "Outline cycling can now include inline image visibility". Also, it is a good idea to document the new feature in the manual (12.7 Images section and 2.2.1 Global and local cycling section). > + > + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. > + ;; (org-test-with-temp-text > + ;; (format "<point>* Heading 1 > + ;; [[file:%s]] > + ;; ** Subheading 1 > + ;; [[file:%s]] > + ;; ** Subheading 2 > + ;; [[file:%s]]" org-logo-image org-logo-image org-logo-image) > + ;; (org-overview) > + ;; (org-cycle) > + ;; (org-cycle) > + ;; (org-cycle) > + ;; ;; TODO: how to detect inline image overlays are deleted after folded? > I commented out the third test if someone can do this. I don't now how to test in fold state. You can, for example, check org-inline-image-overlays and (overlays-in (point-min) (point-max)) > > Because I got error when running command "make test". I checked org-mode > source code repo, the ob-vala.el is removed, don't know where it is > introduced. I've seen this around the time we removed org-contrib. I suggest you to re-clone Org repo into a clean folder. > Started at: 2022-10-01 17:46:30+0800 > Finished. > Finished at: 2022-10-01 17:46:31+0800 > > F > > F test-org-fold/org-fold-display-inline-images > Test inline images displaying when cycling. > (ert-test-failed > ((should > (overlays-at > (point))) > :form > (overlays-at 130) > :value nil)) > #+end_example Please do not use org-cycle in tests. It is an interactive command and makes a number of assumptions about `this-command' and `last-command' values. Instead, prefer more direct `org-show-subtree'/`org-show-children'. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. 2022-10-03 3:21 ` Ihor Radchenko @ 2022-10-03 4:37 ` Christopher M. Miles [not found] ` <633a67d8.050a0220.733e8.e57dSMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-10-03 4:37 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 71 bytes --] Finally finished and passed the test. Here I attached the new patch. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Support-auto-display-inline-images-when-cycli.patch --] [-- Type: text/x-patch, Size: 21705 bytes --] From c36122f818289cbd26026ae75ce480b03e03f61a Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Wed, 28 Sep 2022 20:46:52 +0800 Subject: [PATCH] org.el: Support auto display inline images when cycling * lisp/org.el (org-toggle-inline-images): Support region. (org-display-inline-images): Fix refresh argument logic. (org-remove-inline-images): Support region. * lisp/org-keys.el (org-toggle-inline-images): Update arguments. * lisp/org-cycle.el (org-cycle-inline-images-display): Add new option to control whether auto display inline images when cycling. (org-cycle-display-inline-images): Add new hook function to auto display inline images when cycling. (org-cycle-hook): Add `org-cycle-display-inline-images' into cycling hook by default. * testing/lisp/test-org-fold.el (test-org-fold/org-fold-display-inline-images): Add test for inline image displaying when cycling. --- doc/org-manual.org | 12 ++++ etc/ORG-NEWS | 5 ++ lisp/org-cycle.el | 38 ++++++++++++- lisp/org-keys.el | 2 +- lisp/org.el | 21 ++++--- .../images/Org mode logo mono-color.png | Bin 0 -> 7523 bytes testing/lisp/test-org-fold.el | 52 ++++++++++++++++++ 7 files changed, 119 insertions(+), 11 deletions(-) create mode 100755 testing/examples/images/Org mode logo mono-color.png diff --git a/doc/org-manual.org b/doc/org-manual.org index ab8a295e5..ec5b729be 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -475,6 +475,13 @@ Org uses just two commands, bound to {{{kbd(TAB)}}} and #+vindex: org-cycle-emulate-tab Point must be on a headline for this to work[fn:4]. + #+vindex: org-cycle-inline-images-display + Outline cycling can now include inline image visibility. You can + enable this behavior by setting custom option + ~org-cycle-inline-images-display~ to non-~nil~. After enabled, when + you pressed {{{kbd(TAB)}}} on headline, the inline images under + subtree will be displayed automatically based on the ~org-cycle~ state. + - {{{kbd(S-TAB)}}} (~org-global-cycle~), {{{kbd(C-u TAB)}}} :: #+cindex: global visibility states @@ -11332,6 +11339,11 @@ command: - When set to nil, try to get the width from an =#+ATTR.*= keyword and fall back on the original width if none is found. +Inline images under subtree can be auto displayed by enabling custom +option ~org-cycle-inline-images-display~. After enabled, when you +pressed {{{kbd(TAB)}}} on headline, the inline images under subtree +will be displayed automatically based on the ~org-cycle~ state. + ** Captions :PROPERTIES: :DESCRIPTION: Describe tables, images... diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index cab64317f..8832a5beb 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -307,6 +307,11 @@ to pass the contents of a named code block as a string argument. The new property =ORG-IMAGE-ACTUAL-WIDTH= can override the global variable ~org-image-actual-width~ value for inline images display width. +*** New ~org-cycle-hook~ function ~org-cycle-display-inline-images~ for auto displaying subtree inline images + +Outline cycling can now include inline image visibility. This behavior +is controlled by custom option ~org-cycle-inline-images-display~. + *** New ~org-babel-tangle-finished-hook~ hook run at the very end of ~org-babel-tangle~ This provides a proper counterpart to ~org-babel-pre-tangle-hook~, as diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el index 656ca83f2..212d25a44 100644 --- a/lisp/org-cycle.el +++ b/lisp/org-cycle.el @@ -208,8 +208,9 @@ the values `folded', `children', or `subtree'." :type 'hook) (defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees - org-cycle-show-empty-lines - org-cycle-optimize-window-after-visibility-change) + org-cycle-show-empty-lines + org-cycle-optimize-window-after-visibility-change + org-cycle-display-inline-images) "Hook that is run after `org-cycle' has changed the buffer visibility. The function(s) in this hook must accept a single argument which indicates the new state that was set by the most recent `org-cycle' command. The @@ -229,6 +230,13 @@ normal outline commands like `show-all', but not with the cycling commands." :group 'org-cycle :type 'boolean) +(defcustom org-cycle-inline-images-display nil + "Non-nil means auto display inline images under subtree when cycling." + :group 'org-startup + :group 'org-cycle + :package-version '(Org . "9.6") + :type 'boolean) + (defvar org-cycle-tab-first-hook nil "Hook for functions to attach themselves to TAB. See `org-ctrl-c-ctrl-c-hook' for more information. @@ -776,6 +784,32 @@ STATE should be one of the symbols listed in the docstring of "Subtree is archived and stays closed. Use \ `\\[org-cycle-force-archived]' to cycle it anyway.")))))) +(defun org-cycle-display-inline-images (state) + "Auto display inline images under subtree when cycling. +It works when `org-cycle-inline-images-display' is non-nil." + (when org-cycle-inline-images-display + (pcase state + ('children + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headline + ;; to first child headline which reference to upper + ;; let-binding `org-next-visible-heading'. + (org-display-inline-images + nil nil + (point-min) (progn (org-next-visible-heading 1) (point))))) + ('subtree + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, also inline display images under all sub-headlines. + (org-display-inline-images nil nil (point-min) (point-max)))) + ('folded + (org-with-wide-buffer + (org-narrow-to-subtree) + (if (numberp (point-max)) + (org-remove-inline-images (point-min) (point-max)) + (ignore))))))) + (provide 'org-cycle) ;;; org-cycle.el ends here diff --git a/lisp/org-keys.el b/lisp/org-keys.el index d65379a72..79e34cbd1 100644 --- a/lisp/org-keys.el +++ b/lisp/org-keys.el @@ -204,7 +204,7 @@ (declare-function org-toggle-radio-button "org" (&optional arg)) (declare-function org-toggle-comment "org" ()) (declare-function org-toggle-fixed-width "org" ()) -(declare-function org-toggle-inline-images "org" (&optional include-linked)) +(declare-function org-toggle-inline-images "org" (&optional include-linked beg end)) (declare-function org-latex-preview "org" (&optional arg)) (declare-function org-toggle-narrow-to-subtree "org" ()) (declare-function org-toggle-ordered-property "org" ()) diff --git a/lisp/org.el b/lisp/org.el index 036384a04..36db62f0c 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -16071,16 +16071,16 @@ SNIPPETS-P indicates if this is run to create snippet images for HTML." (defvar-local org-inline-image-overlays nil) -(defun org-toggle-inline-images (&optional include-linked) +(defun org-toggle-inline-images (&optional include-linked beg end) "Toggle the display of inline images. INCLUDE-LINKED is passed to `org-display-inline-images'." (interactive "P") (if org-inline-image-overlays (progn - (org-remove-inline-images) + (org-remove-inline-images beg end) (when (called-interactively-p 'interactive) (message "Inline image display turned off"))) - (org-display-inline-images include-linked) + (org-display-inline-images include-linked nil beg end) (when (called-interactively-p 'interactive) (message (if org-inline-image-overlays (format "%d images displayed inline" @@ -16170,8 +16170,8 @@ BEG and END define the considered part. They default to the buffer boundaries with possible narrowing." (interactive "P") (when (display-graphic-p) - (unless refresh - (org-remove-inline-images) + (when refresh + (org-remove-inline-images beg end) (when (fboundp 'clear-image-cache) (clear-image-cache))) (let ((end (or end (point-max)))) (org-with-point-at (or beg (point-min)) @@ -16322,11 +16322,16 @@ buffer boundaries with possible narrowing." (delete ov org-inline-image-overlays) (delete-overlay ov)))) -(defun org-remove-inline-images () +(defun org-remove-inline-images (&optional beg end) "Remove inline display of images." (interactive) - (mapc #'delete-overlay org-inline-image-overlays) - (setq org-inline-image-overlays nil)) + (let* ((beg (or beg (point-min))) + (end (or end (point-max))) + (overlays (overlays-in beg end))) + (dolist (ov overlays) + (when (memq ov org-inline-image-overlays) + (setq org-inline-image-overlays (delq ov org-inline-image-overlays)) + (delete-overlay ov))))) (defvar org-self-insert-command-undo-counter 0) (defvar org-speed-command nil) diff --git a/testing/examples/images/Org mode logo mono-color.png b/testing/examples/images/Org mode logo mono-color.png new file mode 100755 index 0000000000000000000000000000000000000000..9ac57e6a205257fd2fd21944a025190aa2f2db49 GIT binary patch literal 7523 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 literal 0 HcmV?d00001 diff --git a/testing/lisp/test-org-fold.el b/testing/lisp/test-org-fold.el index 0fa800dee..c1c9e835e 100644 --- a/testing/lisp/test-org-fold.el +++ b/testing/lisp/test-org-fold.el @@ -604,6 +604,58 @@ Unfolded Paragraph. (org-fold-check-before-invisible-edit kind) (should (org-invisible-p (1- (point)))))))))) +(ert-deftest test-org-fold/org-fold-display-inline-images () + "Test inline images displaying when cycling." + (let* ((org-cycle-inline-images-display t) + (images-dir (expand-file-name "examples/images/" org-test-dir)) + (org-logo-image (expand-file-name "Org mode logo mono-color.png" images-dir))) + ;; `org-cycle' -(state)-> `'children' display child inline images. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]]" org-logo-image) + (org-overview) + (org-fold-show-children) + (run-hook-with-args 'org-cycle-hook 'children) + (org-next-link) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + + ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]] +** Subheading 1 +[[file:%s]] +** Subheading 2 +[[file:%s]]" org-logo-image org-logo-image org-logo-image) + (org-overview) + (org-fold-show-subtree) + (run-hook-with-args 'org-cycle-hook 'subtree) + (org-next-link) + (org-next-link) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]] +** Subheading 1 +[[file:%s]] +** Subheading 2 +[[file:%s]]" org-logo-image org-logo-image org-logo-image) + (org-overview) + (org-show-subtree) + (org-fold-subtree t) + (run-hook-with-args 'org-cycle-hook 'folded) + (should (null org-inline-image-overlays)) + (should (null (overlays-in (point-min) (point-max)))) + (org-show-subtree) + (should-not org-inline-image-overlays) + (should-not (overlays-in (point-min) (point-max)))))) + (provide 'test-org-fold) ;;; test-org-fold.el ends here -- 2.37.2 [-- Attachment #1.3: Type: text/plain, Size: 2801 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> +*** New ~org-cycle-hook~ function ~org-cycle-display-inline-images~ for auto displaying subtree inline images >> + >> +This behavior is toggled by custom option ~org-cycle-inline-images-display~. >> + > > I'd be a bit more direct. Something like "Outline cycling can now > include inline image visibility". > > Also, it is a good idea to document the new feature in the manual (12.7 > Images section and 2.2.1 Global and local cycling section). > Done >> + >> + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. >> + ;; (org-test-with-temp-text >> + ;; (format "<point>* Heading 1 >> + ;; [[file:%s]] >> + ;; ** Subheading 1 >> + ;; [[file:%s]] >> + ;; ** Subheading 2 >> + ;; [[file:%s]]" org-logo-image org-logo-image org-logo-image) >> + ;; (org-overview) >> + ;; (org-cycle) >> + ;; (org-cycle) >> + ;; (org-cycle) >> + ;; ;; TODO: how to detect inline image overlays are deleted after folded? > >> I commented out the third test if someone can do this. I don't now how to test in fold state. > > You can, for example, check org-inline-image-overlays and (overlays-in > (point-min) (point-max)) > Done >> >> Because I got error when running command "make test". I checked org-mode >> source code repo, the ob-vala.el is removed, don't know where it is >> introduced. > > I've seen this around the time we removed org-contrib. > I suggest you to re-clone Org repo into a clean folder. > Done >> Started at: 2022-10-01 17:46:30+0800 >> Finished. >> Finished at: 2022-10-01 17:46:31+0800 >> >> F >> >> F test-org-fold/org-fold-display-inline-images >> Test inline images displaying when cycling. >> (ert-test-failed >> ((should >> (overlays-at >> (point))) >> :form >> (overlays-at 130) >> :value nil)) >> #+end_example > > Please do not use org-cycle in tests. It is an interactive command and > makes a number of assumptions about `this-command' and `last-command' > values. Instead, prefer more direct `org-show-subtree'/`org-show-children'. The hook function is on ~org-cycle-hook~, so I use ~org-show-subtree~ + ~(run-hook-with-args 'org-cycle-hook 'subtree)~ now. This solution solved the problem. Thanks for hint. I think the patch is finished. Please review, Ihor. Thanks for helping. -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
[parent not found: <633a67d8.050a0220.733e8.e57dSMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. [not found] ` <633a67d8.050a0220.733e8.e57dSMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-10-04 4:36 ` Ihor Radchenko 2022-10-04 7:27 ` Christopher M. Miles [not found] ` <633be6d3.370a0220.4060.bacdSMTPIN_ADDED_BROKEN@mx.google.com> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-10-04 4:36 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 1067 bytes --] "Christopher M. Miles" <numbchild@gmail.com> writes: > I think the patch is finished. Please review, Ihor. Thanks for helping. Thanks for the update! I have cleaned the manual and ORG-NEWS wordings. Upon reading the exported version of the manual, I realized that the part in 2.2.1 Global and local cycling section sounds very awkward and that we do not mention other cycle hooks like hiding archived subtrees there. So, I decided to remove it. I also rewrote the other part in a bit more direct tone and moved the index entry. (In general, it is useful to try reading the exported version of the manual with the additions to check if things are still coherent - manual is not just a collection of independent statements; we need to make sure that it is not confusing the new readers). I also updated the commit message adding the CHANGELOG entries about the manual and ORG-NEWS. However, upon testing your patch, tests are still failing on my side. Can you please investigate? I am attaching the updated version of the patch with my amendments. Best, Ihor [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-org.el-Support-auto-display-inline-images-when-cycli.patch --] [-- Type: text/x-patch, Size: 20865 bytes --] From ab303eb5c007822d045f5e6ba3f00779c0abf1bc Mon Sep 17 00:00:00 2001 Message-Id: <ab303eb5c007822d045f5e6ba3f00779c0abf1bc.1664857900.git.yantar92@gmail.com> From: stardiviner <numbchild@gmail.com> Date: Wed, 28 Sep 2022 20:46:52 +0800 Subject: [PATCH] org.el: Support auto display inline images when cycling * lisp/org.el (org-toggle-inline-images): Support region. (org-display-inline-images): Fix refresh argument logic. (org-remove-inline-images): Support region. * lisp/org-keys.el (org-toggle-inline-images): Update arguments. * lisp/org-cycle.el (org-cycle-inline-images-display): Add new option to control whether auto display inline images when cycling. (org-cycle-display-inline-images): Add new hook function to auto display inline images when cycling. (org-cycle-hook): Add `org-cycle-display-inline-images' into cycling hook by default. * testing/lisp/test-org-fold.el (test-org-fold/org-fold-display-inline-images): Add test for inline image displaying when cycling. * doc/org-manual.org (Exporting): * etc/ORG-NEWS: Document the new option. --- doc/org-manual.org | 6 ++ etc/ORG-NEWS | 7 +++ lisp/org-cycle.el | 38 ++++++++++++- lisp/org-keys.el | 2 +- lisp/org.el | 21 ++++--- .../images/Org mode logo mono-color.png | Bin 0 -> 7523 bytes testing/lisp/test-org-fold.el | 52 ++++++++++++++++++ 7 files changed, 115 insertions(+), 11 deletions(-) create mode 100755 testing/examples/images/Org mode logo mono-color.png diff --git a/doc/org-manual.org b/doc/org-manual.org index a5fec8cf9..ec838df97 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -11470,6 +11470,12 @@ ** Images - When set to nil, try to get the width from an =#+ATTR.*= keyword and fall back on the original width if none is found. + +#+vindex: org-cycle-inline-images-display +Inline images can also be displayed when cycling the folding state. +When custom option ~org-cycle-inline-images-display~ is set, the +visible inline images under subtree will be displayed automatically. + ** Captions :PROPERTIES: :DESCRIPTION: Describe tables, images... diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 4728528f8..75a77378a 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -307,6 +307,13 @@ to pass the contents of a named code block as a string argument. The new property =ORG-IMAGE-ACTUAL-WIDTH= can override the global variable ~org-image-actual-width~ value for inline images display width. +*** Outline cycling can now include inline image visibility + +New ~org-cycle-hook~ function ~org-cycle-display-inline-images~ for +auto-displaying inline images in the visible parts of the subtree. +This behavior is controlled by new custom option +~org-cycle-inline-images-display~. + *** New ~org-babel-tangle-finished-hook~ hook run at the very end of ~org-babel-tangle~ This provides a proper counterpart to ~org-babel-pre-tangle-hook~, as diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el index 656ca83f2..212d25a44 100644 --- a/lisp/org-cycle.el +++ b/lisp/org-cycle.el @@ -208,8 +208,9 @@ (defcustom org-cycle-pre-hook nil :type 'hook) (defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees - org-cycle-show-empty-lines - org-cycle-optimize-window-after-visibility-change) + org-cycle-show-empty-lines + org-cycle-optimize-window-after-visibility-change + org-cycle-display-inline-images) "Hook that is run after `org-cycle' has changed the buffer visibility. The function(s) in this hook must accept a single argument which indicates the new state that was set by the most recent `org-cycle' command. The @@ -229,6 +230,13 @@ (defcustom org-cycle-open-archived-trees nil :group 'org-cycle :type 'boolean) +(defcustom org-cycle-inline-images-display nil + "Non-nil means auto display inline images under subtree when cycling." + :group 'org-startup + :group 'org-cycle + :package-version '(Org . "9.6") + :type 'boolean) + (defvar org-cycle-tab-first-hook nil "Hook for functions to attach themselves to TAB. See `org-ctrl-c-ctrl-c-hook' for more information. @@ -776,6 +784,32 @@ (defun org-cycle-hide-archived-subtrees (state) "Subtree is archived and stays closed. Use \ `\\[org-cycle-force-archived]' to cycle it anyway.")))))) +(defun org-cycle-display-inline-images (state) + "Auto display inline images under subtree when cycling. +It works when `org-cycle-inline-images-display' is non-nil." + (when org-cycle-inline-images-display + (pcase state + ('children + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headline + ;; to first child headline which reference to upper + ;; let-binding `org-next-visible-heading'. + (org-display-inline-images + nil nil + (point-min) (progn (org-next-visible-heading 1) (point))))) + ('subtree + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, also inline display images under all sub-headlines. + (org-display-inline-images nil nil (point-min) (point-max)))) + ('folded + (org-with-wide-buffer + (org-narrow-to-subtree) + (if (numberp (point-max)) + (org-remove-inline-images (point-min) (point-max)) + (ignore))))))) + (provide 'org-cycle) ;;; org-cycle.el ends here diff --git a/lisp/org-keys.el b/lisp/org-keys.el index d65379a72..79e34cbd1 100644 --- a/lisp/org-keys.el +++ b/lisp/org-keys.el @@ -204,7 +204,7 @@ (declare-function org-toggle-checkbox "org" (&optional toggle-presence)) (declare-function org-toggle-radio-button "org" (&optional arg)) (declare-function org-toggle-comment "org" ()) (declare-function org-toggle-fixed-width "org" ()) -(declare-function org-toggle-inline-images "org" (&optional include-linked)) +(declare-function org-toggle-inline-images "org" (&optional include-linked beg end)) (declare-function org-latex-preview "org" (&optional arg)) (declare-function org-toggle-narrow-to-subtree "org" ()) (declare-function org-toggle-ordered-property "org" ()) diff --git a/lisp/org.el b/lisp/org.el index d438e76b1..26c6f50d8 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -16075,16 +16075,16 @@ (defun org-normalize-color (value) (defvar-local org-inline-image-overlays nil) -(defun org-toggle-inline-images (&optional include-linked) +(defun org-toggle-inline-images (&optional include-linked beg end) "Toggle the display of inline images. INCLUDE-LINKED is passed to `org-display-inline-images'." (interactive "P") (if org-inline-image-overlays (progn - (org-remove-inline-images) + (org-remove-inline-images beg end) (when (called-interactively-p 'interactive) (message "Inline image display turned off"))) - (org-display-inline-images include-linked) + (org-display-inline-images include-linked nil beg end) (when (called-interactively-p 'interactive) (message (if org-inline-image-overlays (format "%d images displayed inline" @@ -16174,8 +16174,8 @@ (defun org-display-inline-images (&optional include-linked refresh beg end) buffer boundaries with possible narrowing." (interactive "P") (when (display-graphic-p) - (unless refresh - (org-remove-inline-images) + (when refresh + (org-remove-inline-images beg end) (when (fboundp 'clear-image-cache) (clear-image-cache))) (let ((end (or end (point-max)))) (org-with-point-at (or beg (point-min)) @@ -16326,11 +16326,16 @@ (defun org-display-inline-remove-overlay (ov after _beg _end &optional _len) (delete ov org-inline-image-overlays) (delete-overlay ov)))) -(defun org-remove-inline-images () +(defun org-remove-inline-images (&optional beg end) "Remove inline display of images." (interactive) - (mapc #'delete-overlay org-inline-image-overlays) - (setq org-inline-image-overlays nil)) + (let* ((beg (or beg (point-min))) + (end (or end (point-max))) + (overlays (overlays-in beg end))) + (dolist (ov overlays) + (when (memq ov org-inline-image-overlays) + (setq org-inline-image-overlays (delq ov org-inline-image-overlays)) + (delete-overlay ov))))) (defvar org-self-insert-command-undo-counter 0) (defvar org-speed-command nil) diff --git a/testing/examples/images/Org mode logo mono-color.png b/testing/examples/images/Org mode logo mono-color.png new file mode 100755 index 0000000000000000000000000000000000000000..9ac57e6a205257fd2fd21944a025190aa2f2db49 GIT binary patch literal 7523 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 literal 0 HcmV?d00001 diff --git a/testing/lisp/test-org-fold.el b/testing/lisp/test-org-fold.el index 0fa800dee..c1c9e835e 100644 --- a/testing/lisp/test-org-fold.el +++ b/testing/lisp/test-org-fold.el @@ -604,6 +604,58 @@ (ert-deftest test-org-fold/org-catch-invisible-edits () (org-fold-check-before-invisible-edit kind) (should (org-invisible-p (1- (point)))))))))) +(ert-deftest test-org-fold/org-fold-display-inline-images () + "Test inline images displaying when cycling." + (let* ((org-cycle-inline-images-display t) + (images-dir (expand-file-name "examples/images/" org-test-dir)) + (org-logo-image (expand-file-name "Org mode logo mono-color.png" images-dir))) + ;; `org-cycle' -(state)-> `'children' display child inline images. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]]" org-logo-image) + (org-overview) + (org-fold-show-children) + (run-hook-with-args 'org-cycle-hook 'children) + (org-next-link) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + + ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]] +** Subheading 1 +[[file:%s]] +** Subheading 2 +[[file:%s]]" org-logo-image org-logo-image org-logo-image) + (org-overview) + (org-fold-show-subtree) + (run-hook-with-args 'org-cycle-hook 'subtree) + (org-next-link) + (org-next-link) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]] +** Subheading 1 +[[file:%s]] +** Subheading 2 +[[file:%s]]" org-logo-image org-logo-image org-logo-image) + (org-overview) + (org-show-subtree) + (org-fold-subtree t) + (run-hook-with-args 'org-cycle-hook 'folded) + (should (null org-inline-image-overlays)) + (should (null (overlays-in (point-min) (point-max)))) + (org-show-subtree) + (should-not org-inline-image-overlays) + (should-not (overlays-in (point-min) (point-max)))))) + (provide 'test-org-fold) ;;; test-org-fold.el ends here -- 2.35.1 [-- Attachment #3: Type: text/plain, Size: 225 bytes --] -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply related [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. 2022-10-04 4:36 ` Ihor Radchenko @ 2022-10-04 7:27 ` Christopher M. Miles [not found] ` <633be6d3.370a0220.4060.bacdSMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-10-04 7:27 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 4428 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> I think the patch is finished. Please review, Ihor. Thanks for helping. > > Thanks for the update! > I have cleaned the manual and ORG-NEWS wordings. > > Upon reading the exported version of the manual, I realized that the > part in 2.2.1 Global and local cycling section sounds very awkward and > that we do not mention other cycle hooks like hiding archived > subtrees there. So, I decided to remove it. > > I also rewrote the other part in a bit more direct tone and moved the > index entry. > > (In general, it is useful to try reading the exported version of the > manual with the additions to check if things are still coherent - manual > is not just a collection of independent statements; we need to make sure > that it is not confusing the new readers). > > I also updated the commit message adding the CHANGELOG entries about the > manual and ORG-NEWS. > It's OK. > I am attaching the updated version of the patch with my amendments. Applied your updated patch. > However, upon testing your patch, tests are still failing on my side. > Can you please investigate? But If I use [M-x ert] to run the test "test-org-fold/org-fold-display-inline-images" is passed. Here is the steps: 1. [M-x load-file RET /path/to/org-mode/testing/org-test.el RET] 2. [C-M-x] to evaluate the target test 3. [M-x ert RET test-org-fold/org-fold-display-inline-images RET] to run this test I attached the uploaded screencast video link to prove it passed. https://share.cleanshot.com/tvUUoQ I tried many different other API functions to cycle or fold/unfold, but none of them works under command "make test" or command "make BTEST_RE="test-org-fold/org-fold-display-inline-images" test-dirty". I have nothing brain to think for this test now. Really can't figure out why this image is not displayed as overlay. Can you help me to fix this test? #+begin_src emacs-lisp (ert-deftest test-org-fold/org-fold-display-inline-images () "Test inline images displaying when cycling." (let* ((org-cycle-inline-images-display t) (images-dir (expand-file-name "examples/images/" org-test-dir)) (org-logo-image (expand-file-name "Org mode logo mono-color.png" images-dir))) ;; `org-cycle' -(state)-> `'children' display child inline images. (org-test-with-temp-text (format "<point>* Heading 1 [[file:%s]] " org-logo-image) (org-overview) (org-cycle) ;; (org-cycle-internal-local) ;; (run-hook-with-args 'org-cycle-hook 'children) ;; (org-cycle-display-inline-images 'children) (org-next-link) ;; (should org-inline-image-overlays) (should (overlays-at (point))) (org-toggle-inline-images) (should-not (overlays-at (point)))) ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. (org-test-with-temp-text (format "<point>* Heading 1 [[file:%s]] ** Subheading 1 [[file:%s]] ** Subheading 2 [[file:%s]]" org-logo-image org-logo-image org-logo-image) (org-overview) (org-cycle) (org-cycle) ;; (org-cycle-internal-global) ;; (run-hook-with-args 'org-cycle-hook 'subtree) (org-next-link) (org-next-link) ;; (should org-inline-image-overlays) (should (overlays-at (point))) (org-toggle-inline-images) (should-not (overlays-at (point)))) ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. (org-test-with-temp-text (format "<point>* Heading 1 [[file:%s]] ** Subheading 1 [[file:%s]] ** Subheading 2 [[file:%s]]" org-logo-image org-logo-image org-logo-image) (org-overview) (org-show-subtree) (org-fold-subtree t) (run-hook-with-args 'org-cycle-hook 'folded) (should (null org-inline-image-overlays)) (should (null (overlays-in (point-min) (point-max)))) (org-show-subtree) (should-not org-inline-image-overlays) (should-not (overlays-in (point-min) (point-max)))))) #+end_src -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
[parent not found: <633be6d3.370a0220.4060.bacdSMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. [not found] ` <633be6d3.370a0220.4060.bacdSMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-10-08 7:53 ` Ihor Radchenko 2022-10-08 9:50 ` Christopher M. Miles [not found] ` <634149f4.c80a0220.1376.e564SMTPIN_ADDED_BROKEN@mx.google.com> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-10-08 7:53 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: >> However, upon testing your patch, tests are still failing on my side. >> Can you please investigate? > > But If I use [M-x ert] to run the test "test-org-fold/org-fold-display-inline-images" is passed. > Here is the steps: > 1. [M-x load-file RET /path/to/org-mode/testing/org-test.el RET] > 2. [C-M-x] to evaluate the target test > 3. [M-x ert RET test-org-fold/org-fold-display-inline-images RET] to run this test > > I attached the uploaded screencast video link to prove it passed. > > https://share.cleanshot.com/tvUUoQ > > I tried many different other API functions to cycle or fold/unfold, but none > of them works under command "make test" or command > "make BTEST_RE="test-org-fold/org-fold-display-inline-images" test-dirty". > > I have nothing brain to think for this test now. Really can't figure out > why this image is not displayed as overlay. Can you help me to fix this test? The problem is with batch mode. `create-image' will return nil in batch mode and hence no overlays are ever created even though `org-display-inline-images' does get called. I think that the best we can do in this situation is mocking `create-image' in batch mode to return non-nil using `cl-letf'. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. 2022-10-08 7:53 ` Ihor Radchenko @ 2022-10-08 9:50 ` Christopher M. Miles [not found] ` <634149f4.c80a0220.1376.e564SMTPIN_ADDED_BROKEN@mx.google.com> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-10-08 9:50 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 2005 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >>> However, upon testing your patch, tests are still failing on my side. >>> Can you please investigate? >> >> But If I use [M-x ert] to run the test "test-org-fold/org-fold-display-inline-images" is passed. >> Here is the steps: >> 1. [M-x load-file RET /path/to/org-mode/testing/org-test.el RET] >> 2. [C-M-x] to evaluate the target test >> 3. [M-x ert RET test-org-fold/org-fold-display-inline-images RET] to run this test >> >> I attached the uploaded screencast video link to prove it passed. >> >> https://share.cleanshot.com/tvUUoQ >> >> I tried many different other API functions to cycle or fold/unfold, but none >> of them works under command "make test" or command >> "make BTEST_RE="test-org-fold/org-fold-display-inline-images" test-dirty". >> >> I have nothing brain to think for this test now. Really can't figure out >> why this image is not displayed as overlay. Can you help me to fix this test? > > The problem is with batch mode. `create-image' will return nil in batch > mode and hence no overlays are ever created even though > `org-display-inline-images' does get called. I see, no wonder that failed for command "make test" but success in "[M-x ert]". > I think that the best we can do in this situation is mocking > `create-image' in batch mode to return non-nil using `cl-letf'. I checked the `create-image' in image.el source code, don't know how to mocking this. I have no experience and idea about this. I also searched org testing. Have not found similar situations. If you have idea how to write this test, I suggest pass this word to you. What do you think? -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
[parent not found: <634149f4.c80a0220.1376.e564SMTPIN_ADDED_BROKEN@mx.google.com>]
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. [not found] ` <634149f4.c80a0220.1376.e564SMTPIN_ADDED_BROKEN@mx.google.com> @ 2022-10-09 7:21 ` Ihor Radchenko 2022-10-10 8:40 ` Christopher M. Miles [not found] ` <m2v8os5aqy.fsf@numbchild> 0 siblings, 2 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-10-09 7:21 UTC (permalink / raw) To: Christopher M. Miles; +Cc: emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: >> I think that the best we can do in this situation is mocking >> `create-image' in batch mode to return non-nil using `cl-letf'. > > I checked the `create-image' in image.el source code, don't know how to > mocking this. I have no experience and idea about this. I also searched > org testing. Have not found similar situations. > > If you have idea how to write this test, I suggest pass this word to > you. What do you think? I imagine something like ;; Mock `create-image' to work noninteractively. (cl-letf (((symbol-function 'create-image) (lambda (&rest _) `(image :type "dummy" :data "dummy")))) <your test code here>) -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. 2022-10-09 7:21 ` Ihor Radchenko @ 2022-10-10 8:40 ` Christopher M. Miles [not found] ` <m2v8os5aqy.fsf@numbchild> 1 sibling, 0 replies; 43+ messages in thread From: Christopher M. Miles @ 2022-10-10 8:40 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 14959 bytes --] Ihor Radchenko <yantar92@gmail.com> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >>> I think that the best we can do in this situation is mocking >>> `create-image' in batch mode to return non-nil using `cl-letf'. >> >> I checked the `create-image' in image.el source code, don't know how to >> mocking this. I have no experience and idea about this. I also searched >> org testing. Have not found similar situations. >> >> If you have idea how to write this test, I suggest pass this word to >> you. What do you think? > > I imagine something like > > ;; Mock `create-image' to work noninteractively. > (cl-letf (((symbol-function 'create-image) > (lambda (&rest _) > `(image :type "dummy" :data "dummy")))) > <your test code here>) After wrapped your cl-letf redefining function binding. Still failed on test. Here is the new test code: #+begin_src emacs-lisp (ert-deftest test-org-fold/org-fold-display-inline-images () "Test inline images displaying when cycling." ;; Mock `create-image' to work noninteractively. (cl-letf (((symbol-function 'create-image) (lambda (&rest _) `(image :type "dummy" :data "dummy")))) (let* ((org-cycle-inline-images-display t) (images-dir (expand-file-name "examples/images/" org-test-dir)) (org-logo-image (expand-file-name "Org mode logo mono-color.png" images-dir))) ;; `org-cycle' -(state)-> `'children' display child inline images. (org-test-with-temp-text (format "<point>* Heading 1 [[file:%s]] " org-logo-image) (org-overview) ;; (org-cycle) ;; (org-cycle-internal-local) ;; (org-cycle-display-inline-images 'children) (org-fold-show-children) (run-hook-with-args 'org-cycle-hook 'children) (org-next-link) (should org-inline-image-overlays) (should (overlays-at (point))) (org-toggle-inline-images) (should-not (overlays-at (point)))) ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. (org-test-with-temp-text (format "<point>* Heading 1 [[file:%s]] ** Subheading 1 [[file:%s]] ** Subheading 2 [[file:%s]]" org-logo-image org-logo-image org-logo-image) (org-overview) ;; (org-cycle) ;; (org-cycle) ;; (org-cycle-internal-global) (org-fold-show-subtree) (run-hook-with-args 'org-cycle-hook 'subtree) (org-next-link) (org-next-link) ;; (should org-inline-image-overlays) (should (overlays-at (point))) (org-toggle-inline-images) (should-not (overlays-at (point)))) ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. (org-test-with-temp-text (format "<point>* Heading 1 [[file:%s]] ** Subheading 1 [[file:%s]] ** Subheading 2 [[file:%s]]" org-logo-image org-logo-image org-logo-image) (org-overview) (org-show-subtree) (org-fold-subtree t) (run-hook-with-args 'org-cycle-hook 'folded) (should (null org-inline-image-overlays)) (should (null (overlays-in (point-min) (point-max)))) (org-show-subtree) (should-not org-inline-image-overlays) (should-not (overlays-in (point-min) (point-max))))))) #+end_src And failed after command: #+begin_src shell make BTEST_RE="test-org-fold/org-fold-display-inline-images" test-dirty #+end_src Here is the output: #+begin_example ~/Code/Emacs/org-mode:main*:1 λ make BTEST_RE="test-org-fold/org-fold-display-inline-images" test-dirty install -m 755 -d /var/folders/ym/f3v5_yk1279g5ls70x3hzblh0000gn/T//tmp-orgtest TMPDIR=/var/folders/ym/f3v5_yk1279g5ls70x3hzblh0000gn/T//tmp-orgtest emacs -Q -batch --eval '(setq vc-handled-backends nil org-startup-folded nil org-element-cache-persistent nil)' --eval '(add-to-list '"'"'load-path (concat default-directory "lisp"))' --eval '(add-to-list '"'"'load-path (concat default-directory "testing"))' -l org-batch-test-init --eval '(setq org-batch-test t org-babel-load-languages (quote ( (awk . t) (C . t) (fortran . t) (maxima . t) (lilypond . t) (octave . t) (perl . t) (python . t) (emacs-lisp . t) (shell . t) (org . t))) org-test-select-re "test-org-fold/org-fold-display-inline-images" )' -l org-loaddefs.el -l cl -l testing/org-test.el -l ert -l org -l ox -l ol --eval '(org-test-run-batch-tests org-test-select-re)' Package cl is deprecated Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-compat.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-macs.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-keys.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/oc.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ol.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-table.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-cycle.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-awk.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-core.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-comint.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-exp.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-ref.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-src.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-maxima.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-lilypond.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-octave.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-emacs-lisp.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-list.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-pcomplete.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-macro.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-id.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-refile.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ol-doi.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ol-irc.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-element.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ox.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ox-html.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ox-icalendar.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-agenda.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ol.el' newer than byte-compiled file; using older file Finding ID locations (1/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/setupfile3.org Finding ID locations (2/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/setupfile.org Finding ID locations (3/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/property-inheritance.org Finding ID locations (4/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/org-exp.org Finding ID locations (5/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-shell-test.org Finding ID locations (6/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-sed-test.org Finding ID locations (7/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-screen-test.org Finding ID locations (8/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-octave-test.org Finding ID locations (9/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-maxima-test.org Finding ID locations (10/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-lilypond-test.org Finding ID locations (11/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-lilypond-broken.org Finding ID locations (12/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-header-arg-defaults.org Finding ID locations (13/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-fortran-test.org Finding ID locations (14/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-awk-test.org Finding ID locations (15/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-C-test.org Finding ID locations (16/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/normal.org Finding ID locations (17/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/no-heading.org Finding ID locations (18/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/macro-templates.org Finding ID locations (19/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/links.org Finding ID locations (20/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/link-in-heading.org Finding ID locations (21/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/include2.org Finding ID locations (22/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/include.org Finding ID locations (23/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/babel.org Finding ID locations (24/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/babel-dangerous.org Finding ID locations (25/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/attachments.org Finding ID locations (26/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/agenda-file.org 26 files scanned, 14 files contains IDs, and 58 IDs found. 0 source block added to Library of Babel Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-sed.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-inlinetask.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-capture.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-clock.el' newer than byte-compiled file; using older file Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-feed.el' newer than byte-compiled file; using older file Local variables list is not properly terminated Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-lint.el' newer than byte-compiled file; using older file selected tests: test-org-fold/org-fold-display-inline-images Running 1 tests (2022-10-10 16:31:04+0800, selector `"test-org-fold/org-fold-display-inline-images"') Test test-org-fold/org-fold-display-inline-images backtrace: signal(ert-test-failed (((should org-inline-image-overlays) :form or ert-fail(((should org-inline-image-overlays) :form org-inline-image- (if (unwind-protect (setq value-12536 org-inline-image-overlays) (se (let (form-description-12537) (if (unwind-protect (setq value-12536 (let ((value-12536 (gensym "ert-form-evaluation-aborted-"))) (let (f (progn (org-mode) (let ((point (string-match "<point>" inside-text)) (unwind-protect (progn (org-mode) (let ((point (string-match "<point (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (let ((temp-buffer (generate-new-buffer " *temp*" t))) (save-current (let ((inside-text (if (stringp (format "<point>* Heading 1\n[[file: (let* ((org-cycle-inline-images-display t) (images-dir (expand-file- (progn (fset 'create-image vnew) (let* ((org-cycle-inline-images-dis (unwind-protect (progn (fset 'create-image vnew) (let* ((org-cycle-i (let* ((vnew #'(lambda (&rest _) '(image :type "dummy" :data "dummy" (closure (t) nil (let* ((vnew #'(lambda (&rest _) '(image :type "dum ert--run-test-internal(#s(ert--test-execution-info :test ... :result ert-run-test(#s(ert-test :name test-org-fold/org-fold-display-inline ert-run-or-rerun-test(#s(ert--stats :selector "test-org-fold/..." :t ert-run-tests("test-org-fold/org-fold-display-inline-images" #f(comp ert-run-tests-batch("test-org-fold/org-fold-display-inline-images") ert-run-tests-batch-and-exit("test-org-fold/org-fold-display-inline- (let ((org-id-track-globally t) (org-test-selector (if org-test-sele org-test-run-batch-tests("test-org-fold/org-fold-display-inline-imag eval((org-test-run-batch-tests org-test-select-re) t) command-line-1(("--eval" "(setq vc-handled-backends nil org-startup- command-line() normal-top-level() Test test-org-fold/org-fold-display-inline-images condition: (ert-test-failed ((should org-inline-image-overlays) :form org-inline-image-overlays :value nil)) FAILED 1/1 test-org-fold/org-fold-display-inline-images (0.001214 sec) at ../lisp/test-org-fold.el:607 Ran 1 tests, 0 results as expected, 1 unexpected (2022-10-10 16:31:04+0800, 0.166044 sec) 1 unexpected results: FAILED test-org-fold/org-fold-display-inline-images ((should org-inline-image-overlays) :form org-inline-image-overlays :value nil) make: *** [test-dirty] Error 1 ~/Code/Emacs/org-mode:main*:1 λ #+end_example -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
[parent not found: <m2v8os5aqy.fsf@numbchild>]
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. [not found] ` <m2v8os5aqy.fsf@numbchild> @ 2022-10-22 1:29 ` Christopher M. Miles 2022-10-23 4:33 ` Ihor Radchenko 0 siblings, 1 reply; 43+ messages in thread From: Christopher M. Miles @ 2022-10-22 1:29 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 15614 bytes --] Whether can this patch be merged at first, put the test in future to finish? In recent days, I still have not figured out this image overlays test. "Christopher M. Miles" <numbchild@gmail.com> writes: > [[PGP Signed Part:Undecided]] > > Ihor Radchenko <yantar92@gmail.com> writes: > >> "Christopher M. Miles" <numbchild@gmail.com> writes: >> >>>> I think that the best we can do in this situation is mocking >>>> `create-image' in batch mode to return non-nil using `cl-letf'. >>> >>> I checked the `create-image' in image.el source code, don't know how to >>> mocking this. I have no experience and idea about this. I also searched >>> org testing. Have not found similar situations. >>> >>> If you have idea how to write this test, I suggest pass this word to >>> you. What do you think? >> >> I imagine something like >> >> ;; Mock `create-image' to work noninteractively. >> (cl-letf (((symbol-function 'create-image) >> (lambda (&rest _) >> `(image :type "dummy" :data "dummy")))) >> <your test code here>) > > After wrapped your cl-letf redefining function binding. Still failed on test. > > Here is the new test code: > > #+begin_src emacs-lisp > (ert-deftest test-org-fold/org-fold-display-inline-images () > "Test inline images displaying when cycling." > ;; Mock `create-image' to work noninteractively. > (cl-letf (((symbol-function 'create-image) > (lambda (&rest _) `(image :type "dummy" :data "dummy")))) > (let* ((org-cycle-inline-images-display t) > (images-dir (expand-file-name "examples/images/" org-test-dir)) > (org-logo-image (expand-file-name "Org mode logo mono-color.png" images-dir))) > ;; `org-cycle' -(state)-> `'children' display child inline images. > (org-test-with-temp-text > (format "<point>* Heading 1 > [[file:%s]] > " org-logo-image) > (org-overview) > ;; (org-cycle) > ;; (org-cycle-internal-local) > ;; (org-cycle-display-inline-images 'children) > (org-fold-show-children) > (run-hook-with-args 'org-cycle-hook 'children) > (org-next-link) > (should org-inline-image-overlays) > (should (overlays-at (point))) > (org-toggle-inline-images) > (should-not (overlays-at (point)))) > > ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. > (org-test-with-temp-text > (format "<point>* Heading 1 > [[file:%s]] > ** Subheading 1 > [[file:%s]] > ** Subheading 2 > [[file:%s]]" org-logo-image org-logo-image org-logo-image) > (org-overview) > ;; (org-cycle) > ;; (org-cycle) > ;; (org-cycle-internal-global) > (org-fold-show-subtree) > (run-hook-with-args 'org-cycle-hook 'subtree) > (org-next-link) > (org-next-link) > ;; (should org-inline-image-overlays) > (should (overlays-at (point))) > (org-toggle-inline-images) > (should-not (overlays-at (point)))) > > ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. > (org-test-with-temp-text > (format "<point>* Heading 1 > [[file:%s]] > ** Subheading 1 > [[file:%s]] > ** Subheading 2 > [[file:%s]]" org-logo-image org-logo-image org-logo-image) > (org-overview) > (org-show-subtree) > (org-fold-subtree t) > (run-hook-with-args 'org-cycle-hook 'folded) > (should (null org-inline-image-overlays)) > (should (null (overlays-in (point-min) (point-max)))) > (org-show-subtree) > (should-not org-inline-image-overlays) > (should-not (overlays-in (point-min) (point-max))))))) > #+end_src > > > And failed after command: > > #+begin_src shell > make BTEST_RE="test-org-fold/org-fold-display-inline-images" test-dirty > #+end_src > > > Here is the output: > > #+begin_example > ~/Code/Emacs/org-mode:main*:1 λ make BTEST_RE="test-org-fold/org-fold-display-inline-images" test-dirty > install -m 755 -d /var/folders/ym/f3v5_yk1279g5ls70x3hzblh0000gn/T//tmp-orgtest > TMPDIR=/var/folders/ym/f3v5_yk1279g5ls70x3hzblh0000gn/T//tmp-orgtest emacs -Q -batch --eval '(setq vc-handled-backends nil org-startup-folded nil org-element-cache-persistent nil)' --eval '(add-to-list '"'"'load-path (concat default-directory "lisp"))' --eval '(add-to-list '"'"'load-path (concat default-directory "testing"))' -l org-batch-test-init --eval '(setq org-batch-test t org-babel-load-languages (quote ( (awk . t) (C . t) (fortran . t) (maxima . t) (lilypond . t) (octave . t) (perl . t) (python . t) (emacs-lisp . t) (shell . t) (org . t))) org-test-select-re "test-org-fold/org-fold-display-inline-images" )' -l org-loaddefs.el -l cl -l testing/org-test.el -l ert -l org -l ox -l ol --eval '(org-test-run-batch-tests org-test-select-re)' > Package cl is deprecated > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-compat.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-macs.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-keys.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/oc.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ol.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-table.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-cycle.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-awk.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-core.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-comint.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-exp.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-ref.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-src.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-maxima.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-lilypond.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-octave.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-emacs-lisp.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-list.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-pcomplete.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-macro.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-id.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-refile.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ol-doi.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ol-irc.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-element.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ox.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ox-html.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ox-icalendar.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-agenda.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ol.el' newer than byte-compiled file; using older file > Finding ID locations (1/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/setupfile3.org > Finding ID locations (2/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/setupfile.org > Finding ID locations (3/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/property-inheritance.org > Finding ID locations (4/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/org-exp.org > Finding ID locations (5/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-shell-test.org > Finding ID locations (6/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-sed-test.org > Finding ID locations (7/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-screen-test.org > Finding ID locations (8/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-octave-test.org > Finding ID locations (9/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-maxima-test.org > Finding ID locations (10/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-lilypond-test.org > Finding ID locations (11/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-lilypond-broken.org > Finding ID locations (12/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-header-arg-defaults.org > Finding ID locations (13/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-fortran-test.org > Finding ID locations (14/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-awk-test.org > Finding ID locations (15/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/ob-C-test.org > Finding ID locations (16/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/normal.org > Finding ID locations (17/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/no-heading.org > Finding ID locations (18/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/macro-templates.org > Finding ID locations (19/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/links.org > Finding ID locations (20/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/link-in-heading.org > Finding ID locations (21/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/include2.org > Finding ID locations (22/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/include.org > Finding ID locations (23/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/babel.org > Finding ID locations (24/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/babel-dangerous.org > Finding ID locations (25/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/attachments.org > Finding ID locations (26/26 files): /Users/stardiviner/Code/Emacs/org-mode/testing/examples/agenda-file.org > 26 files scanned, 14 files contains IDs, and 58 IDs found. > 0 source block added to Library of Babel > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/ob-sed.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-inlinetask.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-capture.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-clock.el' newer than byte-compiled file; using older file > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-feed.el' newer than byte-compiled file; using older file > Local variables list is not properly terminated > Source file `/Users/stardiviner/Code/Emacs/org-mode/lisp/org-lint.el' newer than byte-compiled file; using older file > selected tests: test-org-fold/org-fold-display-inline-images > Running 1 tests (2022-10-10 16:31:04+0800, selector `"test-org-fold/org-fold-display-inline-images"') > Test test-org-fold/org-fold-display-inline-images backtrace: > signal(ert-test-failed (((should org-inline-image-overlays) :form or > ert-fail(((should org-inline-image-overlays) :form org-inline-image- > (if (unwind-protect (setq value-12536 org-inline-image-overlays) (se > (let (form-description-12537) (if (unwind-protect (setq value-12536 > (let ((value-12536 (gensym "ert-form-evaluation-aborted-"))) (let (f > (progn (org-mode) (let ((point (string-match "<point>" inside-text)) > (unwind-protect (progn (org-mode) (let ((point (string-match "<point > (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn > (let ((temp-buffer (generate-new-buffer " *temp*" t))) (save-current > (let ((inside-text (if (stringp (format "<point>* Heading 1\n[[file: > (let* ((org-cycle-inline-images-display t) (images-dir (expand-file- > (progn (fset 'create-image vnew) (let* ((org-cycle-inline-images-dis > (unwind-protect (progn (fset 'create-image vnew) (let* ((org-cycle-i > (let* ((vnew #'(lambda (&rest _) '(image :type "dummy" :data "dummy" > (closure (t) nil (let* ((vnew #'(lambda (&rest _) '(image :type "dum > ert--run-test-internal(#s(ert--test-execution-info :test ... :result > ert-run-test(#s(ert-test :name test-org-fold/org-fold-display-inline > ert-run-or-rerun-test(#s(ert--stats :selector "test-org-fold/..." :t > ert-run-tests("test-org-fold/org-fold-display-inline-images" #f(comp > ert-run-tests-batch("test-org-fold/org-fold-display-inline-images") > ert-run-tests-batch-and-exit("test-org-fold/org-fold-display-inline- > (let ((org-id-track-globally t) (org-test-selector (if org-test-sele > org-test-run-batch-tests("test-org-fold/org-fold-display-inline-imag > eval((org-test-run-batch-tests org-test-select-re) t) > command-line-1(("--eval" "(setq vc-handled-backends nil org-startup- > command-line() > normal-top-level() > Test test-org-fold/org-fold-display-inline-images condition: > (ert-test-failed > ((should org-inline-image-overlays) > :form org-inline-image-overlays :value nil)) > FAILED 1/1 test-org-fold/org-fold-display-inline-images (0.001214 sec) at ../lisp/test-org-fold.el:607 > > Ran 1 tests, 0 results as expected, 1 unexpected (2022-10-10 16:31:04+0800, 0.166044 sec) > > 1 unexpected results: > FAILED test-org-fold/org-fold-display-inline-images ((should org-inline-image-overlays) :form org-inline-image-overlays :value nil) > > make: *** [test-dirty] Error 1 > ~/Code/Emacs/org-mode:main*:1 λ > #+end_example -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. 2022-10-22 1:29 ` Christopher M. Miles @ 2022-10-23 4:33 ` Ihor Radchenko 2022-10-23 7:14 ` Christopher M. Miles 0 siblings, 1 reply; 43+ messages in thread From: Ihor Radchenko @ 2022-10-23 4:33 UTC (permalink / raw) To: Christopher M. Miles; +Cc: Ihor Radchenko, emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: > Whether can this patch be merged at first, put the test in future to > finish? In recent days, I still have not figured out this image overlays > test. Sure. Can you please send the final version of the patch and the working tests? -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. 2022-10-23 4:33 ` Ihor Radchenko @ 2022-10-23 7:14 ` Christopher M. Miles 2022-10-25 7:23 ` Ihor Radchenko 0 siblings, 1 reply; 43+ messages in thread From: Christopher M. Miles @ 2022-10-23 7:14 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, Ihor Radchenko, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 426 bytes --] Ihor Radchenko <yantar92@posteo.net> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >> Whether can this patch be merged at first, put the test in future to >> finish? In recent days, I still have not figured out this image overlays >> test. > > Sure. Can you please send the final version of the patch and the working > tests? I separated code patch and test into two patches. You can apply selectively. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Support-auto-display-inline-images-when-cycli.patch --] [-- Type: text/x-patch, Size: 18565 bytes --] From 2beacea9082e7eddd5db426cd180ea42ebb46656 Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Tue, 4 Oct 2022 12:36:32 +0800 Subject: [PATCH 1/2] org.el: Support auto display inline images when cycling * lisp/org.el (org-toggle-inline-images): Support region. (org-display-inline-images): Fix refresh argument logic. (org-remove-inline-images): Support region. * lisp/org-keys.el (org-toggle-inline-images): Update arguments. * lisp/org-cycle.el (org-cycle-inline-images-display): Add new option to control whether auto display inline images when cycling. (org-cycle-display-inline-images): Add new hook function to auto display inline images when cycling. (org-cycle-hook): Add `org-cycle-display-inline-images' into cycling hook by default. * doc/org-manual.org (Exporting): * etc/ORG-NEWS: Document the new option. --- doc/org-manual.org | 6 +++ etc/ORG-NEWS | 7 ++++ lisp/org-cycle.el | 38 +++++++++++++++++- lisp/org-keys.el | 2 +- lisp/org.el | 21 ++++++---- .../images/Org mode logo mono-color.png | Bin 0 -> 7523 bytes 6 files changed, 63 insertions(+), 11 deletions(-) create mode 100755 testing/examples/images/Org mode logo mono-color.png diff --git a/doc/org-manual.org b/doc/org-manual.org index ad584d7a5..18a050069 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -11489,6 +11489,12 @@ command: - When set to nil, try to get the width from an =#+ATTR.*= keyword and fall back on the original width if none is found. + +#+vindex: org-cycle-inline-images-display +Inline images can also be displayed when cycling the folding state. +When custom option ~org-cycle-inline-images-display~ is set, the +visible inline images under subtree will be displayed automatically. + ** Captions :PROPERTIES: :DESCRIPTION: Describe tables, images... diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index c18c03725..d87b49bd3 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -307,6 +307,13 @@ to pass the contents of a named code block as a string argument. The new property =ORG-IMAGE-ACTUAL-WIDTH= can override the global variable ~org-image-actual-width~ value for inline images display width. +*** Outline cycling can now include inline image visibility + +New ~org-cycle-hook~ function ~org-cycle-display-inline-images~ for +auto-displaying inline images in the visible parts of the subtree. +This behavior is controlled by new custom option +~org-cycle-inline-images-display~. + *** New ~org-babel-tangle-finished-hook~ hook run at the very end of ~org-babel-tangle~ This provides a proper counterpart to ~org-babel-pre-tangle-hook~, as diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el index c1caa3fdc..14388caaf 100644 --- a/lisp/org-cycle.el +++ b/lisp/org-cycle.el @@ -208,8 +208,9 @@ the values `folded', `children', or `subtree'." :type 'hook) (defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees - org-cycle-show-empty-lines - org-cycle-optimize-window-after-visibility-change) + org-cycle-show-empty-lines + org-cycle-optimize-window-after-visibility-change + org-cycle-display-inline-images) "Hook that is run after `org-cycle' has changed the buffer visibility. The function(s) in this hook must accept a single argument which indicates the new state that was set by the most recent `org-cycle' command. The @@ -229,6 +230,13 @@ normal outline commands like `show-all', but not with the cycling commands." :group 'org-cycle :type 'boolean) +(defcustom org-cycle-inline-images-display nil + "Non-nil means auto display inline images under subtree when cycling." + :group 'org-startup + :group 'org-cycle + :package-version '(Org . "9.6") + :type 'boolean) + (defvar org-cycle-tab-first-hook nil "Hook for functions to attach themselves to TAB. See `org-ctrl-c-ctrl-c-hook' for more information. @@ -775,6 +783,32 @@ STATE should be one of the symbols listed in the docstring of "Subtree is archived and stays closed. Use \ `\\[org-cycle-force-archived]' to cycle it anyway.")))))) +(defun org-cycle-display-inline-images (state) + "Auto display inline images under subtree when cycling. +It works when `org-cycle-inline-images-display' is non-nil." + (when org-cycle-inline-images-display + (pcase state + ('children + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headline + ;; to first child headline which reference to upper + ;; let-binding `org-next-visible-heading'. + (org-display-inline-images + nil nil + (point-min) (progn (org-next-visible-heading 1) (point))))) + ('subtree + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, also inline display images under all sub-headlines. + (org-display-inline-images nil nil (point-min) (point-max)))) + ('folded + (org-with-wide-buffer + (org-narrow-to-subtree) + (if (numberp (point-max)) + (org-remove-inline-images (point-min) (point-max)) + (ignore))))))) + (provide 'org-cycle) ;;; org-cycle.el ends here diff --git a/lisp/org-keys.el b/lisp/org-keys.el index d65379a72..79e34cbd1 100644 --- a/lisp/org-keys.el +++ b/lisp/org-keys.el @@ -204,7 +204,7 @@ (declare-function org-toggle-radio-button "org" (&optional arg)) (declare-function org-toggle-comment "org" ()) (declare-function org-toggle-fixed-width "org" ()) -(declare-function org-toggle-inline-images "org" (&optional include-linked)) +(declare-function org-toggle-inline-images "org" (&optional include-linked beg end)) (declare-function org-latex-preview "org" (&optional arg)) (declare-function org-toggle-narrow-to-subtree "org" ()) (declare-function org-toggle-ordered-property "org" ()) diff --git a/lisp/org.el b/lisp/org.el index 8191f0860..1cf091f58 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -16079,16 +16079,16 @@ SNIPPETS-P indicates if this is run to create snippet images for HTML." (defvar-local org-inline-image-overlays nil) -(defun org-toggle-inline-images (&optional include-linked) +(defun org-toggle-inline-images (&optional include-linked beg end) "Toggle the display of inline images. INCLUDE-LINKED is passed to `org-display-inline-images'." (interactive "P") (if org-inline-image-overlays (progn - (org-remove-inline-images) + (org-remove-inline-images beg end) (when (called-interactively-p 'interactive) (message "Inline image display turned off"))) - (org-display-inline-images include-linked) + (org-display-inline-images include-linked nil beg end) (when (called-interactively-p 'interactive) (message (if org-inline-image-overlays (format "%d images displayed inline" @@ -16178,8 +16178,8 @@ BEG and END define the considered part. They default to the buffer boundaries with possible narrowing." (interactive "P") (when (display-graphic-p) - (unless refresh - (org-remove-inline-images) + (when refresh + (org-remove-inline-images beg end) (when (fboundp 'clear-image-cache) (clear-image-cache))) (let ((end (or end (point-max)))) (org-with-point-at (or beg (point-min)) @@ -16329,11 +16329,16 @@ buffer boundaries with possible narrowing." (delete ov org-inline-image-overlays) (delete-overlay ov))) -(defun org-remove-inline-images () +(defun org-remove-inline-images (&optional beg end) "Remove inline display of images." (interactive) - (mapc #'delete-overlay org-inline-image-overlays) - (setq org-inline-image-overlays nil)) + (let* ((beg (or beg (point-min))) + (end (or end (point-max))) + (overlays (overlays-in beg end))) + (dolist (ov overlays) + (when (memq ov org-inline-image-overlays) + (setq org-inline-image-overlays (delq ov org-inline-image-overlays)) + (delete-overlay ov))))) (defvar org-self-insert-command-undo-counter 0) (defvar org-speed-command nil) diff --git a/testing/examples/images/Org mode logo mono-color.png b/testing/examples/images/Org mode logo mono-color.png new file mode 100755 index 0000000000000000000000000000000000000000..9ac57e6a205257fd2fd21944a025190aa2f2db49 GIT binary patch literal 7523 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 literal 0 HcmV?d00001 -- 2.38.0 [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.3: 0002-test-org-fold.el-Add-test-for-inline-image-displayin.patch --] [-- Type: text/x-patch, Size: 3176 bytes --] From a81a187de9f4aa9f208bfe6931d577733b6f6f0c Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Sun, 23 Oct 2022 15:11:56 +0800 Subject: [PATCH 2/2] test-org-fold.el: Add test for inline image displaying when cycling * testing/lisp/test-org-fold.el (test-org-fold/org-fold-display-inline-images): Add unit test for inline image displaying when cycling. --- testing/lisp/test-org-fold.el | 61 +++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/testing/lisp/test-org-fold.el b/testing/lisp/test-org-fold.el index 8b19ffbc9..664be4551 100644 --- a/testing/lisp/test-org-fold.el +++ b/testing/lisp/test-org-fold.el @@ -662,6 +662,67 @@ Unfolded Paragraph. (org-fold-check-before-invisible-edit kind) (should (org-invisible-p (1- (point)))))))))) +(ert-deftest test-org-fold/org-fold-display-inline-images () + "Test inline images displaying when cycling." + (let* ((org-cycle-inline-images-display t) + (images-dir (expand-file-name "examples/images/" org-test-dir)) + (org-logo-image (expand-file-name "Org mode logo mono-color.png" images-dir))) + ;; `org-cycle' -(state)-> `'children' display child inline images. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]] +" org-logo-image) + (org-overview) + ;; (org-cycle) + ;; (org-cycle-internal-local) + ;; (org-cycle-display-inline-images 'children) + (org-fold-show-children) + (run-hook-with-args 'org-cycle-hook 'children) + (org-next-link) + (should org-inline-image-overlays) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + + ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]] +** Subheading 1 +[[file:%s]] +** Subheading 2 +[[file:%s]]" org-logo-image org-logo-image org-logo-image) + (org-overview) + ;; (org-cycle) + ;; (org-cycle) + ;; (org-cycle-internal-global) + (org-fold-show-subtree) + (run-hook-with-args 'org-cycle-hook 'subtree) + (org-next-link) + (org-next-link) + ;; (should org-inline-image-overlays) + (should (overlays-at (point))) + (org-toggle-inline-images) + (should-not (overlays-at (point)))) + + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]] +** Subheading 1 +[[file:%s]] +** Subheading 2 +[[file:%s]]" org-logo-image org-logo-image org-logo-image) + (org-overview) + (org-show-subtree) + (org-fold-subtree t) + (run-hook-with-args 'org-cycle-hook 'folded) + (should (null org-inline-image-overlays)) + (should (null (overlays-in (point-min) (point-max)))) + (org-show-subtree) + (should-not org-inline-image-overlays) + (should-not (overlays-in (point-min) (point-max)))))) + (provide 'test-org-fold) ;;; test-org-fold.el ends here -- 2.38.0 [-- Attachment #1.4: Type: text/plain, Size: 267 bytes --] -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
* Re: [PATCH 2-v4] New: auto display inline images under subtree when `org-cycle'. 2022-10-23 7:14 ` Christopher M. Miles @ 2022-10-25 7:23 ` Ihor Radchenko 2022-10-25 14:22 ` [PATCH v3] " Christopher M. Miles 0 siblings, 1 reply; 43+ messages in thread From: Ihor Radchenko @ 2022-10-25 7:23 UTC (permalink / raw) To: Christopher M. Miles; +Cc: Ihor Radchenko, emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: >> Sure. Can you please send the final version of the patch and the working >> tests? > > I separated code patch and test into two patches. You can apply selectively. Sorry, I was not very clear. I meant to remove that patch that fails due to noninteractive and leave the rest. > doc/org-manual.org | 6 +++ > etc/ORG-NEWS | 7 ++++ > lisp/org-cycle.el | 38 +++++++++++++++++- > lisp/org-keys.el | 2 +- > lisp/org.el | 21 ++++++---- > .../images/Org mode logo mono-color.png | Bin 0 -> 7523 bytes The image should belong to the test patch. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v3] New: auto display inline images under subtree when `org-cycle'. 2022-10-25 7:23 ` Ihor Radchenko @ 2022-10-25 14:22 ` Christopher M. Miles 2022-10-26 4:50 ` Ihor Radchenko 0 siblings, 1 reply; 43+ messages in thread From: Christopher M. Miles @ 2022-10-25 14:22 UTC (permalink / raw) To: Ihor Radchenko; +Cc: Christopher M. Miles, Ihor Radchenko, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 897 bytes --] Ihor Radchenko <yantar92@posteo.net> writes: > "Christopher M. Miles" <numbchild@gmail.com> writes: > >>> Sure. Can you please send the final version of the patch and the working >>> tests? >> >> I separated code patch and test into two patches. You can apply selectively. > > Sorry, I was not very clear. > I meant to remove that patch that fails due to noninteractive and leave > the rest. > Updated, I deleted testing and marked as TODO. >> doc/org-manual.org | 6 +++ >> etc/ORG-NEWS | 7 ++++ >> lisp/org-cycle.el | 38 +++++++++++++++++- >> lisp/org-keys.el | 2 +- >> lisp/org.el | 21 ++++++---- >> .../images/Org mode logo mono-color.png | Bin 0 -> 7523 bytes > > The image should belong to the test patch. Updated. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: 0001-org.el-Support-auto-display-inline-images-when-cycli.patch --] [-- Type: text/x-patch, Size: 8169 bytes --] From 4cdf69001832bcc180e7c607c15c44c484954c82 Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Tue, 4 Oct 2022 12:36:32 +0800 Subject: [PATCH 1/2] org.el: Support auto display inline images when cycling * lisp/org.el (org-toggle-inline-images): Support region. (org-display-inline-images): Fix refresh argument logic. (org-remove-inline-images): Support region. * lisp/org-keys.el (org-toggle-inline-images): Update arguments. * lisp/org-cycle.el (org-cycle-inline-images-display): Add new option to control whether auto display inline images when cycling. (org-cycle-display-inline-images): Add new hook function to auto display inline images when cycling. (org-cycle-hook): Add `org-cycle-display-inline-images' into cycling hook by default. * doc/org-manual.org (Exporting): * etc/ORG-NEWS: Document the new option. --- doc/org-manual.org | 6 ++++++ etc/ORG-NEWS | 7 +++++++ lisp/org-cycle.el | 38 ++++++++++++++++++++++++++++++++++++-- lisp/org-keys.el | 2 +- lisp/org.el | 21 +++++++++++++-------- 5 files changed, 63 insertions(+), 11 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index ad584d7a5..18a050069 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -11489,6 +11489,12 @@ command: - When set to nil, try to get the width from an =#+ATTR.*= keyword and fall back on the original width if none is found. + +#+vindex: org-cycle-inline-images-display +Inline images can also be displayed when cycling the folding state. +When custom option ~org-cycle-inline-images-display~ is set, the +visible inline images under subtree will be displayed automatically. + ** Captions :PROPERTIES: :DESCRIPTION: Describe tables, images... diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index c18c03725..d87b49bd3 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -307,6 +307,13 @@ to pass the contents of a named code block as a string argument. The new property =ORG-IMAGE-ACTUAL-WIDTH= can override the global variable ~org-image-actual-width~ value for inline images display width. +*** Outline cycling can now include inline image visibility + +New ~org-cycle-hook~ function ~org-cycle-display-inline-images~ for +auto-displaying inline images in the visible parts of the subtree. +This behavior is controlled by new custom option +~org-cycle-inline-images-display~. + *** New ~org-babel-tangle-finished-hook~ hook run at the very end of ~org-babel-tangle~ This provides a proper counterpart to ~org-babel-pre-tangle-hook~, as diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el index c1caa3fdc..14388caaf 100644 --- a/lisp/org-cycle.el +++ b/lisp/org-cycle.el @@ -208,8 +208,9 @@ the values `folded', `children', or `subtree'." :type 'hook) (defcustom org-cycle-hook '(org-cycle-hide-archived-subtrees - org-cycle-show-empty-lines - org-cycle-optimize-window-after-visibility-change) + org-cycle-show-empty-lines + org-cycle-optimize-window-after-visibility-change + org-cycle-display-inline-images) "Hook that is run after `org-cycle' has changed the buffer visibility. The function(s) in this hook must accept a single argument which indicates the new state that was set by the most recent `org-cycle' command. The @@ -229,6 +230,13 @@ normal outline commands like `show-all', but not with the cycling commands." :group 'org-cycle :type 'boolean) +(defcustom org-cycle-inline-images-display nil + "Non-nil means auto display inline images under subtree when cycling." + :group 'org-startup + :group 'org-cycle + :package-version '(Org . "9.6") + :type 'boolean) + (defvar org-cycle-tab-first-hook nil "Hook for functions to attach themselves to TAB. See `org-ctrl-c-ctrl-c-hook' for more information. @@ -775,6 +783,32 @@ STATE should be one of the symbols listed in the docstring of "Subtree is archived and stays closed. Use \ `\\[org-cycle-force-archived]' to cycle it anyway.")))))) +(defun org-cycle-display-inline-images (state) + "Auto display inline images under subtree when cycling. +It works when `org-cycle-inline-images-display' is non-nil." + (when org-cycle-inline-images-display + (pcase state + ('children + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, beg,end only from parent headline + ;; to first child headline which reference to upper + ;; let-binding `org-next-visible-heading'. + (org-display-inline-images + nil nil + (point-min) (progn (org-next-visible-heading 1) (point))))) + ('subtree + (org-with-wide-buffer + (org-narrow-to-subtree) + ;; If has nested headlines, also inline display images under all sub-headlines. + (org-display-inline-images nil nil (point-min) (point-max)))) + ('folded + (org-with-wide-buffer + (org-narrow-to-subtree) + (if (numberp (point-max)) + (org-remove-inline-images (point-min) (point-max)) + (ignore))))))) + (provide 'org-cycle) ;;; org-cycle.el ends here diff --git a/lisp/org-keys.el b/lisp/org-keys.el index d65379a72..79e34cbd1 100644 --- a/lisp/org-keys.el +++ b/lisp/org-keys.el @@ -204,7 +204,7 @@ (declare-function org-toggle-radio-button "org" (&optional arg)) (declare-function org-toggle-comment "org" ()) (declare-function org-toggle-fixed-width "org" ()) -(declare-function org-toggle-inline-images "org" (&optional include-linked)) +(declare-function org-toggle-inline-images "org" (&optional include-linked beg end)) (declare-function org-latex-preview "org" (&optional arg)) (declare-function org-toggle-narrow-to-subtree "org" ()) (declare-function org-toggle-ordered-property "org" ()) diff --git a/lisp/org.el b/lisp/org.el index 8191f0860..1cf091f58 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -16079,16 +16079,16 @@ SNIPPETS-P indicates if this is run to create snippet images for HTML." (defvar-local org-inline-image-overlays nil) -(defun org-toggle-inline-images (&optional include-linked) +(defun org-toggle-inline-images (&optional include-linked beg end) "Toggle the display of inline images. INCLUDE-LINKED is passed to `org-display-inline-images'." (interactive "P") (if org-inline-image-overlays (progn - (org-remove-inline-images) + (org-remove-inline-images beg end) (when (called-interactively-p 'interactive) (message "Inline image display turned off"))) - (org-display-inline-images include-linked) + (org-display-inline-images include-linked nil beg end) (when (called-interactively-p 'interactive) (message (if org-inline-image-overlays (format "%d images displayed inline" @@ -16178,8 +16178,8 @@ BEG and END define the considered part. They default to the buffer boundaries with possible narrowing." (interactive "P") (when (display-graphic-p) - (unless refresh - (org-remove-inline-images) + (when refresh + (org-remove-inline-images beg end) (when (fboundp 'clear-image-cache) (clear-image-cache))) (let ((end (or end (point-max)))) (org-with-point-at (or beg (point-min)) @@ -16329,11 +16329,16 @@ buffer boundaries with possible narrowing." (delete ov org-inline-image-overlays) (delete-overlay ov))) -(defun org-remove-inline-images () +(defun org-remove-inline-images (&optional beg end) "Remove inline display of images." (interactive) - (mapc #'delete-overlay org-inline-image-overlays) - (setq org-inline-image-overlays nil)) + (let* ((beg (or beg (point-min))) + (end (or end (point-max))) + (overlays (overlays-in beg end))) + (dolist (ov overlays) + (when (memq ov org-inline-image-overlays) + (setq org-inline-image-overlays (delq ov org-inline-image-overlays)) + (delete-overlay ov))))) (defvar org-self-insert-command-undo-counter 0) (defvar org-speed-command nil) -- 2.38.0 [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.3: 0002-test-org-fold.el-Add-test-for-inline-image-displayin.patch --] [-- Type: text/x-patch, Size: 12385 bytes --] From cd39d9d4797771bcd7f95b207f7d7174ad4d6736 Mon Sep 17 00:00:00 2001 From: stardiviner <numbchild@gmail.com> Date: Sun, 23 Oct 2022 15:11:56 +0800 Subject: [PATCH 2/2] test-org-fold.el: Add test for inline image displaying when cycling * testing/lisp/test-org-fold.el (test-org-fold/org-fold-display-inline-images): Add unit test for inline image displaying when cycling. --- .../images/Org mode logo mono-color.png | Bin 0 -> 7523 bytes testing/lisp/test-org-fold.el | 29 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100755 testing/examples/images/Org mode logo mono-color.png diff --git a/testing/examples/images/Org mode logo mono-color.png b/testing/examples/images/Org mode logo mono-color.png new file mode 100755 index 0000000000000000000000000000000000000000..9ac57e6a205257fd2fd21944a025190aa2f2db49 GIT binary patch literal 7523 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 literal 0 HcmV?d00001 diff --git a/testing/lisp/test-org-fold.el b/testing/lisp/test-org-fold.el index 8b19ffbc9..955ebc417 100644 --- a/testing/lisp/test-org-fold.el +++ b/testing/lisp/test-org-fold.el @@ -662,6 +662,35 @@ Unfolded Paragraph. (org-fold-check-before-invisible-edit kind) (should (org-invisible-p (1- (point)))))))))) +(ert-deftest test-org-fold/org-fold-display-inline-images () + "Test inline images displaying when cycling." + (let* ((org-cycle-inline-images-display t) + (images-dir (expand-file-name "examples/images/" org-test-dir)) + (org-logo-image (expand-file-name "Org mode logo mono-color.png" images-dir))) + ;; `org-cycle' -(state)-> `'children' display child inline images. + ;; TODO: + + ;; `org-cycle' -(state)-> `'subtree' display subtrees inline images. + ;; TODO: + + ;; `org-cycle' -(state)-> `'folded' remove inline image overlays. + (org-test-with-temp-text + (format "<point>* Heading 1 +[[file:%s]] +** Subheading 1 +[[file:%s]] +** Subheading 2 +[[file:%s]]" org-logo-image org-logo-image org-logo-image) + (org-overview) + (org-show-subtree) + (org-fold-subtree t) + (run-hook-with-args 'org-cycle-hook 'folded) + (should (null org-inline-image-overlays)) + (should (null (overlays-in (point-min) (point-max)))) + (org-show-subtree) + (should-not org-inline-image-overlays) + (should-not (overlays-in (point-min) (point-max)))))) + (provide 'test-org-fold) ;;; test-org-fold.el ends here -- 2.38.0 [-- Attachment #1.4: Type: text/plain, Size: 267 bytes --] -- [ stardiviner ] I try to make every word tell the meaning that I want to express without misunderstanding. Blog: https://stardiviner.github.io/ IRC(libera.chat, freenode): stardiviner, Matrix: stardiviner GPG: F09F650D7D674819892591401B5DF1C95AE89AC3 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 487 bytes --] ^ permalink raw reply related [flat|nested] 43+ messages in thread
* Re: [PATCH v3] New: auto display inline images under subtree when `org-cycle'. 2022-10-25 14:22 ` [PATCH v3] " Christopher M. Miles @ 2022-10-26 4:50 ` Ihor Radchenko 0 siblings, 0 replies; 43+ messages in thread From: Ihor Radchenko @ 2022-10-26 4:50 UTC (permalink / raw) To: Christopher M. Miles; +Cc: Ihor Radchenko, emacs-orgmode "Christopher M. Miles" <numbchild@gmail.com> writes: >> Sorry, I was not very clear. >> I meant to remove that patch that fails due to noninteractive and leave >> the rest. >> > > Updated, I deleted testing and marked as TODO. > Applied onto main. https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=46b71f910844c14d8db1feb54c07de26d101cc05 https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=87e50f467add3ddca635d32f97b9bd6061008faa Thanks for your contribution! -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92> ^ permalink raw reply [flat|nested] 43+ messages in thread
end of thread, other threads:[~2022-10-26 4:50 UTC | newest] Thread overview: 43+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-11-22 6:34 [QUESTION] How to specific image size attributes under headline scope? Christopher M. Miles 2021-11-22 18:31 ` Timothy 2022-08-18 12:44 ` Christopher M. Miles [not found] ` <m2o7whra7j.fsf@numbchild> 2022-08-22 17:10 ` Timothy 2022-08-23 0:24 ` Christopher M. Miles 2022-09-11 2:20 ` [SOLVED] " Christopher M. Miles 2022-09-11 2:25 ` Christopher M. Miles [not found] ` <631d472b.c80a0220.2b4b2.bf86SMTPIN_ADDED_BROKEN@mx.google.com> 2022-09-11 12:34 ` Ihor Radchenko 2022-09-12 1:54 ` [PATCH] " Christopher M. Miles 2022-09-12 1:59 ` [PATCH] New: auto display inline images under subtree when `org-cycle' Christopher M. Miles [not found] ` <m2wna9bbc2.fsf@numbchild> 2022-09-12 6:03 ` [ISSUE] " Christopher M. Miles [not found] ` <631e92ee.050a0220.f9c18.92f5SMTPIN_ADDED_BROKEN@mx.google.com> 2022-09-12 10:51 ` Ihor Radchenko 2022-09-13 1:09 ` [PATCH 2] " Christopher M. Miles [not found] ` <m2leqogiz8.fsf@numbchild> 2022-09-13 1:48 ` [PATCH 3] " Christopher M. Miles [not found] ` <631fe1c9.050a0220.3ab2b.3f52SMTPIN_ADDED_BROKEN@mx.google.com> 2022-09-15 3:27 ` Ihor Radchenko 2022-09-15 4:53 ` [PATCH 4] " Christopher M. Miles [not found] ` <6322b0a8.050a0220.59bb8.6923SMTPIN_ADDED_BROKEN@mx.google.com> 2022-09-15 8:47 ` Ihor Radchenko 2022-09-15 9:43 ` [PATCH 5] " Christopher M. Miles [not found] ` <6322f5ad.c80a0220.5e936.823eSMTPIN_ADDED_BROKEN@mx.google.com> 2022-09-20 7:01 ` [PATCH v6] " Ihor Radchenko 2022-09-20 11:32 ` [PATCH v6] " Christopher M. Miles [not found] ` <6329c8b0.050a0220.412d.0a6cSMTPIN_ADDED_BROKEN@mx.google.com> 2022-09-21 7:54 ` Ihor Radchenko 2022-09-28 12:55 ` [PATCH 2-v1] " Christopher M. Miles [not found] ` <633454e3.050a0220.7278b.1fa5SMTPIN_ADDED_BROKEN@mx.google.com> 2022-09-29 3:05 ` Ihor Radchenko 2022-09-29 6:06 ` Christopher M. Miles 2022-09-29 6:57 ` [PATCH 2-v1 (test v1)] " Christopher M. Miles [not found] ` <63353c69.370a0220.67788.e8a1SMTPIN_ADDED_BROKEN@mx.google.com> 2022-09-30 3:19 ` [PATCH 2-v1] " Ihor Radchenko 2022-09-30 8:27 ` [PATCH 2-v2] " Christopher M. Miles [not found] ` <6336a955.050a0220.4e72e.2b23SMTPIN_ADDED_BROKEN@mx.google.com> 2022-10-01 3:16 ` Ihor Radchenko 2022-10-01 9:51 ` [PATCH 2-v3] " Christopher M. Miles [not found] ` <63380f57.370a0220.a9d9a.dee8SMTPIN_ADDED_BROKEN@mx.google.com> 2022-10-03 3:21 ` Ihor Radchenko 2022-10-03 4:37 ` [PATCH 2-v4] " Christopher M. Miles [not found] ` <633a67d8.050a0220.733e8.e57dSMTPIN_ADDED_BROKEN@mx.google.com> 2022-10-04 4:36 ` Ihor Radchenko 2022-10-04 7:27 ` Christopher M. Miles [not found] ` <633be6d3.370a0220.4060.bacdSMTPIN_ADDED_BROKEN@mx.google.com> 2022-10-08 7:53 ` Ihor Radchenko 2022-10-08 9:50 ` Christopher M. Miles [not found] ` <634149f4.c80a0220.1376.e564SMTPIN_ADDED_BROKEN@mx.google.com> 2022-10-09 7:21 ` Ihor Radchenko 2022-10-10 8:40 ` Christopher M. Miles [not found] ` <m2v8os5aqy.fsf@numbchild> 2022-10-22 1:29 ` Christopher M. Miles 2022-10-23 4:33 ` Ihor Radchenko 2022-10-23 7:14 ` Christopher M. Miles 2022-10-25 7:23 ` Ihor Radchenko 2022-10-25 14:22 ` [PATCH v3] " Christopher M. Miles 2022-10-26 4:50 ` Ihor Radchenko
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.