- 1 课程回顾
- 2 图片粘贴
- 3 给org文件本身生成一个目录
- 4 在org文件里插入各种链接
- 5 结语
1 课程回顾 🔗
我们通过上一节课,学习了如何通过Org mode来写博客,将自己的一些知识、技巧系统性的疏理,写下来,授人以渔,在授业解惑的过程中自己得到再提高,这其实是人生中很有意思的一件事。Emacs + Org mode 的存在能够让我们写博客的效率大大得以提升。
今天我们再学习一些通过Org mode写文档的一些小技巧。
2 图片粘贴 🔗
我们在使用类似Typora、Word等软件,处理图片的时候,往往很简单的拷贝(截图),然后按下 Cmd-v
粘贴就可以了,很简单粗暴。那我们在org文件里该如何粘贴图片呢?
我们尝试截一张图片在系统剪贴板,然后在Emacs里直接 Cmd-v
看看会发生啥?是的,什么都没有发生。
我们需要做一些改造,实现这个有好几种方法:
- org-download 插件
- 一个小函数
这里我介绍的是后者。
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
你也可以在 这里 查看最新的配置文件。