在win上向org-mode中插入截图的一个解决方案

我是以前从论坛上找到了一个很有用的函数, 然后最近根据自己的需要做了一些修改, 觉得挺好用的, 所以分享出来了.

前置: 需要安装imagemagick

功能:根据截图的大小, 动态的决定在org-mode中显示的宽度. 如果截图太大, 那么就将宽度设置成800, 否则就使用截图本身的宽度.

使用方法: 再将图片复制到粘贴板以后, 调用 ~rw/org-insert-picture-clipboard~.

: 如何获取一个图片的宽度? 首先需要用 ~create-image~ 通过文件创建一个图片对象, 然后使用 ~image-size~ 获得宽度. 其中 ~image-size~ 的参数要设置成pixels.

代码

(setq org-image-actual-width nil)
(defun rw/org-insert-picture-clipboard ()
  (interactive)
  (let* ((image-dir
          (if (not (buffer-file-name))
              (cond ((string-prefix-p "CAPTURE-[0-9]" (buffer-name))
        	     (let ((buffer-name (replace-regexp-in-string "CAPTURE-[0-9-]*" "" (buffer-name))))
        	       (concat (file-name-directory (buffer-file-name (get-file-buffer buffer-name))) "images")))
        	    (t (yank) (error "")))
            "images"))
         (fname (concat (make-temp-name "image-") (format-time-string "%Y%m%d-%H%M%S")))
         (image-file (concat image-dir "/" fname ".png")))

    (unless (file-exists-p image-dir) (make-directory image-dir))
    ;; 将剪贴板中的图片保存为image-file
    (call-process "magick" nil nil nil
        	  "clipboard:" image-file)
    (let* ((image-width (first (image-size (create-image image-file) t)))
           (display-width (if (< image-width 800)
                              image-width
                            800)))
      (insert (concat "#+ATTR_ORG: :width " (number-to-string display-width) "\n")))
    (insert (format "[[file:%s]]" image-file))
    (org-display-inline-images)
    ))

4 个赞