URI: 
       ORG-DOWNLOAD-YANK FIX FOR "NOT A URL" ERROR
       
       
       
       
       It's broken
       ----------------------------------------------------------------------
       There's an open bug in the Emacs package `org-download-yank' that
       makes it difficult to use file addresses yanked from a dired buffer as
       the source of an image to be inserted in an org-mode document. The
       intended functionality is that the user can open a dired buffer,
       navigate to a file, type "0 w", switch to their org-mode buffer, and
       invoke `org-download-yank' to have that image inserted into the org
       file and stored in an assets folder. Instead, the function raises a
       "Not a URL" error.
       
       The source of the issue is trivial. The `org-download-yank' function
       raises errors for any argument (technically, the last entry in the
       kill ring) that does not posses a URL type.
       
       ,----
       |   ;; excerpt from org-download.el:org-download-yank
       |   (let ((k (current-kill 0)))
       |     (unless (url-type (url-generic-parse-url k))
       |       (user-error "Not a URL: %s" k))
       `----
       
       Given a value like "/home/roygbyte/someimage.png",
       `url-generic-parse-url' will return a struct. The `type' field is the
       URI scheme, which the example path does not contain. So, obviously it
       fails.
       
       Based on other issues raised in the project repo, the behavior of
       dired may have changed, and the package author moved onto other
       interests. Thus, the behavior was not fixed for newer version of
       Emacs. So it goes.
       
       I use `org-download-yank' function enough for my phlog workflow that I
       needed a fix. Fortunately, I really like introspecting Emacs and
       writing Elisp. It didn't take too long, and I learned some new things
       with my solution, below.
       
       
       Fixing it
       ----------------------------------------------------------------------
       My approach was to use `advice-add' to hook a function `:before' any
       invokation of `org-download-yank'. In my function, I take modify the
       last kill into a URL-like file path by prefixing it with "file:". It's
       a simple fix and the most straightfoward, non-invaisive solution I
       could summon. As you can see, the conditional block is nearly
       identical to what's used in `org-download-yank'. The fun bit that I
       got to learn about was the kill ring, including the second parameter
       of `kill-new' which will modify the current kill.
       
       ,----
       |   (defun modify-file-path-for-org-download-yank ()
       |     "org-download-yank has a bug where an image yanked from dired using
       |   `0 w` will raise 'Not a URL' error. This function, when added as
       |   advice to org-download-yank, makes it work. It prepends `file:`
       |   to the front of the last kill." 
       |     (let ((k (current-kill 0)))
       |       (when (and (not (url-type (url-generic-parse-url k)))
       Happy helping ☃ here: You tried to output a spurious TAB character. This will break gopher. Please review your scripts. Have a nice day!
       |         (kill-new (concat "file:" k) t)))) ;; `t` to replace front of kill ring
       |   (advice-add 'org-download-yank :before #'modify-file-path-for-org-download-yank)
       `----
       
   IMG Doodle of an image being yanked
       
       
       Footnotes
       ----------------------------------------------------------------------