当前位置:   article > 正文

Emacs org-mode整理

emacs org

基础

Org-mode的实践场景有笔记管理,任务计划,项目管理等必需的诸项日常工作,此处也是促使我工作中使用Emacs的一个重要原因。

使用该功能有段时间没使用了, 整理一下以前写的文章, 准备再开启漫漫的学习编程的历程.

用大纲组织文档结构

org使用*号来列提纲的标题。
实例:

  • org-mode
    ** 大纲
    介绍
    ** 语法
  • 文档导出

段落

   1. 段落通过至少一个空行来实现区分划分;
   2. 如果是在一个段落里面分行,后面增加\\,有种续段的意思;
   3. VERSE是一个诗歌模式,提供类似文本的所见即所得的效果;
   4. QUOTE用于引用标识,在实际导出的网页格式中没有观察到实际的效果;
  5. CENTER可以让一段信息居中,如果是分行续段的,几行内容会一起居中;
   6. 结构的使用分别用#+BEGIN_xxx #+END_xx来框定。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

语法

使用* 号标记,位于行首,之后跟一个空格再输入标题。与md的#类似。
最多支持10及的标题。

展开及收缩

快捷键描述
S-Tab所有标题展开
Tab光标所在标题展开

标题跳转

快捷键描述
C-c C-n/p下/上标题
C-c C-f/b下/上标题 仅同一标题
C-c C-u跳到上一级标题
C-c C-j跳转到

插入及编辑

快捷键说明
M-Ret插入同级标题
M-S-Ret插入同一级的ToDo标题(ToDo会在下篇介绍)
M-Left/Right将当前标题升/降级
M-S-Left/Right将当前标题及子树升/降级
M-S-Up/Down将当前标题及子树上/下移
C-c *将本行设置为标题/正文
C-c C-w将子树及区域移动至另一标题处(通常我直接用文本剪切)
C-x n s/w只显示当前标题及子树/返回(有用,编辑时可专注于当前标题),org narrow
C-c C-x b在新缓冲区显示当前标题及子树/返回(同 C-c n s)
C-c /只显示搜索结果的大纲并高亮(检索时用)
C-c C-c取消高亮
注:更多的快捷键使用C-c C-x C-h查询

显示方式

使用M-x org-indent-mode 切换带缩进的显示方式。
如果想在打开时进入该模式,在文档头部增加
#+STARTUP:indent
如果希望所有org文件都以此种方式打开,在.emacs中增加

(setq org-startup-indented t)

个人感觉缩进很好,树形的展示很容易看出整个结构,但在编辑时与文本的查看习惯不太一致,故我基本不用。

超链接

符合超链接的规则的内容,自动视为超链接
例如:

https://www.baidu.com/ baidu
file:home

链接类型

Possible completions are:
bbdb: 	bibtex: 	docview: 	doi: 	elisp: 	file+emacs:
file+sys: 	file: 	ftp: 	gnus: 	http: 	https:
info: 	irc: 	mailto: 	message: 	mhe: 	news:
rmail: 	shell:
  • 1
  • 2
  • 3
  • 4
  • 5

对于文件链接,可以在后面增加::定位到行数或搜索选项

file:home/tmp/hello.txt::12
file:home/tmp/hello.txt::My Target 找到目标<>

可以自定链接

[[link][description]]
[link]
  • 1
  • 2

编辑链接

快捷键说明
C-c C-l编辑链接(此处为小写L)
C-c C-o打开链接(相当有用)

内部链接
定义锚点#<>

[[myanchor][内部链接]]

注: 常用功能,内部跳转

脚注
添加脚注链接

[[fn:footprint1][脚注]]

定义脚注

  • fn:footprint1
    注:必须以标题形式定义,我几乎未用过,请用过的朋友指点。

显示图片

使用如下标签插入图片,使用 C-c C-x C-v inline 方式显示图片,或者使用C-c C-o打开链接。

[[file:a.png]]

字体

符号描述
*粗体*粗体
/斜体/
+删除线+
_下划线_

表格

强大的表格处理操作,目前唯一缺点是对中文支持有问题,无法对齐,我暂时尚未找到方案解决,有好方法的兄弟请留言介绍一下。

快捷键描述
C-c |创建表格
C-c C-c重新调整表格缩进
Tab移动至下一个区域,必要时(行尾)创建一行
S-Tab移动至上一个区域
S-Ret移动至下一行,必要时(行尾)创建一行
M-Left/Right移动列
M-Up/Down移动行
M-S-Left/Right删除/插入列
M-S-Up/Down删除/插入行
C-c -插入水平分割线
C-c Ret插入水平分割线并跳到下一行
C-c ^根据当前列排序

段落

对于单个回车的文本,org认为是在同一个段落,导出时会转化成不同行的同一段落。如果要起新的段落,请敲空白行。

列表

分类: 有序列表,无序列表,描述列表

无序列表,以 - + * 开头
有序列表, 以1.或1)开头
描述列表, 以::将描述隔开

快捷键描述
Tab折叠列表项
M-Ret插入项
M-S-Ret插入带复选框的项
M-S-Up/Down移动列表项
M-Left/Right升/降级列表项 不包括子项
M-S-Left/Right升/降级列表项 包括子项
C-c C-c改变复选框状态
C-c -更换列表标记
Shift更换列表标记

大纲管理文档的进阶

标签定义

对于信息的管理,有分类和标签两种方式。

分类: 形式固定,很少变化
            树状结构,结构清晰
            过于简单,不能表达复杂信息
标签: 随时增加,查找方便
           多维度
  • 1
  • 2
  • 3
  • 4
  • 5

标签的特点:org的标签自动按照大纲树继承,即子标题自动继承父标题的标签。使用:tag:表示,例如

* meeting  :work:
** title :boss:
*** TODO prepare list :action:
  • 1
  • 2
  • 3

如果希望文件内所有文档都具有某些标签,在开头定义元数据:

#+FILETAGS:Secret:

快捷键描述
C-c C-q创建标签
C-c C-c在标题上使用,创建标签

预定义标签

在文件开头使用元数据标记,例如:

#+TAGS: Host(h) VM(v)
#+TAGS: meeting(m) work home

提醒: 更改后在定义处记得使用C-c C-c激活修改,否则无法显示

同时,可以通过变量org-tag-alist来创建一个全局标签列表。

如果你已经用 org-tag-alist 定义了喜欢的全局标签, 但又想在一个特定的文件中使用动态标签,那么可以通过添加一个空的 TAGS 选项到这个文件来达到这个目的:

#+TAGS:

默认情况下,org使用mini buffer 输入标签,如果希望使用一个键来完成选择,需要为标签提供唯一的字符,即 Host(h)
在配置文件中这样配置

(setq org-tag-alist '((“@host” . ?h) (“@vm” . ? v ) (“@switch” . ?s)))

如果希望标签仅仅和当前使用的文件关联,使用 @Host(h)
换行可加入\n或者多行配置

标签支持分组,类似单选,允许多个分组

#+TAGS: { @Host(h) VM(v) } Switch(s) Firewall(f)

提醒: 大括号前后空格不要忘记

配置文件中设置组参考以下例子:

(setq org-tag-alist '((:startgroup . nil)
                      ("@host" . ?h) ("@vm" . ?v)
                      ("@docker" . ?d)
                      (:endgroup . nil)
                      ("switch" . ?s) ("firewall" . ?firewall))
  • 1
  • 2
  • 3
  • 4
  • 5

如果至少为一个标签定义了快捷键,按 C-c C-c 时会展示一个特殊的界面,其中列出了当前标题已经继承了的标签,还包含一个可选的标签列表。这个界面提供了下面的快捷键:

a-z...       按这些键时会将对应的标签添加到当前的标题列表中或从当前的标题列表中移除。选择一个具体排它性的标签组时,会将标签组的其它标签移除。
TAB        在迷你缓冲区中输入一个标签,即使这个标签不在预定义的标签列表中。对于缓冲区内的标签,提供了自动完成。当然也可以一次添加多个标签,只要把他们用冒号 ':' 分开。
SPC         清除这行的所有标签。
RET         确认修改
C-g         取消修改
q            如果 /q/ 不是某一个标签的快捷键的话,效果和 *C-g* 相同。
!            关闭组的排它性。这样就可以分配一个组的多个标签。
C-c        在下次修改后(参见下面的详细说明),切换 *auto-exit* 。如果是在专家模式下,第一个 *C-c* 会提供一个窗口。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果你发现在大部分时候,仅仅需要一个键去修改标签列表,那么可以设置 org-fast-tag-select-single-key 参数。这样就不用按回车来退出快速标签选择了——它会在第一次修改立刻退出。

如果在个别情况下需要多个按键,按 C-c 为当前的标签选择关闭 auto-exit (实际上是用 C-c C-c C-c 开始了选择而不是 C-c C-c )。

如果将这个变量的值设置为 expert 那么除了多按一个 C-c 时,一般情况下在单键输入标签时选择窗口根本不会出现。

标签搜索

建立好了tag系统,可以将相关信息收集到一个表中.

C-c / m 或 C-c \ 标准检索, 按照tag进行检索
C-c a m 按标签搜索多个文件 需要把文件加入全局agenda

##导出和发布
自带导出功能: C-c C-e
image.png

元数据设置:

\#+TITLE: Emacs 最好的编辑器,没有之一
\#+AUTHOR: GuoPei
\#+EMAIL: xxx@xxx
\#+KEYWORDS:emacs ,org-mode
  • 1
  • 2
  • 3
  • 4

导出为markdown:

M-x org-md-export-as-markdown
必须支持html a标签

以上是简单例子,其他元数据请自行查阅资料,内容相当之多。我最喜欢plain text。

小技巧: 
  如果遇到段落导出无法换行问题,请在开头加入以下Option,
  #OPTIONS: \n:t

发布时设置内容元数据

通常在文档开头,以#+开头

  • 分行区块

#+BEGIN_VERSE

  • 内容区块

#+END_VERSE

发布为html时,转化为

 <p class="verse">
   p.verse { margin-left: 3%; }
  • 1
  • 2
  • 缩进区块

    #+BEGIN_QUOTE

区块

#+END_QUOTE

发布为html时,转化为

<blockquote>

  • 居中区块
    #+BEGIN_CENTER
    区块
    #+END_CENTER

  • 代码区块
    #+BEGIN_SRC ruby
    区块
    #+END_src

  • 例子
    #+BEGIN_EXAMPLE
    多行例子使用区块
    单行例子以冒号开头
    #+END_EXAMPLE

  • 注释
    #+BEGIN_COMMENT
    多行注释
    单行以#开头
    #+END_COMMENT

  • HTML 区块
    #+BEGIN_HTML
    嵌入的
    #+END_HTML

日程定义

日常用org最多的地方就是日程管理,能够管理日程的软件很多,手机电脑都有很好的工具,至于为什么我选择使用emacs,因为我喜欢纯文本。功能强大和易用本身就是矛盾,使用纯文本算是简单易用,使用org又可以保证一定的功能性。

定义状态

系统内置状态有两种: TODO和DONE
强大之处在于可以任意定义状态

例如:

#+SEQ_TODO: TODO(T!) | DONE(D@) CANCELED(C@/!)
#+SEQ_TODO: BUG(b) KNOWNCASE(k) | FIXED(f)

将定义放在文档任意位置,我选择放头部。
重要: 光标移动至定义处,使用 C-c C-c使定义生效。

将光标移动至任务处,使用C-c C-t 打开缓冲区,长得像下图这个样子,此时即可选择自定的状态。

image.png

状态改变之后,变成如下的状态

***** TODO Check compute node in demo center
- State “TODO” from “” [2018-03-16 Fri 09:34]

  • 可以定义多组状态序列,每个“#+SEQTODO”行定义一组
  • 状态之间用空格分隔
  • 可以在()中定义附加选项,包括:
    • 字符:该状态的快捷键
    • !:切换到该状态时会自动增加时间戳
    • @ :切换到该状态时要求输入文字说明
    • 如果同时设定@和!,使用“@/!”
+ 用“|”分隔未完成状态和已完成状态。未完成状态在查询待办事项时会列出。
  • 1
快捷键功能
C-c C-t打开状态切换buffer
S-LEFT/RIGTH切换状态

优先级

org中有三种优先级,分别为A,B,C,在安排日程时,可以按照优先级进行排序。

快捷键功能
S-UP/DOWN优先级设置

例:

***** TODO [#A] Check Network connection
***** TODO [#B] Check Nic status
***** TODO [#B] Check Storage status
***** TODO [#C] Check Power supply

子任务

org中,可为某个日程设置若干子任务。支持在上级任务上增加标记,当子任务状态发生改变时,自动更新上级任务完成情况。有两种表现形式,百分比和分数, 例如: [80%] 和 [3/8]
设置方式实在上级标题中,任意位置插入[%] [/], 当子任务发生改变时,自动跟新其中的数字。

例:
两种显示

***** Blade[25%] [1/4]
****** DONE [#A] Check Network connection
****** TODO [#B] Check Nic status
****** TODO [#B] Check Storage status
****** TODO [#C] Check Power supply

此处需注意:

  • 当子任务状态改变时,只更新上一级,不可级联。
  • 当所有子任务完成,只能标记为100% ,并不会标记为DONE。如果需要自动设定为完成,可以通过更新emacs配置文件进行设置,作者不喜欢这么做,请自行查找。

***** Blade[1/4]
****** DONE [#A] Check Network connection
****** TODO [#B] Check Nic [1/2] status
- State “TODO” from “” [2018-03-17 Sat 19:29]

******* TODO Nic1
******* DONE Nic2
****** TODO [#B] Check Storage status

小提醒:
org 是文本,所以copy一个区域时 ,使用标准复制(M-w)是全文本复制,被隐藏的子标题也会被复制下来,如果希望只将显示的文本复制而不复制隐藏的子标题,使用快捷键 C-c C-x v (org-copy-visible)

非标题的子任务

上一个主题是介绍的子任务是以子标题的形式。如果希望非主题的子任务,可以使用列表,并在列表开头添加 “[ ]” 作为复选框,形成局部的子任务。
例如:

****** TODO [#B] Check Storage status [2/3]
- State “TODO” from “” [2018-03-17 Sat 19:29]
- [X] HD
- [X] SSD
- [ ] Block

快捷键功能
C-c C-c改变复选框状态
M-S-Rec增加一个子项
M-Rec增加一个子项(不带复选框)

任务查询

在org 基础功能中,已经介绍过,使用C-c /, 可列出多种检索方式,如下图
image.png

选项功能
[t]odo列出所有TODO状态的task
[T]odo-kwd根据key word 选择状态,可以多个状态, 例如 TODO|DONE

时间

任务可以设置两种,计划时间(SCHEDULED)和截止时间(DEADLINE)。
首先,先熟悉一下Emacs的时间戳

时间戳

使用”< >“进行标记, 说多没用,看例子:

<2018-03-16 Fri>
<2018-03-17 Sat 21:00>
<2018-03-18 Sun 10:00-12:00>
<2018-03-16 Fri 10:00 +1w>

可以标记时间点和间隔,间隔用天(d)、周(w)、月(m)年(y)来表示
应为是文本,可以手工输入,或者使用 C-c .来创建。

选项功能
C-c .创建时间戳(在日历中,使用S-Left/Right选择日期,输入时间)
C-c <当前日期
C-c >查看日历
C-c !与任务不相关的日期 (以中括号标记)
S-Left/Right更改日期,天为单位
S-Up/Down改变光标所在的位置的时间单位,用来单独修改时间和日期

用两个连续的“–”将两个时间戳连接起来表示时间段

<2018-03-17 Sat>–<2018-03-19 Mon>

选项功能
C-c .连续使用可以创建时间段
C-c C-y计算间隔

org的时间戳

可以为任务设置计划时间与截止时间。

选项功能
C-c C-s设置计划时间
C-c C-d设置截止时间

****** TODO [#C] Check Power supply
DEADLINE: <2018-03-18 Sun 21:00> SCHEDULED: <2018-03-18 Sun>

设置timer

给org插入一个count down的 timer,用来给某个任务提示。
使用C-c C-x ; 开始一个timer。开始时,会在状态栏倒计时;结束时,会在buffer中提示。例如:

TODO [#C] Check Power supply: time out

属性

C-c C-x P 可以为任务设置属性。例如:

****** TODO [#B] Check Storage status [2/4]
- State “TODO” from “” [2018-03-17 Sat 19:29]
:PROPERTIES:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/279718?site
推荐阅读
相关标签