修改拖拽协议让文件拖入org-mode自动转换为链接

(use-package dired
    :custom
    (dired-dnd-protocol-alist nil))

(defun your-dnd-handler (url _action)
  (if
      (or (eq major-mode 'org-mode) (when (derived-mode-p 'org-mode))) 
      (insert (concat "[[file+sys:"  (substring (decode-coding-string (url-unhex-string url) 'utf-8) 5 nil)"]]"))
    (dired (substring (decode-coding-string (url-unhex-string url) 'utf-8) 5 nil))
    ))

(setq dnd-protocol-alist
      '(("" . your-dnd-handler)))

这样一来,在org-mode里,将文件/文件夹拖入会自动转换成一个指向文件/文件夹路径的链接,形如

[[file+sys:E:/my.docx]]

这个链接可以通过C-c C-o或单击,调用系统默认打开方式打开。

而在非org-mode的buffer里,则会用dired打开文件/文件夹。虽然我的本意是通过dired代替windows资源管理器,最后发现还是资源管理器好用。

6 个赞

大佬,我希望将文件拖进去之后是 /home/username/path_to_file ,不想要 file+sys:// 的格式。如果简单的删掉 file+sys: 就会变成 ///home/username/path_to_file 。不知怎么设置能够不要前面那两个斜杠?

(substring (decode-coding-string (url-unhex-string url) 'utf-8) 5 nil)

改为

(substring (decode-coding-string (url-unhex-string url) 'utf-8) 7 nil)

这样就会把路径截取的起始点从5往后延伸到7

多谢大佬 :smile: