面向产品经理的Emacs教程:18. Org mode写文档的一些小技巧

· 1616字 · 4分钟

1 课程回顾 🔗

我们通过上一节课,学习了如何通过Org mode来写博客,将自己的一些知识、技巧系统性的疏理,写下来,授人以渔,在授业解惑的过程中自己得到再提高,这其实是人生中很有意思的一件事。Emacs + Org mode 的存在能够让我们写博客的效率大大得以提升。

今天我们再学习一些通过Org mode写文档的一些小技巧。

2 图片粘贴 🔗

我们在使用类似Typora、Word等软件,处理图片的时候,往往很简单的拷贝(截图),然后按下 Cmd-v 粘贴就可以了,很简单粗暴。那我们在org文件里该如何粘贴图片呢?

我们尝试截一张图片在系统剪贴板,然后在Emacs里直接 Cmd-v 看看会发生啥?是的,什么都没有发生。

我们需要做一些改造,实现这个有好几种方法:

这里我介绍的是后者。

2.1 前置条件 🔗

我们需要通过一个命令行工具 pngpaste 来实现粘贴。

Linux 用户可以通过另外一个命令行工具 xclip 来达到一样的效果。

我们先来安装 pngpaste

brew install pngpaste

2.2 配置粘贴函数 🔗

核心思想是通过 pngpaste 这个命令行工具,将系统剪贴板里的图片,输出到当前文件同名的 assets 文件夹下,然后自动在当前org文件的光标处插入图片链接,并设置图片链接的宽度属性。这个函数也是一个很好的例子,后续我们可以通过 shell-command 这个函数,写一些shell脚本并和Emacs结合起来使用,大大加强了Emacs的可玩性。

为了不影响系统 Cmd-v 的粘贴功能,我把这个函数绑定了另外一个快捷键 Cmd-Shift-v ,你可以根据自己的需要来绑定合适的快捷键。

(use-package emacs
  :ensure nil
  :after org
  :bind (:map org-mode-map
              ("s-V" . my/org-insert-clipboard-image))
  :config
  (defun my/org-insert-clipboard-image (width)
    "create a time stamped unique-named file from the clipboard in the sub-directory
 (%filename.assets) as the org-buffer and insert a link to this file."
    (interactive (list
                  (read-string (format "Input image width, default is 800: ")
                               nil nil "800")))
    ;; 设置图片存放的文件夹位置为 `当前Org文件同名.assets'
    (setq foldername (concat (file-name-base (buffer-file-name)) ".assets/"))
    (if (not (file-exists-p foldername))
        (mkdir foldername))
    ;; 设置图片的文件名,格式为 `img_年月日_时分秒.png'
    (setq imgName (concat "img_" (format-time-string "%Y%m%d_%H%M%S") ".png"))
    ;; 图片文件的相对路径
    (setq relativeFilename (concat (file-name-base (buffer-name)) ".assets/" imgName))
    ;; 根据不同的操作系统设置不同的命令行工具
    (cond ((string-equal system-type "gnu/linux")
           (shell-command (concat "xclip -selection clipboard -t image/png -o > " relativeFilename)))
          ((string-equal system-type "darwin")
           (shell-command (concat "pngpaste " relativeFilename))))
    ;; 给粘贴好的图片链接加上宽度属性,方便导出
    (insert (concat "\n#+DOWNLOADED: screenshot @ "
                    (format-time-string "%Y-%m-%d %a %H:%M:%S" (current-time))
                    "\n#+CAPTION: \n#+ATTR_ORG: :width "
                    width
                    "\n#+ATTR_LATEX: :width "
                    (if (>= (/ (string-to-number width) 800.0) 1.0)
                        "1.0"
                      (number-to-string (/ (string-to-number width) 800.0)))
                    "\\linewidth :float nil\n"
                    "#+ATTR_HTML: :width "
                    width
                    "\n[[file:" relativeFilename "]]\n"))
    ;; 重新显示一下图片
    (org-redisplay-inline-images)
    )
  )

配置完后,我们直接截图,或者拷贝某张图片,按下 s-V (即 Cmd-Shift-v ),输入一个宽度(默认宽度为800,直接按回车就是默认宽度),然后整个粘贴工作就完成了,与在 Typora 和 Word 里的效果,几乎相同,非常方便:

3 给org文件本身生成一个目录 🔗

我们在导出org文件时,可以通过 #+OPTIONS: toc:t 来控制是否导出目录,那么我们能给org文件本身也自动生成目录吗?

答案当然是可以,在Emacs里几乎没有什么是不可以的,如果有,那就是自己还不够强🤭

我们通过 toc-org 这个插件,来完成这件事,先来安装一下:

(use-package toc-org
  :ensure t
  :hook (org-mode . toc-org-mode))

安装完后,我们只需要新增一个目录的标题行,并给这个标题行设置一个标签 toc 即可:

如果你不期望这个Org文件里生成的目录导出,那可以给这个目录再设置一个标签 noexport 即可,这样就不会生成两份目录了:

4 在org文件里插入各种链接 🔗

我们在org文件里通过 C-c C-l 来插入链接,默认支持的链接类型如下:

我们可以增加一些链接类型,更方便我们添加链接:

(use-package ol
  :ensure nil
  :defer t
  :custom
  (org-link-keep-stored-after-insertion t)
  (org-link-abbrev-alist '(("github"        . "https://github.com/")
                           ("gitlab"        . "https://gitlab.com/")
                           ("google"        . "https://google.com/search?q=")
                           ("baidu"         . "https://baidu.com/s?wd=")
                           ("rfc"           . "https://tools.ietf.org/html/")
                           ("wiki"          . "https://en.wikipedia.org/wiki/")
                           ("youtube"       . "https://youtube.com/watch?v=")
                           ("zhihu"         . "https://zhihu.com/question/"))))

配置完后,直接按下 C-c C-l 选择 google 链接类型,然后输入关键词 Org mode ,它会自动生成一个链接,打开这个链接可以直接进入以 Org mode 为关键词的google搜索页面,非常方便:

5 结语 🔗

经过今天的学习,我们掌握了在Org mode里写文档的一些小技巧,这些小技巧也只是我个人常用的一些技巧,比起社区的大神来说,简直不足为道。我们抱着持续学习的精神,慢慢积累,厚积薄发,我们就会发现原来一点点小技巧的持续积累,会给你的工作和生活带来质的变化!恭喜你,又往前进了一步!

这节课的配置文件的快照见:emacs-config-l18.org

你也可以在 这里 查看最新的配置文件。