求问,在Org mode下面,怎么让从Emacs外部的图片拖拽到Emacs时,Emacs把图片放到指定的文件夹下,然后Org文件里面加入:[[file:图片文件名]]
,有没有插件能实现这个?
可以试试这个
这个是放到指定文件夹,那怎么做插入[[file:图片文件名]]
?
可以直接拖进org buffer
插进去的那个图片就是file:xxx的link,自定义下载目录请看README
试试 (emacs) Drag and Drop,不了解现成的方案,自己动手貌似没难点?
(setq dnd-protocol-alist
(list (cons ""
(lambda (url action) (message "=> %S %S" url action)))))
;; 拖拽一个本地图片
;; => "file:///Users/xcy/Downloads/emacs.png" private
;; 本想拖拽一个远程图片(但变成了链接)
;; => "https://www.gnu.org/software/emacs/emacs.html" copy
;; 拖拽一个远程文件
;; => "https://www.gnu.org/software/emacs/images/teaser.png" copy
;; 这个函数还支持本地文件
(url-copy-file "file:///Users/xcy/Downloads/emacs.png" "x.png")
主要是要支持拖拽本地和网络上的文件,然后放到指定文件夹里,最后生成[[file:FILENAME]]
自己动手,丰衣足食。
(defun your-dnd-handler (url _action)
(let ((filename (expand-file-name
(file-name-nondirectory url)
"~/Pictures")))
(url-copy-file url filename)
(insert (org-make-link-string filename))))
(setq dnd-protocol-alist
'(("" . your-dnd-handler)))
我先去看看文档先。。
我觉得拖过去还不如截图呢,一些网站的图片链接并不能直接下载的,你有链接也下不到
请教,如果要在拖动同时缩小图片(如用convert),怎么加代码?
你这问题解决了吗?我emacs上也是必须加file:后C-c-x-v才能显示。可惜上面的方案不能直接加上file:
用 shell-command 之类的函数调用 convert 命令。
我还没学会写lisp,能否具体指点一下。谢谢!!
shell-command-to-string
应该用过吧,第一次用也很容易上手,传入命令,返回输出:
(shell-command-to-string "date")
;; =>
"Mon Jun 8 23:21:49 CST 2020
"
(shell-command-to-string "convert image.png -resize 50% image.png")
;; => ""
文件名有 Shell 特殊字符(空格之类的),可以用 shell-quote-argument
转义,
(shell-command-to-string
(format "convert %s -resize 50%% %s"
(shell-quote-argument "another image.png")
(shell-quote-argument "another image.png")))
;; => ""
更好的方法是 call-process
,等你掌握了 shell-command-to-string 再学也不迟。
可以用 process-lines
(process-lines "date") ;; => ("2020年 06月 09日 星期二 01:22:54 CST")
(process-lines "convert" "another image.png" "-resize" "50%" "one image.png")
在使用org-download-yank之后,怎么给图片的头部自动添加latex属性呢?我主要输出latex
#+ATTR_LATEX: :width 0.38\textwidth :placement {0.4\textwidth}
#+ATTR_LATEX: :caption \caption{HeadingA}{HeadingB}
非常感谢!,Linux下搞定了,好用。 Windows下就很惨,貌似org-download包不支持pdump模式,只要一调用
org-download-yank
dump模式下的emacs直接崩。 另外,windows下即使设置org-download-screenshot-method为i_view64 也不行, 不弹出截图的界面,目前windows下只能老实将网络图片下载,然后拖进org文档的 buffer里,下面附我的配置,不知道是不是哪里有不对的地方。
(use-package org-download
:after org
:bind (:map org-mode-map
("<f2> f" . org-download-screenshot))
:ensure nil
:config
(setq org-download-method 'directory)
(setq org-download-display-inline-images 'posframe)
(setq org-download-screenshot-file (concat temporary-file-directory "image.png"))
(setq org-download-image-attr-list
'("#+ATTR_HTML: :width 80% :align center"))
(when (eq system-type 'windows-nt)
;;(setq org-download-screenshot-method "convert clipboard: %s")
(setq org-download-screenshot-method "i_view64 /capture=4 /convert=\"%s\"")
)
(org-download-enable))
Windows上,网页上的图片直接拖进org里确实不大好实现。
不过,如果想截图的话,直接调用截图软件就可以了。
截图并编辑:
(defun zx-org/capture-edit ()
(interactive)
(lower-frame)
(let ((imagename (concat (format-time-string "%Y-%m-%d_%H-%M-%S") ".jpg"))
(imagepath (concat (file-name-directory buffer-file-name) "Images/" (file-name-sans-extension (buffer-name)) "-img/"))
(shortpath (concat "Images/" (file-name-sans-extension (buffer-name)) "-img/"))
;; (irfanview (concat tools "IrfanView/i_view32.exe"))
;; (picpick (concat tools "picpick/picpick.exe"))
)
(shell-command (concat " i_view32 /capture=4 /convert=" "\"" imagepath (format "\%s\"" imagename)))
(shell-command (concat " picpick " imagepath (format "\%s\"" imagename)))
(insert (concat "#+ATTR_ORG: :width 300\n" "[[File:" shortpath imagename "]]"))
(org-redisplay-inline-images)
))
注意:lower-frame决定要不要截图时最小化Emacs界面; i_view32和picpick的程序我直接加进了PATH里面,你只要保证能调用就行了。