Org mode拖拽图片解析

求问,在Org mode下面,怎么让从Emacs外部的图片拖拽到Emacs时,Emacs把图片放到指定的文件夹下,然后Org文件里面加入:[[file:图片文件名]],有没有插件能实现这个?

2 个赞

可以试试这个

这个是放到指定文件夹,那怎么做插入[[file:图片文件名]]

可以直接拖进org buffer

插进去的那个图片就是file:xxx的link,自定义下载目录请看README

%E6%B7%B1%E5%BA%A6%E5%BD%95%E5%B1%8F_emacs_20191120120627

试试 (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)))
1 个赞

我先去看看文档先。。

我觉得拖过去还不如截图呢,一些网站的图片链接并不能直接下载的,你有链接也下不到

请教,如果要在拖动同时缩小图片(如用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")
1 个赞

@xuchunyang @cireu 衷心感谢作答!太羞愧了,看不懂啊 :joy: :joy: :sweat: :sweat:见谅。我没写过lisp,orgmode纯粹拿来当笔记软件用。上述答案拷入init.el中后,出错。

在使用org-download-yank之后,怎么给图片的头部自动添加latex属性呢?我主要输出latex

#+ATTR_LATEX: :width 0.38\textwidth :placement {0.4\textwidth}
#+ATTR_LATEX: :caption \caption{HeadingA}{HeadingB}

我原来弄过,后来删了。你可以自己修改一下。 org-download里有一个org-download-heading之类的东西。 不过,现在好像直接就有这种功能了。

非常感谢!,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里面,你只要保证能调用就行了。