Hiển thị hình ảnh từ url hình ảnh trong bộ đệm


7

Có vẻ như điều này khá đơn giản vì Emacs biết cách hiển thị hình ảnh.

Trong bộ đệm, giả sử tôi có URL tới một hình ảnh như:

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

Tôi muốn đặt dấu mũ vào url đó, gọi một hàm như thế expand-image-from-urlvà để nó hiển thị hình ảnh thẳng hàng.

Đây có phải là một cái gì đó dễ dàng có thể?

Câu trả lời:


10

Nếu bạn không nhớ hình ảnh được hiển thị trong một bộ đệm khác, chỉ cần làm

M-x ffap

Nếu bạn nhấn mạnh vào hình ảnh xuất hiện trong bộ đệm hiện tại, bạn sẽ cần thực hiện thêm một chút công việc:

(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))))

Đó là điều, tôi muốn nó hiển thị nội tuyến trong cùng một bộ đệm.
bitops

1
Bạn là một khách hàng khó tính. Chỉnh sửa với một số mã mẫu.
JCH

Rất đẹp! Một điều cần lưu ý: Tôi đã phải lấy một số gói 'thingatpt' để làm cho nó hoạt động. Tôi cho rằng url-get-url-at-point không phải là lệnh tích hợp.
bitops

1
Bạn chỉ cần (require 'url).
JCH

Cảm ơn bạn! Hoạt động hoàn hảo.
tàu

0

Bạn có thể sử dụng chức năng viết lại sau đây để hiển thị hình ảnh nội tuyến cũng như hình ảnh web (chính xác như cách hiển thị hình ảnh nội tuyến) trong chế độ Org (nếu môi trường làm việc của bạn ở chế độ Org).

  1. khi hiển thị hình ảnh nội tuyến, nó sẽ tạo một tập tin ngón tay cái vào đĩa cục bộ và hiển thị nó. Bằng cách sử dụng điều này, bạn có thể chú thích hình ảnh của bạn miễn phí nhất có thể mà không làm hỏng hình ảnh gốc của bạn.
  2. khi hiển thị hình ảnh url, nó sẽ lưu hình ảnh vào một biến và hiển thị nó mà không cần tải xuống.

Bất kỳ phần mở rộng có thể có thể. Tất nhiên bạn có thể hiển thị hình ảnh nội tuyến nhưng không tạo tệp ngón tay cái bằng cách thay đổi một chút. Nhưng tôi thích cách trên.

(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)))))))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.