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-download
的issue
里面看到它的作者给别人写的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 处理本地文件比较少,之前还真没注意到这个问题。感谢
laub
2019 年11 月 10 日 14:17
7
中文的语义化处理其实一直是非默认的,常常出现。
前几天我在cront服务里面加了一个后台任务,其命令的绝对路径包含中文目录。任务运行起来后用ps查找这个进程,中文字符前的命令可以grep匹配上,中文后面的英文数字字符grep根本感知不到,对了ps列表中路径的中文部分是问号等乱码。
后来我把中文路径改成了英文,就都正常了。
我也很烦这个问题,明明拖进来的文件连中文的没有,为啥它给我显示这个?
拖动的文件真实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?