help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FIXED] Re: My advice-add :filter-args does not work


From: address@hidden
Subject: [FIXED] Re: My advice-add :filter-args does not work
Date: Sat, 6 Jan 2018 19:53:26 +0800

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 via email to

[Prev in Thread] Current Thread [Next in Thread]