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 中可以通过向标题添加 SCHEDULED 和 DEADLINE 两个标签来制定计划,如果是重复类计划,则可以通过向 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-anniversary
和 org-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-up
和S-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 中,有一些特殊的地方,也做一些约定。
- 代码中的参数、变量、方法名、类名等信息,统一使用等宽字体表示,比如
org-id-update-id-locations
或者org-id-files
等。 - 除非是整段的重点强调,其余情况不使用斜体和粗体进行表示,可以使用引号进行强调。
- 专业名词解释时,可以使用
- ::
的组合形式,不要行内加粗中文的内容。
上面的表达方式主要是个人的一些用法,如果有更好的方式可能会修改。另外代码内容比较长时,建议统一使用 <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 |