orgmode有各种各样的好处,主要是文本折叠和缩进的功能实在太好用,gtd也功 能很强大。无论是用于hugo编辑工具还是作为笔记的主力,都是很好的实践。 但有一个问题,是emacs和org的弱项-图片处理。

在word等所见即所得的编辑工具中,插入图片可以很顺利的完成。而要在org文 档中插入一个图片,就麻烦很多。首先需要下载图片到一个特定的目录,插入图 片的时候,还需要用链接的方式把目录打出来。显示也不直观,往往在生成pdf 文档后,才发现图片过大或者过小,需要调整。随着时间的推移,org文档依赖 的图片也会增删改,导致文档的图片丢失。

但emacs和org有高度可定制性,通过搜索资料,找到了几乎完美的解决办法。

org-download

它可以现实以下功能:

  • 通过鼠标拖拽图片到emacs里,实现图片插入
  • 通过绑定的快捷键激活外部截屏工具,以鼠标选定截屏区域,选好后直接插入 截图

安装

在emacs的emlp库中找到后,i选择安装,然后x执行就可以。

配置

  • 官网的配置
(require 'org-download)
(add-hook 'dired-mode-hook 'org-download-enable)

上面的配置仅能实现鼠标拖拽插入图片的功能,

  • 我的配置,其中定义annotate这个函数是为了避免每次截图都显示图片的一些注

释信息。

(require 'org-download)
(add-hook 'dired-mode-hook 'org-download-enable)
(setq org-download-annotate-function (lambda (_link) ""))
  • 通过配置模式生成的配置
    (custom-set-variables
    ;; custom-set-variables was added by Custom.
    ;; If you edit it by hand, you could mess it up, so be careful.
    ;; Your init file should contain only one such instance.
    ;; If there is more than one, they won't work right.
    '(org-agenda-files
      '("~/.todos/journal.org" "~/.todos/gtd.org" "~/.todos/work.org"))
    '(org-download-screenshot-method "screencapture -i %s")
    '(package-selected-packages
      '(org-download yasnippet ox-hugo openwith elpy magit magit-gerrit magithub)))
    

org-download默认依赖的命令行截屏工具如下:

  • Windows:imagemagick/convert;
  • Linux:gnome-screenshot, scrot, gm, xclip;
  • MAC:screencapture

通过以上配置,就可以在mac上,配置图片截屏工具使用screencapture,实现截 屏图片快捷插入,也可以拖砖插入。

截图保存的图片名称:时间戳+截屏软件名称.png

截图保存的图片路径:以org文档的最外层标题为目录名,保存的org文档的同级目录下,如果不存在则创建

截屏的命令是

M-x -d-sc

也可以自己定义一个快捷键。

  • 参考网上部分配置参考,图片存储路径是文件名,设置org模式下截图快捷键
    (defun my-org-download-method (link)
      (let ((filename
             (format-time-string "screenshot_%Y%m%d_%H%M%S.png"))
            (dirname (file-name-sans-extension (buffer-name)) ))
        ;; if directory not exist, create it
        (unless (file-exists-p dirname)
          (make-directory dirname))
        ;; return the path to save the download files
        (expand-file-name filename dirname)))
    
    (setq org-download-method 'my-org-download-method)
    
    (add-hook 'org-mode-hook
              (lambda()
                (local-set-key (kbd "C-c p") 'org-download-screenshot)))
    

inline images

org提供了一个功能,可以显示图片,在org文档中,如果图片还是没有显示,只 是显示了链接,可以切换到显示 inline image,快捷键是 C-c C-x C-v 。

使用yasnippet定义图片显示格式宏

插入的图片,有时候需要指定一些显示效果,比如,靠左,靠右,定义像素值, 定义图片显示比例等。org模式下,有各种对图片的显示控制参数,如下

#+CAPTION: name
#+ATTR_HTML: :title tille1 :align centre
#+ATTR_HTML: :width 10% :height 20%

或者指定像素值

#+ATTR_ORG: :width  ~
#+ATTR_HTML:  :width  ~

这些值的指定,可以用yasnippet宏来实现,比如定一个picv的宏,在org模式中, 只要输入picv然后按tab键,就可以扩展成定义的格式,比较简便。

使用效果

上图中,第二个链接是通过指定陪孩子,不显示图片注释信息。第三个链接是加 入了图片的显示定义参数。