粘贴剪切板中的图片为 Markdown 链接(概念验证)

分享一下我在windows下的的粘贴函数,需要安装imagemagick。

  1. 使用任何应用软件截屏或者复制图片到剪贴板,在org-mode里粘贴即可。图片会自动保存到当前文件目录下的images文件夹里。
  2. 该函数支持粘贴剪贴板的文字和图片,所以你可以将Ctrl-y绑定到该函数上,然后如粘贴文字一样粘贴图片,当然文字也OK。
  3. Ctrl-u Ctrl-y会提示为图片命名,并在文档中引用该图片,同时会提示为图片插入caption。
  4. 在org capture buffer中粘贴时,该函数会找到目标文件的目录,并将图片保存到该目录中。
(defun org-insert-clipboard (&optional captionp)
  (interactive "P")
  (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"))
	 (exit-status
	  (call-process "convert" nil nil nil
			"clipboard:" image-file)))
    (if (zerop exit-status)
	(progn
	  (unless (file-exists-p image-dir) (make-directory image-dir))
	  (if captionp
	      (let ((rename (read-string "Filename to rename the temp images: ")))
		(rename-file image-file (concat image-dir "/" rename ".png") t)
		(insert (format "#+CAPTION: %s label:fig:%s\n" (read-string "Caption: ") rename))
		(kill-new (format "Fig. ref:fig:%s " rename)))
	    (insert (format "[[file:%s]]" image-file))
	    (org-display-inline-images)))
      (when captionp (user-error "No images in clipboard."))
      (yank))))
7 个赞