Org 中直接复制 macOS 剪贴板中的图片

之前的方式一直很土,先把图片下载到固定目录,然后再去引用。感谢 org-download + pngpaste,现在的工作流:

  1. Cmd+Ctrl+Shift+4 进行截屏,并复制到剪贴板
  2. 运行org-download-screenshot 复制到 org 中
  3. 完美
  • 具体配置可参考:
6 个赞

org download 貌似可以直接把图片拖进emacs :see_no_evil:

是支持拖拽,但是我的emacs 一般都是全屏的,剪贴板是更方便的方式。

我从桌面或浏览器拖进去的话,是在emacs buffer里打开而不是插入一个链接,这是什么情况?

macOS / doom-emacs

我的Safari拖入图片是个链接,Chrome正常,见鬼

Mac下的话,其自带的命令行截屏工具screencapture挺好用的,支持窗口切换,org-download也有集成,把screenshot-method换成screencapture即可。

今天研究了一下,可以直接使用elisp实现复制macOS剪贴板里的图片,毕竟我习惯使用QQ微信的cmd-shift-a截屏,可以先从kill-ring中得到图片,然后可以直接写入文件

(let ((image (get-text-property 0 'display (current-kill 0))))
  (when (or (not (consp image)) (not (eq (car image) 'image)))
    (error "No image found"))
  (with-temp-buffer
    (let ((file (plist-get (cdr image) :file)))
      (if file
          (if (not (file-exists-p file))
              (error "File %s no longer exists" file)
            (insert-file-contents-literally file))
        (insert (plist-get (cdr image) :data))))
    (write-region (point-min) (point-max)
                  (read-file-name "Write image to file: "))))

也可以结合org-download来使用

(defun maple/org-download-yank()
    (interactive)
    (let ((file  org-download-screenshot-file)
          (image (get-text-property 0 'display (current-kill 0))))
      (if (or (not (consp image)) (not (eq (car image) 'image)))
          (org-download-yank)
        (with-temp-buffer
          (insert (plist-get (cdr image) :data))
          (let ((coding-system-for-write 'no-conversion))
            (write-region nil nil file)))
        (when (file-exists-p file)
          (org-download-image file)
          (delete-file file)))))

不过有一个问题,连续截屏情况下只会粘贴第一张图片,不知道是什么原因