Bild von Bild-URL im Puffer anzeigen


7

Es scheint, dass dies ziemlich einfach sein sollte, da Emacs weiß, wie man Bilder anzeigt.

Angenommen, ich habe in einem Puffer eine URL zu einem Bild wie:

http://centre.nikkeiplace.org/wp-content/uploads/2012/07/aikido11.jpg

Ich möchte das Caret auf diese URL setzen, eine Funktion wie aufrufen expand-image-from-urlund das Bild inline rendern lassen.

Ist das etwas, das leicht möglich ist?

Antworten:


10

Wenn es Ihnen nichts ausmacht, dass das Bild in einem anderen Puffer angezeigt wird, tun Sie es einfach

M-x ffap

Wenn Sie darauf bestehen, dass das Bild im aktuellen Puffer angezeigt wird, müssen Sie nur ein wenig mehr Arbeit leisten:

(require 'url)

(defun insert-image-from-url (&optional url)
  (interactive)
  (unless url (setq url (url-get-url-at-point)))
  (unless url
    (error "Couldn't find URL."))
  (let ((buffer (url-retrieve-synchronously url)))
    (unwind-protect
         (let ((data (with-current-buffer buffer
                       (goto-char (point-min))
                       (search-forward "\n\n")
                       (buffer-substring (point) (point-max)))))
           (insert-image (create-image data nil t)))
      (kill-buffer buffer))))

Das ist die Sache, ich möchte, dass es inline im selben Puffer angezeigt wird.
Bitops

1
Du bist ein harter Kunde. Mit einem Beispielcode bearbeitet.
jch

Sehr schön! Eines ist zu beachten: Ich musste mir einige der 'thingatpt'-Pakete schnappen, damit es funktioniert. Ich nehme an, url-get-url-at-point ist kein eingebauter Befehl.
Bitops

1
Du brauchst nur (require 'url).
jch

Vielen Dank! Funktioniert perfekt.
Giessel

0

Mit der folgenden umgeschriebenen Funktion können Sie sowohl Inline-Bilder als auch Web-Bilder (genau wie beim Anzeigen von Inline-Bildern) im Org-Modus anzeigen (wenn sich Ihre Arbeitsumgebung im Org-Modus befindet).

  1. Wenn ein Inline-Bild angezeigt wird, wird eine Daumendatei auf der lokalen Festplatte generiert und angezeigt. Auf diese Weise können Sie Ihr Bild so frei wie möglich mit Anmerkungen versehen, ohne das Originalbild zu beschädigen.
  2. Wenn das URL-Bild angezeigt wird, wird das Bild in einer Variablen gespeichert und ohne Download angezeigt.

Jede Erweiterung kann möglich sein. Natürlich können Sie das Inline-Bild anzeigen, aber die Daumendatei nicht durch geringfügige Änderungen generieren. Aber ich bevorzuge den obigen Weg.

(defun org-display-inline-images (&optional include-linked refresh beg end)
  "Display inline and url images.
Normally only links without a description part are inlined, because this
is how it will work for export.  When INCLUDE-LINKED is set, also links
with a description part will be inlined.  This
can be nice for a quick
look at those images, but it does not reflect what exported files will look
like.
When REFRESH is set, refresh existing images between BEG and END.
This will create new image displays only if necessary.
BEG and END default to the buffer boundaries."
  (interactive "P")
  (unless refresh
    (org-remove-inline-images)
    (if (fboundp 'clear-image-cache) (clear-image-cache)))
  (save-excursion
    (save-restriction
      (widen)
      (setq beg (or beg (point-min)) end (or end (point-max)))
      (goto-char beg)
      (let ((re (concat "\\(\\(http\\)\\|\\(\\[\\[\\(\\(file:\\)\\|\\([./~]\\)\\)\\)\\)\\([^]\n]+?"
                    (substring (org-image-file-name-regexp) 0 -2)
                    "\\)" (format "\\(\\(\\]%s\\)\\|\\)" (if include-linked "" "\\]"))))
        old file ov img width point-begin point-end)
    (while (re-search-forward re end t)
      (setq old (get-char-property-and-overlay (match-beginning 1)
                                               'org-image-overlay)
            match (match-string-no-properties 0)
            point-begin (match-beginning 0)
            point-end (match-end 0))
      (if (s-starts-with? "http" match)
          (save-excursion
            (let* ((buffer (url-retrieve-synchronously match))
                   (unwind-protect
                       (let ((data (with-current-buffer buffer
                                     (goto-char (point-min))
                                     (search-forward "\n\n")
                                     (buffer-substring (point) (point-max)))))
                         (require 'image+)
                         (setq img (imagex--fit-to-size (create-image data 'jpeg t) 400 400)))))))
        (setq file (expand-file-name
                    (concat (or (match-string 6) "") (match-string 7)))
              width (if (eq (car (org-element-property :parent (org-element-at-point))) 'table) 200 400))
        (when (file-exists-p file)
          (let ((file-thumb (format "%s%s_thumb.png" (file-name-directory file) (file-name-base file))))
            (if (file-exists-p file-thumb)
                (let ((thumb-time (nth 5 (file-attributes file-thumb 'string)))
                      (file-time (nth 5 (file-attributes file 'string))))
                  (if (time-less-p thumb-time file-time)
                      (shell-command (format org-imagemagick-display-command
                                             file width width file-thumb) nil nil)))
              (shell-command (format org-imagemagick-display-command
                                     file width width file-thumb) nil nil))
            (if (and (car-safe old) refresh)
                (image-refresh (overlay-get (cdr old) 'display))
              (setq img (save-match-data (create-image file-thumb)))))))
      (when img
        (setq ov (make-overlay point-begin point-end))
        (overlay-put ov 'display img)
        (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)))))))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.