org-download在拖入带中文的图片会出现问题

org-download提供了一个功能,从本地拖入一张图片,它会自动将图片保存到一定的位置并且插入一个链接。

比如,我用文件管理器将 =~/test/测试.png= 文件拖入到emacs里,会自动插入:

#+DOWNLOADED: file:///home/xxx/%E6%B5%8B%E8%AF%95.png @ 2017-03-15 23:00:03
[[file:README/%E6%B5%8B%E8%AF%95_2017-03-15_23-00-03.png]]

并且会把图片复制到对应的文件:

xxx@localhost:~/xxx/README$ ls
%E6%B5%8B%E8%AF%95_2017-03-15_23-00-03.png

问题来了。通过[[file:README/%E6%B5%8B%E8%AF%95_2017-03-15_23-00-03.png]]其实并不是链接到那个文件上,这个地址是url编码过的,也就是说,他实际上是链接到文件 测试95_2017-03-15_23-00-03.png 上的!

但是更诡异的还在后面。 为了解决这个问题,我找到了变量 org-download-method , 它可以是一个自定义函数,这个函数输入图片链接,返回文件要保存的地址。我写了以下代码做了测试:

  (defun org-download-test-test-test (link)
    (message link)
    (let ((result (org-download--fullname link)))
      (message result)
      result))
  (setq org-download-method 'org-download-test-test-test)

很遗憾的是没有作用。并且,如果我直接在minibuffer中调用 ** (funcall org-download-method “test.png”) ** 是正常的,但是我在org-download.el对应的调用点插入输出(已删除org-download.elc)发现此函数调用出了问题。

奇怪的是,如果我这样配置:

  (setq org-download-method 'org-download--fullname)

却是没有问题的。

百思不得其解,故来向各位大神们请教,希望能解决这个问题。

图片名字不要是中文就好了吧,你可以试试。

然后关于后面的那个函数,你可以去org-downloadissue里面看到它的作者给别人写的function,我对lisp不熟,所以看不大懂。

1 个赞

找到原因了。真心坑爹啊,也不知道那个org-download-method到底是被什么触发调用的,那里面不能有任何输出!!!!

好了,代码写好了,下面代码解决了中文路径问题:

  (defun custom-org-download-method (link)
    (org-download--fullname (org-link-unescape link)))
  (setq org-download-method 'custom-org-download-method) ; 注意:这里不能用lambda表达式

;; 顺便改下annotate,就是自动插入的那行注释,里面写的是图片来源路径
  (setq org-download-annotate-function
        '(lambda (link)
           (org-download-annotate-default (org-link-unescape link))))
5 个赞

上面的代码逻辑很简单,只测试过本地图片,其它的我没测试。

谢谢大佬,问题解决

用 org-download 处理本地文件比较少,之前还真没注意到这个问题。感谢 :heart:

中文的语义化处理其实一直是非默认的,常常出现。

前几天我在cront服务里面加了一个后台任务,其命令的绝对路径包含中文目录。任务运行起来后用ps查找这个进程,中文字符前的命令可以grep匹配上,中文后面的英文数字字符grep根本感知不到,对了ps列表中路径的中文部分是问号等乱码。

后来我把中文路径改成了英文,就都正常了。

我也很烦这个问题,明明拖进来的文件连中文的没有,为啥它给我显示这个? QQ图片20200328190413 拖动的文件真实url是上面DOWNLOADED的这个

FYI:

C-c C-x C-v runs the command org-toggle-inline-images (found in
org-mode-map), which is an interactive compiled Lisp function in
‘org.el’.

It is bound to C-c C-x C-v.

(org-toggle-inline-images &optional INCLUDE-LINKED)

Toggle the display of inline images.
INCLUDE-LINKED is passed to ‘org-display-inline-images’.


Not sure how you drag the image into Emacs. Maybe Chinese in PATH?