From: "numbchild@gmail.com" <numbchild@gmail.com>
To: emacs-help <help-gnu-emacs@gnu.org>
Subject: [FIXED] Re: My advice-add :filter-args does not work
Date: Sat, 6 Jan 2018 19:53:26 +0800 [thread overview]
Message-ID: <CAL1eYuL29YRQO5jN=NUtiqDfH1-t7X4xc--+XTwgRPnRN_aE6Q@mail.gmail.com> (raw)
I fixed my own problem.
After check out function `create-image`.
I found it need to return a plist.
Here is the correct version:
```elisp
(defun org-display-inline-images--with-color-theme-background-color (args)
"Specify background color of Org-mode inline image through modify `ARGS'."
(let* ((file (car args))
(type (cadr args))
(data-p (caddr args))
(props (cdddr args)))
;; get this return result style from `create-image'
(append (list file type data-p)
(list :background (face-background 'default))
props)))
(advice-add 'create-image :filter-args
#'org-display-inline-images--with-color-theme-background-color)
```
[stardiviner] <Hack this world!> GPG key ID: 47C32433
IRC(freeenode): stardiviner Twitter: @numbchild
Key fingerprint = 9BAA 92BC CDDD B9EF 3B36 CB99 B8C4 B8E5 47C3 2433
Blog: http://stardiviner.github.io/
On Sat, Jan 6, 2018 at 7:12 PM, numbchild@gmail.com <numbchild@gmail.com>
wrote:
> As this question described https://emacs.stackexchange.co
> m/questions/20574/default-inline-image-background-in-org-
> mode/20598?noredirect=1#comment32673_20598
>
> I'm going to modify the Org-mode inline images background colour. The
> question's solution is define the original function again.
>
> ```elisp
> ;;; set default Org-mode inline image background color.
> (defcustom org-inline-image-background nil
> "The color used as the default background for inline images.
> When nil, use the default face background."
> :group 'org
> :type '(choice color (const nil)))
>
> ;;; set default background color based on different stategies.
> (defun my-org-mode-image-set-face (&args)
> (setq org-inline-image-background
> ;; a static color.
> ;; "#FFFFFF"
> ;; same color with color-theme background.
> (face-background 'default)
> ))
>
> (add-hook 'circadian-after-load-theme-hook #'my-org-mode-image-set-face)
>
> (defun org-display-inline-images (&optional include-linked refresh beg end)
> "Modified version of original `org-display-inline-images'.
> Append `:background' in `create-image'."
> (interactive "P")
> (when (display-graphic-p)
> (unless refresh
> (org-remove-inline-images)
> (when (fboundp 'clear-image-cache) (clear-image-cache)))
> (org-with-wide-buffer
> (goto-char (or beg (point-min)))
> (let ((case-fold-search t)
> (file-extension-re (image-file-name-regexp)))
> (while (re-search-forward "[][]\\[\\(?:file\\|[./~]\\)" end t)
> (let ((link (save-match-data (org-element-context))))
> ;; Check if we're at an inline image.
> (when (and (equal (org-element-property :type link) "file")
> (or include-linked
> (not (org-element-property :contents-begin
> link)))
> (let ((parent (org-element-property :parent link)))
> (or (not (eq (org-element-type parent) 'link))
> (not (cdr (org-element-contents parent)))))
> (org-string-match-p file-extension-re
> (org-element-property :path
> link)))
> (let ((file (expand-file-name
> (org-link-unescape
> (org-element-property :path link)))))
> (when (file-exists-p file)
> (let ((width
> ;; Apply `org-image-actual-width' specifications.
> (cond
> ((not (image-type-available-p 'imagemagick)) nil)
> ((eq org-image-actual-width t) nil)
> ((listp org-image-actual-width)
> (or
> ;; First try to find a width among
> ;; attributes associated to the paragraph
> ;; containing link.
> (let ((paragraph
> (let ((e link))
> (while (and (setq e
> (org-element-property
> :parent e))
> (not (eq
> (org-element-type e)
> 'paragraph))))
> e)))
> (when paragraph
> (save-excursion
> (goto-char (org-element-property :begin
> paragraph))
> (when
> (re-search-forward
> "^[ \t]*#\\+attr_.*?: +.*?:width
> +\\(\\S-+\\)"
> (org-element-property
> :post-affiliated paragraph)
> t)
> (string-to-number (match-string 1))))))
> ;; Otherwise, fall-back to provided number.
> (car org-image-actual-width)))
> ((numberp org-image-actual-width)
> org-image-actual-width)))
> (old (get-char-property-and-overlay
> (org-element-property :begin link)
> 'org-image-overlay)))
> (if (and (car-safe old) refresh)
> (image-refresh (overlay-get (cdr old) 'display))
> (let ((image (create-image file
> (and width 'imagemagick)
> nil
> :width width
> :background
> org-inline-image-background))) ; added here.
> (when image
> (let* ((link
> ;; If inline image is the description
> ;; of another link, be sure to
> ;; consider the latter as the one to
> ;; apply the overlay on.
> (let ((parent
> (org-element-property :parent
> link)))
> (if (eq (org-element-type parent)
> 'link)
> parent
> link)))
> (ov (make-overlay
> (org-element-property :begin link)
> (progn
> (goto-char
> (org-element-property :end link))
> (skip-chars-backward " \t")
> (point)))))
> (overlay-put ov 'display image)
> (overlay-put ov 'face 'default)
> (overlay-put ov 'org-image-overlay t)
> (overlay-put
> ov 'modification-hooks
> (list 'org-display-inline-remove-overlay))
> (push ov org-inline-image-overlays)))))
> ))))))))))
> ```
>
> I don't like this solution. Try to use advice. But I'm not good at Elisp.
> So I tried some search on Google and GitHub code. Try to understand some
> examples. I try this code snippet:
>
> ```elisp
> (defun org-display-inline-images--with-color-theme-background-color
> (args) ; (file-or-data &optional type data-p &rest props)
> "Specify background color of Org-mode inline image through modify
> `ARGS'."
> (let* ((file (car args))
> (type (cadr args))
> (data-p (caddr args))
> (props (cdddr args)))
> (list file type data-p (append (list :background (face-background
> 'default)) props))))
>
> (advice-add 'create-image :filter-args
> #'org-display-inline-images--with-color-theme-background-col
> or)
>
> ```
> But it does not work.
>
> Hope someone can help me to fix this advice.
>
> [stardiviner] <Hack this world!> GPG key ID: 47C32433
> IRC(freeenode): stardiviner Twitter: @numbchild
> Key fingerprint = 9BAA 92BC CDDD B9EF 3B36 CB99 B8C4 B8E5 47C3 2433
> Blog: http://stardiviner.github.io/
>
reply other threads:[~2018-01-06 11:53 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAL1eYuL29YRQO5jN=NUtiqDfH1-t7X4xc--+XTwgRPnRN_aE6Q@mail.gmail.com' \
--to=numbchild@gmail.com \
--cc=help-gnu-emacs@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.