- 1 课程回顾
- 2 Org mode基本配置
- 3 Org mode 美化
- 4 org-appear自动展开强调链接
- 5 结语
1 课程回顾 🔗
在上一节课中,我们给Emacs设置了补全体系,通过 vertico+orderless+corfu 的体系,让Emacs的效率大大得到提升,我们还学习了如何通过 yasnippet 来设置模板补全,极大的方便了我们在Org文件里对代码块的输入。
既然Org mode已经成为我们管理模块化配置文件的重要手段,那我们来对Org mode做一些基本的配置,以及美化吧。
2 Org mode基本配置 🔗
我们通过下面的配置,对Org mode基本配置进行修改,比如,我们修改了Emacs文档标题以及每级标题行的文字大小;我们让Org mode里的一些特定字符串显示成好看的unicode字符;我们修改一些在Org文档中打开各种不同链接时的行为;我们修改了默认的TODO关键词;我们修改了默认的标题行标签等等。通过这些设置,我们能让Org mode更加好看好用一些。
(use-package org
:ensure nil
:mode ("\\.org\\'" . org-mode)
:hook ((org-mode . visual-line-mode)
(org-mode . my/org-prettify-symbols))
:commands (org-find-exact-headline-in-buffer org-set-tags)
:custom-face
;; 设置Org mode标题以及每级标题行的大小
(org-document-title ((t (:height 1.75 :weight bold))))
(org-level-1 ((t (:height 1.2 :weight bold))))
(org-level-2 ((t (:height 1.15 :weight bold))))
(org-level-3 ((t (:height 1.1 :weight bold))))
(org-level-4 ((t (:height 1.05 :weight bold))))
(org-level-5 ((t (:height 1.0 :weight bold))))
(org-level-6 ((t (:height 1.0 :weight bold))))
(org-level-7 ((t (:height 1.0 :weight bold))))
(org-level-8 ((t (:height 1.0 :weight bold))))
(org-level-9 ((t (:height 1.0 :weight bold))))
;; 设置代码块用上下边线包裹
(org-block-begin-line ((t (:underline t :background unspecified))))
(org-block-end-line ((t (:overline t :underline nil :background unspecified))))
:config
;; ================================
;; 在org mode里美化字符串
;; ================================
(defun my/org-prettify-symbols ()
(setq prettify-symbols-alist
(mapcan (lambda (x) (list x (cons (upcase (car x)) (cdr x))))
'(
;; ("[ ]" . 9744) ; ☐
;; ("[X]" . 9745) ; ☑
;; ("[-]" . 8863) ; ⊟
("#+begin_src" . 9998) ; ✎
("#+end_src" . 9633) ; □
("#+begin_example" . 129083) ; 🠻
("#+end_example" . 129081) ; 🠹
("#+results:" . 9776) ; ☰
("#+attr_latex:" . "🄛")
("#+attr_html:" . "🄗")
("#+attr_org:" . "🄞")
("#+name:" . "🄝") ; 127261
("#+caption:" . "🄒") ; 127250
("#+date:" . "📅") ; 128197
("#+author:" . "💁") ; 128100
("#+setupfile:" . 128221) ; 📝
("#+email:" . 128231) ; 📧
("#+startup:" . 10034) ; ✲
("#+options:" . 9965) ; ⛭
("#+title:" . 10162) ; ➲
("#+subtitle:" . 11146) ; ⮊
("#+downloaded:" . 8650) ; ⇊
("#+language:" . 128441) ; 🖹
("#+begin_quote" . 187) ; »
("#+end_quote" . 171) ; «
("#+begin_results" . 8943) ; ⋯
("#+end_results" . 8943) ; ⋯
)))
(setq prettify-symbols-unprettify-at-point t)
(prettify-symbols-mode 1))
;; 提升latex预览的图片清晰度
(plist-put org-format-latex-options :scale 1.8)
;; 设置标题行之间总是有空格;列表之间根据情况自动加空格
(setq org-blank-before-new-entry '((heading . t)
(plain-list-item . auto)
))
;; ======================================
;; 设置打开Org links的程序
;; ======================================
(defun my-func/open-and-play-gif-image (file &optional link)
"Open and play GIF image `FILE' in Emacs buffer.
Optional for Org-mode file: `LINK'."
(let ((gif-image (create-image file))
(tmp-buf (get-buffer-create "*Org-mode GIF image animation*")))
(switch-to-buffer tmp-buf)
(erase-buffer)
(insert-image gif-image)
(image-animate gif-image nil t)
(local-set-key (kbd "q") 'bury-buffer)
))
(setq org-file-apps '(("\\.png\\'" . default)
(auto-mode . emacs)
(directory . emacs)
("\\.mm\\'" . default)
("\\.x?html?\\'" . default)
("\\.pdf\\'" . emacs)
("\\.md\\'" . emacs)
("\\.gif\\'" . my-func/open-and-play-gif-image)
("\\.xlsx\\'" . default)
("\\.svg\\'" . default)
("\\.pptx\\'" . default)
("\\.docx\\'" . default)))
:custom
;; 设置Org mode的目录
(org-directory "~/org")
;; 设置笔记的默认存储位置
(org-default-notes-file (expand-file-name "capture.org" org-directory))
;; 启用一些子模块
(org-modules '(ol-bibtex ol-gnus ol-info ol-eww org-habit org-protocol))
;; 在按M-RET时,是否根据光标所在的位置分行,这里设置为是
;; (org-M-RET-may-split-line '((default . nil)))
;; 一些Org mode自带的美化设置
;; 标题行美化
(org-fontify-whole-heading-line t)
;; 设置标题行折叠符号
(org-ellipsis " ▾")
;; 在活动区域内的所有标题栏执行某些命令
(org-loop-over-headlines-in-active-region t)
;; TODO标签美化
(org-fontify-todo-headline t)
;; DONE标签美化
(org-fontify-done-headline t)
;; 引用块美化
(org-fontify-quote-and-verse-blocks t)
;; 隐藏宏标记
(org-hide-macro-markers t)
;; 隐藏强调标签
(org-hide-emphasis-markers t)
;; 高亮latex语法
(org-highlight-latex-and-related '(native script entities))
;; 以UTF-8显示
(org-pretty-entities t)
;; 是否隐藏标题栏的前置星号,这里我们通过org-modern来隐藏
;; (org-hide-leading-stars t)
;; 当启用缩进模式时自动隐藏前置星号
(org-indent-mode-turns-on-hiding-stars t)
;; 自动启用缩进
(org-startup-indented nil)
;; 根据标题栏自动缩进文本
(org-adapt-indentation nil)
;; 自动显示图片
(org-startup-with-inline-images t)
;; 默认以Overview的模式展示标题行
(org-startup-folded 'overview)
;; 允许字母列表
(org-list-allow-alphabetical t)
;; 列表的下一级设置
(org-list-demote-modify-bullet '(
("-" . "+")
("+" . "1.")
("1." . "a.")
))
;; 编辑时检查是否在折叠的不可见区域
(org-fold-catch-invisible-edits 'smart)
;; 在当前位置插入新标题行还是在当前标题行后插入,这里设置为当前位置
(org-insert-heading-respect-content nil)
;; 设置图片的最大宽度,如果有imagemagick支持将会改变图片实际宽度
;; 四种设置方法:(1080), 1080, t, nil
(org-image-actual-width nil)
;; imenu的最大深度,默认为2
(org-imenu-depth 4)
;; 回车要不要触发链接,这里设置不触发
(org-return-follows-link nil)
;; 上标^下标_是否需要特殊字符包裹,这里设置需要用大括号包裹
(org-use-sub-superscripts '{})
;; 复制粘贴标题行的时候删除id
(org-clone-delete-id t)
;; 粘贴时调整标题行的级别
(org-yank-adjusted-subtrees t)
;; TOOD的关键词设置,可以设置不同的组
(org-todo-keywords '((sequence "TODO(t)" "HOLD(h!)" "WIP(i!)" "WAIT(w!)" "|" "DONE(d!)" "CANCELLED(c@/!)")
(sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f!)")))
;; TODO关键词的样式设置
(org-todo-keyword-faces '(("TODO" :foreground "#7c7c75" :weight bold)
("HOLD" :foreground "#feb24c" :weight bold)
("WIP" :foreground "#0098dd" :weight bold)
("WAIT" :foreground "#9f7efe" :weight bold)
("DONE" :foreground "#50a14f" :weight bold)
("CANCELLED" :foreground "#ff6480" :weight bold)
("REPORT" :foreground "magenta" :weight bold)
("BUG" :foreground "red" :weight bold)
("KNOWNCAUSE" :foreground "yellow" :weight bold)
("FIXED" :foreground "green" :weight bold)))
;; 当标题行状态变化时标签同步发生的变化
;; Moving a task to CANCELLED adds a CANCELLED tag
;; Moving a task to WAIT adds a WAIT tag
;; Moving a task to HOLD adds WAIT and HOLD tags
;; Moving a task to a done state removes WAIT and HOLD tags
;; Moving a task to TODO removes WAIT, CANCELLED, and HOLD tags
;; Moving a task to DONE removes WAIT, CANCELLED, and HOLD tags
(org-todo-state-tags-triggers
(quote (("CANCELLED" ("CANCELLED" . t))
("WAIT" ("WAIT" . t))
("HOLD" ("WAIT") ("HOLD" . t))
(done ("WAIT") ("HOLD"))
("TODO" ("WAIT") ("CANCELLED") ("HOLD"))
("DONE" ("WAIT") ("CANCELLED") ("HOLD")))))
;; 使用专家模式选择标题栏状态
(org-use-fast-todo-selection 'expert)
;; 父子标题栏状态有依赖
(org-enforce-todo-dependencies t)
;; 标题栏和任务复选框有依赖
(org-enforce-todo-checkbox-dependencies t)
;; 优先级样式设置
(org-priority-faces '((?A :foreground "red")
(?B :foreground "orange")
(?C :foreground "yellow")))
;; 标题行全局属性设置
(org-global-properties '(("EFFORT_ALL" . "0:15 0:30 0:45 1:00 2:00 3:00 4:00 5:00 6:00 7:00 8:00")
("APPT_WARNTIME_ALL" . "0 5 10 15 20 25 30 45 60")
("RISK_ALL" . "Low Medium High")
("STYLE_ALL" . "habit")))
;; Org columns的默认格式
(org-columns-default-format "%25ITEM %TODO %SCHEDULED %DEADLINE %3PRIORITY %TAGS %CLOCKSUM %EFFORT{:}")
;; 当状态从DONE改成其他状态时,移除 CLOSED: [timestamp]
(org-closed-keep-when-no-todo t)
;; DONE时加上时间戳
(org-log-done 'time)
;; 重复执行时加上时间戳
(org-log-repeat 'time)
;; Deadline修改时加上一条记录
(org-log-redeadline 'note)
;; Schedule修改时加上一条记录
(org-log-reschedule 'note)
;; 以抽屉的方式记录
(org-log-into-drawer t)
;; 紧接着标题行或者计划/截止时间戳后加上记录抽屉
(org-log-state-notes-insert-after-drawers nil)
;; refile使用缓存
(org-refile-use-cache t)
;; refile的目的地,这里设置的是agenda文件的所有标题
(org-refile-targets '((org-agenda-files . (:maxlevel . 9))))
;; 将文件名加入到路径
(org-refile-use-outline-path 'file)
;; 是否按步骤refile
(org-outline-path-complete-in-steps nil)
;; 允许创建新的标题行,但需要确认
(org-refile-allow-creating-parent-nodes 'confirm)
;; 设置标签的默认位置,默认是第77列右对齐
;; (org-tags-column -77)
;; 自动对齐标签
(org-auto-align-tags t)
;; 标签不继承
(org-use-tag-inheritance nil)
;; 在日程视图的标签不继承
(org-agenda-use-tag-inheritance nil)
;; 标签快速选择
(org-use-fast-tag-selection t)
;; 标签选择不需要回车确认
(org-fast-tag-selection-single-key t)
;; 定义了有序属性的标题行也加上 OREDERD 标签
(org-track-ordered-property-with-tag t)
;; 始终存在的的标签
(org-tag-persistent-alist '(("read" . ?r)
("mail" . ?m)
("emacs" . ?e)
("study" . ?s)
("work" . ?w)))
;; 预定义好的标签
(org-tag-alist '((:startgroup)
("crypt" . ?c)
("linux" . ?l)
("apple" . ?a)
("noexport" . ?n)
("ignore" . ?i)
("TOC" . ?t)
(:endgroup)))
;; 归档设置
(org-archive-location "%s_archive::datetree/")
)
;; Org mode的附加包,有诸多附加功能
(use-package org-contrib
:ensure t)
配置完上面的部分,我们重启一下Emacs,可以看到,Org文件的标题和标题行的字号都变大了:
3 Org mode 美化 🔗
下面,我们通过 org-modern 插件对Org mode进行进一步的美化。
(use-package org-modern
:ensure t
:hook (after-init . (lambda ()
(setq org-modern-hide-stars 'leading)
(global-org-modern-mode t)))
:config
;; 标题行型号字符
(setq org-modern-star ["◉" "○" "✸" "✳" "◈" "◇" "✿" "❀" "✜"])
;; 额外的行间距,0.1表示10%,1表示1px
(setq-default line-spacing 0.1)
;; tag边框宽度,还可以设置为 `auto' 即自动计算
(setq org-modern-label-border 1)
;; 设置表格竖线宽度,默认为3
(setq org-modern-table-vertical 2)
;; 设置表格横线为0,默认为0.1
(setq org-modern-table-horizontal 0)
;; 复选框美化
(setq org-modern-checkbox
'((?X . #("▢✓" 0 2 (composition ((2)))))
(?- . #("▢–" 0 2 (composition ((2)))))
(?\s . #("▢" 0 1 (composition ((1)))))))
;; 列表符号美化
(setq org-modern-list
'((?- . "•")
(?+ . "◦")
(?* . "▹")))
;; 代码块左边加上一条竖边线(需要Org mode顶头,如果启用了 `visual-fill-column-mode' 会很难看)
(setq org-modern-block-fringe t)
;; 代码块类型美化,我们使用了 `prettify-symbols-mode'
(setq org-modern-block-name nil)
;; #+关键字美化,我们使用了 `prettify-symbols-mode'
(setq org-modern-keyword nil)
)
在我们安装配置了 org-modern
插件后,我们的Org mode变得更加漂亮啦:
4 org-appear自动展开强调链接 🔗
通过 org-appear 插件,当我们的光标移动到Org mode里的强调、链接上时,会自动展开,这样方便进行编辑。
(use-package org-appear
:ensure t
:hook (org-mode . org-appear-mode)
:config
(setq org-appear-autolinks t)
(setq org-appear-autosubmarkers t)
(setq org-appear-autoentities t)
(setq org-appear-autokeywords t)
(setq org-appear-inside-latex t)
)
安装完这个插件后,我们的光标移动到链接上时,会自动展开,这样我们就非常方便的可以对链接的具体内容进行编辑了:
5 结语 🔗
经过今天的课程学习,我们对最常用到的Org mode做了一次美化,把Org mode改造得更加美观,我们在使用Org mode来写文档时,心情也会不自觉的无比喜悦!
经过今天的学习,我们最新的配置文件长下面这样:最新的配置文件 ,这一课后的配置镜像:emacs-config-l8.org
恭喜你,又往前进了一大步!