抄了org-download的代码,实现拖拽文件到vterm变为文件路径

(with-eval-after-load 'vterm
  (defun vterm-dnd-copy-path (uri)
    (let* ((uri (url-unhex-string uri))
           (uri (string-as-multibyte uri))
           (parsed (url-generic-parse-url uri))
           (path (car (url-path-and-query parsed)))
           (path (concat "'" path "'")))
      (vterm-send-string path)))

  (defun vterm-dnd-fallback (uri action)
    (let ((dnd-protocol-alist
           (rassq-delete-all
            'vterm-dnd
            (copy-alist dnd-protocol-alist))))
      (dnd-handle-one-url nil action uri)))

  (defun vterm-dnd (uri action)
    (cond ((eq 'vterm-mode major-mode)
           (condition-case nil
               (vterm-dnd-copy-path uri)
             (error
              (vterm-dnd-fallback uri action))))
          ;; redirect to someone else
          (t
           (vterm-dnd-fallback uri action))))

  (defun vterm-dnd-enable ()
    (unless (eq (cdr (assoc "^file:///" dnd-protocol-alist))
                'vterm-dnd)
      (setq dnd-protocol-alist
            `(("^file:///" . vterm-dnd)
              ,@dnd-protocol-alist))))

  (defun vterm-dnd-disable ()
    "Disable vterm-dnd."
    (rassq-delete-all 'vterm-dnd dnd-protocol-alist))

  (vterm-dnd-enable))

4 个赞