一个在 org-mode 中粘贴图片的函数(macOS,AppleScript)

(defun org-insert-image ()
    (interactive)
    (let* ((path (concat default-directory "img/"))
		   (image-file (concat
						path
						(buffer-name)
						(format-time-string "_%Y%m%d_%H%M%S.png"))))
	  (if (not (file-exists-p path))
		  (mkdir path))
	  (shell-command (concat "pngpaste " image-file))
	  (org-insert-link nil (concat "file:" image-file) ""))
      ;; (org-display-inline-images) ;; inline显示图片
	)

需要安装一个小插件pngpaste 可以通过brew install pngpaste安装

可以自己修改路径/文件名。

用途:

  1. macOS下用系统截图,借助这个函数可以直接插入。
  2. 网页上的图片可以直接复制然后放进来(我已经卸载了org-download)。

似乎也可以不用插件,用AppleScript实现。但是我不会 :pensive:

UPDATE1:有了一个AppleScript的版本,不需要安装pbpaste #4楼

3 个赞

很棒,有一个类似的包叫org-download很好用。

我卸载了这个包,因为在emacs全屏的情况下不好拖入其他图片。 据说这个包也可以粘贴剪贴板中的图片,但是在我这里并不能工作。

1 个赞

我写了一个AppleScript的版本,不需要安装pbpaste

(defun org-insert-image ()
  "insert a image from clipboard"
    (interactive)
    (let* ((path (concat default-directory "img/"))
		   (image-file (concat
						path
						(buffer-name)
						(format-time-string "_%Y%m%d_%H%M%S.png"))))
	  (if (not (file-exists-p path))
		  (mkdir path))
	  (do-applescript (concat
					   "set the_path to \"" image-file "\" \n"
					   "set png_data to the clipboard as «class PNGf» \n"
					  "set the_file to open for access (POSIX file the_path as string) with write permission \n"
					  "write png_data to the_file \n"
					  "close access the_file"))
	  ;; (shell-command (concat "pngpaste " image-file))
	  (org-insert-link nil
					   (concat "file:" image-file)
					   "")
	  (message image-file))
      (org-display-inline-images)
	)

已知的问题:AppleScript更慢一些,文件较大时延迟略大(尤其是截图,其他网页上复制的可以接受)。

怎么异步后台执行command?

1 个赞

我又仿造了一个org-insert-file……输入路径加入文件

(defun org-insert-file (file-path)
  "insert a file in org"
  (interactive (list (read-buffer (format "path: " ) (current-kill 0) t)))
    (let* ((path (concat default-directory "file/"))
		   (new-file (concat
						path
						(buffer-name)
						(format-time-string "_%Y%m%d_%H%M%S_")
						(file-name-nondirectory file-path))))
	  (if (not (file-exists-p path))
		  (mkdir path))
	  (shell-command (concat "cp " file-path " " new-file))
	  (org-insert-link nil (concat "file:" new-file) "")
	  (message new-file))
	)

EDIT: 好像C-u C-c C-l就可以插入文件了

1 个赞

谢谢老哥,挺好用的。我也喜欢先截图后粘贴的形式。org-download是调用命令截图。不习惯