Org Mode 基本用法笔记

简介

Org Mode: Your Life in Plain Text.

Org 模式是 Emacs 的一种支持内容分级的编辑模式,是 Emacs 封神的宝器之一。它支持 TODO 列表、日志管理、记录笔记,甚至可以做工程计划。

基本操作

字体

粗体 斜体 删除线 下划线 下标: H2O 上标: E=mc2 等宽: git

链接 链接

在 Org Mode 中,可以方便使用双向链接进行文档的定位,常见的链接方法如下:

[[file:~/code/main.c::255]]
[[file:~/xx.org::My Target]]
[[file:~/xx.org::#my-custom-id]]
[[file:~/xx.org::/regexp/]]
[[attachment:main.c::255]]
255
跳转到对应链接的第 255 行
My Target
跳转到对应的 的位置。

示例:点击 <<My Target>> 会打开上面的 <<My Target>> 的位置。

*My Target
跳转到对应的标题位。

此方法跳转时无法正确选择到对应的 heading 位置,会强制新增一个。

#my-custom-id
跳转到对应的用户 ID 的属性位。

点击 #custom_id 跳转到这个位置

regexp
跳转到所有匹配到的正则表达式位置上。

点击 id 跳转到这个位置

Custom Id

Custom Id 测试列。

习惯管理

在 Org Mode 中,可以通过添加 STYLE 属性为 habit 来设置一个习惯,通过持续不断的重复习惯来改进自己的生活。

为了启用习惯的配置,需要先向 org-modules 中添加 habit

(setq org-modules '(org-habit)

添加的 habit 与一般的 预约任务 相比,只是多了一个 habit 的属性。

设置 『习惯』 时,可以通过配置 DEADLINE 来设定重复,可以通过重复任务来管理个人习惯,即增加 .+2d ,除了天外,还支持年-y,月-m,周-w,天-d 和小时-h ,这几种重复的方式,比如我想每 2 天重复的话,则增加 +2d ,如果是从当天开始重复,则使用 .+2d ,另外可以设定一个弹性的重复任务,比如最多 2 天,最少 4 天要执行一次,则使用 +2d/4d 天表示。

* Habits
DEADLINE: <2022-02-24 Thu 10:00 .+2d>
:PROPERTIES:
:STYLE:    habit
:END:

计划任务

Org Mode 中可以通过向标题添加 SCHEDULEDDEADLINE 两个标签来制定计划,如果是重复类计划,则可以通过向 SCHEDULED 中增加重复周期。

* Task
DEADLINE: <2022-02-24 Thu 22:00> SCHEDULED: <2022-02-24 Thu 10:00>

如果在某个时间段内的话,则可以写作 SCHEDULED: <2022-02-24 Thu 09:00-17:30 -2d> 表示具体的工作时间段。

上面的数据是指定具体的日期为结束,也可以指定延迟在任务表上显示,比如指定延迟 2 天,则是 SCHEDULED: <2022-02-24 Thu 10:00 -2d> ,同样的还在截止时间,截止时间也是同样的方式 DEADLINE: <2022-02-24 Thu 22:00 -5d> 表示截止前 5 天在日程上进行提醒。

如果不设置具体的提醒时间则按 org-deadline-warning-days 设置的时间进行提醒,从开始时间一直到截止时间,如果即安排了开始时间又安排了截止时间,则通过 org-agenda-skip-deadline-prewarning-if-scheduled t 来设置忽略截止时间,或者通过 org-agenda-skip-scheduled-delay-if-deadline t 来忽略开始时间。

当时间有重复和提醒安排时,需要注意 提醒时间在前 ,即 DEADLINE: <2022-02-24 Thu 22:00 +2d -5d> 表示每 2 天重复并提前 5 天进行提醒。

除了常见的这些之外 ,还有一些不规则时间戳,以 Emacs 日志风格的字符串表示,保存在方括号或者尖括号中。

  • 周期重复,从 6 月 1 日开始,每隔 10 天重复:%%(diary-cylic 10 6 1 2022)
  • 某些日期,组合不同的年月日,每年的 3-5 月的 10 日:%%(diary-date ‘(3 4 5) 10 t)
  • 某月的第几个星期几,用浮动日期格式表示: %%(diary-float month dayname index),month 表示月份的整数,t 表示所有月份,dayname 表示星期几,0 为星期日,index 为正数表示从前往后娄,负数表示从后往前,如 5 月最后一个星期三 :%%(diary-float 5 3 -1)

为了使用上面说到的方法,Org Mode 提供了两个相同功能的方法, org-anniversaryorg-date ,只是这两个方法仅支持 ISO 的计时方法(年,月,日)。

如果想设定为 每月 21 日如果是工作日,则在 21 日处理,如果是非工作日则在前一个工作日执行 则用下面的方法:

&%%(let ((dayname (calendar-day-of-week date))
         (day (cadr date)))
     (or (and (= day 21) (memq dayname '(1 2 3 4 5)))
         (and (memq day '(19 20)) (= dayname 5)))
     )

如果再有更复杂的重复就不建议在去写了,比较好的方法是进行拆分,在日期计算上花费时间不值得。

记录时间戳

对于 Org Mode 中使用时间戳,主要是为了记录时间,如果只是使用 yyyy-mm-dd 格式保存时间,就无法利用时间进行排序,使用时间戳可以直接依据时间进行排序。

目前 Org Mode 中的时间戳主要有两种形式:

C-c . (org-time-stamp)
可以向文档中插入一个「激活」的时间戳,这种时间戳会在 Agenda 中显示,如果是位于现有的时间戳位置上,则会更新时间戳的时间;如果该命令连续执行两次,则会插入一个时间范围。

在插入时,如果输入了具体的时候,保存的时间戳就是附带具体时间的,如果直接插入则仅插入日期。

可以在时间戳上可以利用 S-upS-down 进行上下调整时间,目前默认的是以「5 分钟」进行调整,可以通过设置 org-time-stamp-rounding-minutes 来修改。

使用 C-u 做前缀时,如果不增加时间输入会插入带有当前时间的时间戳。

C-c ! (org-time-stamp-inactive)
org-time-stamp 类似,插入具体的时间,但是插入的时间戳是用 [] 进行保存,是 inactive 的时间戳,也就是不会出现在 Agenda 中。

图片展示

Org Mode 在文件中展示图片时,通过 [[]] 的方式进行引用。

例如: [[../images/internalization.png]] ,在使用过程中,发现如果图片分辨率比较高的话,会非常占地方,需要按比例缩小。

使用 #+attr_org: :width 50% :hight 50% 进行调整,需要先配置参数 (setq org-image-actual-width nil) ,然后在利用 attr* 的配置来控制图片的大小。

#+attr_html: :width 60% :hight 60%
#+attr_org: :width 40% :hight 40%
[[../images/internalization.png]]

中文方案排版指北

『统一中文文案、排版的相关用法,降低团队成员之间的沟通成本,增强网站气质。』

空格

「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。与大家共勉之。」—— vinta/paranoid-auto-spacing

中英文之间需要增加空格

正确:

在 LeanCloud 上,数据存储是围绕 AVObject 进行的。

错误:

在 LeanCloud 上,数据存储是围绕=AVObject=进行的。

在 LeanCloud 上,数据存储是围绕=AVObject= 进行的。

完整的正确用法:

在 LeanCloud 上,数据存储是围绕 AVObject 进行的。每个 AVObject 都包含了与 JSON 兼容的 key-value 对应的数据。数据是 schema-free 的,你不需要在每个 AVObject 上提前指定存在哪些键,只要直接设定对应的 key-value 即可。

例外:「豆瓣 FM」等产品名词,按照官方所定义的格式书写。

中文与数字之间需要增加空格

正确:

今天出去买菜花了 5000 元。

错误:

今天出去买菜花了 5000 元。

今天出去买菜花了 5000 元。

数字与单位之间需要增加空格

正确:

我家的光纤入屋宽带有 10 Gbps,SSD 一共有 20 TB

错误:

我家的光纤入屋宽带有 10Gbps,SSD 一共有 20TB

例外:度 / 百分比与数字之间不需要增加空格:

正确:

今天是 233° 的高温。

新 MacBook Pro 有 15% 的 CPU 性能提升。

错误:

今天是 233 ° 的高温。

新 MacBook Pro 有 15 % 的 CPU 性能提升。

全角标点与其他字符之间不加空格

正确:

刚刚买了一部 iPhone,好开心!

错误:

刚刚买了一部 iPhone ,好开心!

刚刚买了一部 iPhone, 好开心!

  • text-spacing 来挽救?

    CSS Text Module Level 4 的 text-spacing 和 Microsoft 的 -ms-text-autospace 可以实现自动为中英文之间增加空白。不过目前并未普及,另外在其他应用场景,例如 macOS、iOS、Windows 等用户界面目前并不存在这个特性,所以请继续保持随手加空格的习惯。

标点符号

不重复使用标点符号

正确:

德国队竟然战胜了巴西队!

她竟然对你说「喵」?!

错误:

德国队竟然战胜了巴西队!!

德国队竟然战胜了巴西队!!!!!!!!

她竟然对你说「喵」??!!

她竟然对你说「喵」?!?!??!!

名词

专有名词使用正确的大小写

大小写相关用法原属于英文书写范畴,不属于本 wiki 讨论内容,在这里只对部分易错用法进行简述。

正确:

使用 GitHub 登录

我们的客户有 GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。

错误:

使用 github 登录

使用 GITHUB 登录

使用 Github 登录

使用 gitHub 登录

我们的客户有 github、foursquare、microsoft corporation、google、facebook, inc.。

我们的客户有 GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。

我们的客户有 Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。

我们的客户有 gitHub、fourSquare、microSoft Corporation、google、faceBook, Inc.。

注意:当网页中需要配合整体视觉风格而出现全部大写/小写的情形,HTML 中请使用标淮的大小写规范进行书写;并通过 text-transform: uppercase; / text-transform: lowercase; 对表现形式进行定义。

不要使用不地道的缩写

正确:

我们需要一位熟悉 TypeScript、HTML5,至少理解一种框架(如 React、Next.js)的前端开发者。

错误:

我们需要一位熟悉 Ts、h5,至少理解一种框架(如 RJS、nextjs)的 FED。

全角和半角

不明白什么是全角(全形)与半角(半形)符号?请查看维基百科条目『 全角和半角 』。

使用全角中文标点

正确:

嗨!你知道嘛?今天前台的小妹跟我说「喵」了哎!

核磁共振成像(NMRI)是什么原理都不知道?JFGI!

错误:

嗨! 你知道嘛? 今天前台的小妹跟我说 “喵” 了哎!

嗨!你知道嘛?今天前台的小妹跟我说"喵"了哎!

核磁共振成像 (NMRI) 是什么原理都不知道? JFGI!

核磁共振成像(NMRI)是什么原理都不知道?JFGI!

数字使用半角字符

正确:

这个蛋糕只卖 1000 元。

错误:

这个蛋糕只卖 1000 元。

例外:在设计稿、宣传海报中如出现极少量数字的情形时,为方便文字对齐,是可以使用全角数字的。

遇到完整的英文整句、特殊名词,其内容使用半角标点

正确:

乔布斯那句话是怎么说的?「Stay hungry, stay foolish.」

推荐你阅读《Hackers & Painters: Big Ideas from the Computer Age》,非常的有趣。

错误:

乔布斯那句话是怎么说的?「Stay hungry,stay foolish。」

推荐你阅读《Hackers&Painters:Big Ideas from the Computer Age》,非常的有趣。

争议

以下用法略带有个人色彩,即:无论是否遵循下述规则,从语法的角度来讲都是 正确 的。

链接之间增加空格

用法:

提交一个 issue 并分配给相关同事。

访问我们网站的最新动态,请 点击这里 进行订阅!

对比用法:

提交一个 issue 并分配给相关同事。

访问我们网站的最新动态,请 点击这里 进行订阅!

简体中文使用直角引号

用法:

「老师,『有条不紊』的『紊』是什么意思?」

对比用法:

“老师,‘有条不紊’的‘紊’是什么意思?”

工具

仓库 工具插件
hotoo/pangu.vim Vim
VS Code - huacnlee.auto-correct VS Code
pangu-spacing.el Emacs

Org Mode 特例

在 Org Mode 中,有一些特殊的地方,也做一些约定。

  1. 代码中的参数、变量、方法名、类名等信息,统一使用等宽字体表示,比如 org-id-update-id-locations 或者 org-id-files 等。
  2. 除非是整段的重点强调,其余情况不使用斜体和粗体进行表示,可以使用引号进行强调。
  3. 专业名词解释时,可以使用 - :: 的组合形式,不要行内加粗中文的内容。

上面的表达方式主要是个人的一些用法,如果有更好的方式可能会修改。另外代码内容比较长时,建议统一使用 <src 的快捷形式创建代码段,尽量少使用行内代码。

参考文献

统计任务的时间

最近重新整理了自己的计划方案,利用 Org Roam Dailies 方案替换掉原本的 Org Capture 的方案,在生成每天的笔记作为计划文件,规划自己的时间,在统计每周工作的时候,因为使用的是「Agenda Directory」的归档自己的计划,所以使用默认的方案,会有许多统计时间为 0:00 的文件显示在目录中,查看了 Org Mode 中关于 clocktable 的说明之后,发现可以通过添加两个参数跳过统计时间为 0 的对象。

:stepskip0
设置为 t 时,跳过时间为 0 的步骤
:fileskip0
设置为 t 时,不再显示对时间统计表贡献的文件

通过上面的例子可以看到,增加了 :fileskip0 t 后,那些「Time」为「0:00」内容就不再显示了。每周的任务也就干净多了。

制订任务计划

  • org-set-effort(C-c C-x C-c) 设置预期的时间
  • org-clock-modify-effort-estimate(C-c C-x C-e) 更新真正的时间
  • org-columns(C-c C-x C-c) 执行查看具体的任务情况

通过配置 PROPERTY 和 COLUMNS 参数来控制列表中的内容。

#+PROPERTY: Effort_ALL 0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00
#+COLUMNS: %40ITEM(Task) %17Effort(Estimated Effort){:} %CLOCKSUM

表格操作

Org Mode 中使用表格最方便的地方就是可以直接对表格进行计算, C-c ' 进入编辑模式。

编辑模式中,@表示行,$表示列,如果数起来比较麻烦,可以使用 C-c } 进行查看。

@2$1..@4$3 表示第 2 行第 1 列到第 4 行第 3 列的内容。 $1..$3 表示第 1 列到第 3 列。 @# 表示当前行, $# 表示当前列 #+CONSTANTS: pi=3.14 eps=2.4e-6 来定义常量,利用表格名称和位置还可以选择从其它表格中获取数据。

示例如下:

name 1 2 3 count
aa 2 3 4 5
name count
aa 5