道友们好,在使用 Linux emacs29 时,可以使用 yank-media
命令在 org-mode 中粘贴剪贴板中的图片。我发现剪贴板中的图片必须是浏览器中的,或者是截图软件 flameshot 的截图,而对于本地图片的复制(在文件管理器 dolphin
中直接 C-c
),则会报如下错误:
user-error: No handler in the current buffer for anything on the clipboard
我感觉会不会是因为 C-c
本地文件在剪贴板中的体现就是一个路径名,而不是一个媒体文件之类的东西,如下所示:
可以看到在 KDE 剪贴板中浏览器的复制图像就是一个像文件一样的东西,而本地文件只是一个路径名。
有没有办法让 org-mode 也可以识别这种路径名并做出和浏览器复制图片类似的响应。
我知道如果剪贴板保存的是路径名的话,其实直接复制也跟插入链接差不多。不过我最希望的在复制的时候可以将文件 download 到特定的文件夹内,而不是在其原本的路径下。所以我才希望可以用统一的方式进行处理。
2 个赞
yank-media-types
可以查看 clipboard 的复制类型,比如说 macOS 下复制图片如下
Org Mode 添加 dnd 和 yank 逻辑如下,可以看到当前只支持 "x/special-\\(?:gnome\\|KDE\\|mate\\)-files"
,所以需要自己 hack 一下
;;; Yank media handler and DND
(defun org-setup-yank-dnd-handlers ()
"Setup the `yank-media' and DND handlers for buffer."
(let ((handler (if (>= emacs-major-version 30)
#'org--dnd-multi-local-file-handler
#'org--dnd-local-file-handler)))
(setq-local dnd-protocol-alist
(append
(list (cons "^file:///" handler)
(cons "^file:/[^/]" handler)
(cons "^file:[^/]" handler))
dnd-protocol-alist)))
(when (fboundp 'yank-media-handler)
(yank-media-handler "image/.*" #'org--image-yank-media-handler)
;; Looks like different DEs go for different handler names,
;; https://larsee.com/blog/2019/05/clipboard-files/.
(yank-media-handler "x/special-\\(?:gnome\\|KDE\\|mate\\)-files"
#'org--copied-files-yank-media-handler))
(when (boundp 'x-dnd-direct-save-function)
(setq-local x-dnd-direct-save-function #'org--dnd-xds-function)))
3 个赞
感谢您的帮助,从这个逻辑看,似乎我需要使用 yank-media-handler
来注册一个自己的 handler 来完成对于本地文件的操作。
我的问题是,似乎 yank-media-handler
的 type
参数只能是 MIME,从逻辑上我有办法让它识别出路径吗?MIME 似乎只会区分图片、视频等。
我有办法在 yank-media-type 里定义一个类似于 clipboard:text/my-custom-handler
的东西吗?
下面那块记录路径的正则?具体 KDE 不太清楚应该是什么样子