用 yank-media 在 org-mode 中识别路径名并插入

道友们好,在使用 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 下复制图片如下 Screenshot 2024-10-06 at 12.04.52

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-handlertype 参数只能是 MIME,从逻辑上我有办法让它识别出路径吗?MIME 似乎只会区分图片、视频等。

我有办法在 yank-media-type 里定义一个类似于 clipboard:text/my-custom-handler 的东西吗?

下面那块记录路径的正则?具体 KDE 不太清楚应该是什么样子