Org-mode的语法解读

原文Org Syntax (draft)1Nicolas Goaziou 编辑,维护。本文只做学习之用。

本文档描述和说明被org的解析器和导出器框架使用的语法,当然还有几个对于当前语法的意见和建议。

Org 语法中核心概念是: 只有 headlines, sections, planning linesproperty drawers 四种语法结构是上下文无关的2, 3; 其他语法结构只能存在于特定 Environments 之中。

Environments 从大到小(作用范围的尺度来做分类标准,从最宽到最窄),大致可分为三类: "Greater element", "Element" 和 "Object"。 Element 被用到了两个类的命名中,Greater 和 non-Greater, 这代表了什么呢?代表了这两类有共通之处,即它们的上下文都会被清除,重新初始化。

Paragraph 是最小的语法单元。 定义 Element 的子语法结构和 Paragraph 同级,即不能包含 Paragraph 或者被包含在 Paragraph 中。 一个 Object 可以作为一部分被一个 Element 所包含。 Greater element 的任意部分都可以是一个 Element

<!– more –>

空行属于在它们之前结束的最大 Element 。例如,在列表中,之间的空行属于它们之前的那一项,但列表末尾的空行属于当前列表 Element

除非特别说明,大小写默认不敏感。

1 Headlines and Sections

Headline 定义如下:

STARS KEYWORD PRIORITY TITLE TAGS

STARS 是一个从第0列开始的字符串,至少包含一个星号(如果加载了 org-inlinetask 库,则上限为 org-inlinetask-min-level ),并以空格字符结尾。 星号的个数代表标题的等级。它是标题中唯一必须的部分。

KEYWORD 是一个TODO关键字,它必须被定义在 org-todo-keywords-1 的列表。 大小写敏感。

PRIORITY 是一个优先级标示(priority cookie)。示例: [#A]

TITLE 可以由换行符以外的任意字符组成。 标题下的内容匹配了搜索条件,代表此标题匹配。

TAGS: 分隔的多个单词组成, 单词可由任何字母数字字符, _@#% 组成。

有效标题的示例,如下:

*

** DONE

*** Some e-mail

**** TODO [#A] COMMENT Title :tag:a2%:

若标题中的第一个单词是 org-comment-string ,当前标题将被作为 /"commented"/ 。 大小写敏感。 若标题中的第一个单词是 org-quote-string ,当前标题将被作为 /"quoted"/ 。 大小写敏感。

若其标题是 org-footnote-section 将被作为 /"footnote section"/。 大小写敏感。

org-archive-tag 是它的标签之一,它被作为 /"archived"/ 。 大小写敏感。

标题可直接包含一个段落(可选),再跟任意数量的更深级别的标题(递归定义)。 一个段落可直接包含任意 Greater elelmentElement 。 只有标题可以包含段落。 文档中的第一个标题之前的文本除外,因为它属于一个段落。

作为示例,请考虑以下文档:

An introduction.

* A Headline 

  Some text.

** Sub-Topic 1

** Sub-Topic 2

*** Additional entry 

** QUOTE Another Sub-Topic

   Some other text.

其内部结构可概括为:

(document
 (section)
 (headline
  (section)
  (headline)
  (headline
   (headline))
  (headline
   (quote-section))))

2 Affiliated Keywords

除了inlinetasks, items, planning, clocks, node propertiestable rows 之外,其他的任意的 Element 类型都可为其指定属性。

在选定的 Element 之前添加命名为 Affiliated keywords 的特定关键字,可指定属性的(在 Element 之前插入"affiliated keywords",不允许两者之前存在空行)。

Affiliated keywords 是建立在以下模式之上的: "#+KEY: VALUE", "#+KEY[OPTIONAL]: VALUE" 或者 "#+ATTR_BACKEND: VALUE" 。

KEY 可以是 "CAPTION", "HEADER", "NAME", "PLOT" 或 "RESULTS" 中的任意一个.

BACKEND 是一个由字母,数字,连字符或下划线组合而成的字符串。

OPTIONALVALUE 可以包含除换行符以外的任意字符。 只有"CAPTION"和"RESULTS"可以有可选值。

如果 KEY 为"CAPTION"或"HEADER",或者其模式为"#+ATTR_BACKEND:VALUE",则 Affiliated keywords 可以多次出现。

"CAPTION","AUTHOR","DATE"和"TITLE"可以包含 Object 及其可选值(如果适用)。

3 Greater Elements

除非特别说明, Greater elements 可以直接包含任何其他 Element 或 除了下面之外的 Greater element

3.1 Greater Blocks

Greater blocks 由以下模式组成:

#+BEGIN_NAME PARAMETERS
CONTENTS
#+END_NAME

NAME 可以由任意非空白字符组成。

PARAMETERS 可以包含除换行符以外的任意字符,可以省略。

如果 NAMECENTER ,表示当前 Greater block 是一个"center block"。 如果是 QUOTE ,表示是一个"quote block"。

如果 Block 既不是 center blockquote blockblock element,则是 special block

CONTENTS 可以包含任何 Element ,除了: Block 自己的结束行 #+END_NAME 。 此外,以星号开头的行必须用逗号引号。

3.2 Drawers and Property Drawers

Drawer 的模式如下:

:NAME:
CONTENTS
:END:

NAME 可以包含词组字符(word-constituent characters),连字符和下划线。

NAME 必须是"PROPERTIES"或属于 org-drawers 所定义列表。

如果 NAMEPROPERTIES ,则 Drawer 即为 property drawer

CONTENTS可以包含任何 Element ,除了 Drawer

Property drawer 中,*CONTENTS* 只能包含节点 node property Element 。其他类型 Drawer ,它可以包含任何 Element ,除了另一个 DrawerProperty drawer


It would be nice if users hadn't to register drawers names before using them in org-drawers (or through the #+DRAWERS: keyword). Anything starting with ^[ \t]*:\w+:[ \t]$ and ending with ^[ \t]*:END:[ \t]$ could be considered as a drawer. — ngz

3.3 Dynamic Blocks

Dynamic blocks 的模式是:

#+BEGIN: NAME PARAMETERS
CONTENTS
#+END:

NAME 不能包含任何空格字符。

PARAMETERS 可以包含任何字符,可以省略。

3.4 Footnote Definitions

Footnote definition 的模式是:

[LABEL] CONTENTS

它必须从列0开始。

LABEL 是一个数字或遵循 fn:WORD 的模式,其中word可以包含任何字组字符(word-constituent character),连字符和下划线字符。

CONTENTS 可以包含除另一个 Footnote definition 定义之外的任何元素。 它在下一个脚注定义结束,下一个标题,两个连续的空行或缓冲区的结尾。

3.5 Inlinetasks

Inlinetasks 定义为从第0列开始的 org-inlinetask-min-level 个连续星号字符,后跟空格字符。

可选地,可以使用由从第0列开始的 org-inlinetask-min-level 个连续星号字符构成的字符串来结束 Inlinetasks ,后面跟着空格和"END"字符串。

只有在加载了 org-inlinetask 库之后才能识别 Inlinetasks

3.6 Plain Lists and Items

Item 通过从以下模式开始的行来定义:

BULLET COUNTER-SET CHECK-BOX TAG

其中只有BULLET是必须的。

BULLET 是星号,连字符,加号(用于 unstored list)或者遵循模式 COUNTER. 或者 COUNTER) (用于 stored list)。 在任何情况下,BULLET后跟空格字符或换行符。

COUNTER 可以是数字或单个字母。

COUNTER-SET 遵循模式[@COUNTER]。

CHECK-BOX 是单个空格字符, X 字符或连字符,括在方括号中。

TAG 遵循 "TAG-TEXT ::"模式,其中TAG-TEXT可以包含除换行符以外的任意字符。

Item 在下一个 Item 之前结束条件: 小于或等于其起始行缩进的首行,或两个连续的空行。 其他 Greater elements 内的线的缩进不算,内联边界也不计。

Plain list 是一组具有相同缩进的连续 Item 。 它只能直接包含 Item

如果 Plain list 中的第一个 Item 在其 bullet 中有一个 counter ,那么 Plain list 将是一个 ordered plain-list 。 如果它包含一个 tag ,它将是一个 descriptive list 。 否则,它将是一个 unordered listList 类型是互斥的。

示例,思考如下的Org文档片段:

1. item 1
2. [X] item 2
   - some tag :: item 2.1

它的内部结构如下所示:

(ordered-plain-list
 (item)
 (item
  (descriptive-plain-list
   (item))))

3.7 Property Drawers

Property Drawer 是一种特殊类型的 Drawer ,包含附加到标题的属性。 它们位于headline 和其planning信息之后。

HEADLINE
PROPERTYDRAWER

HEADLINE
PLANNING
PROPERTYDRAWER

PROPERTYDRAWER 遵循下面的模式

:PROPERTIES:
CONTENTS
:END:

其中 CONTENTS 由零个或多个node properties组成。

3.8 Tables

Tables 从以竖线或"+-"字符串开始的行开始,后面跟着加号或减号,假定它们前面没有相同类型的行。 这些线可以缩进。

以垂直条开始的表具有 org 类型。 否则它具有 table.el 类型。

Org Tables 结束于以竖线开始的行。 Table.el Tables 结束于不以垂直线或加号开始的行。 这样的线可以是锯齿状的。

Org Tables 只能包含 table rows 。 table.el Tables 不包含任何内容。

一个或多个"#+TBLFM:FORMULAS"行,其中 FORMULAS 可以包含任何字符,可以在 Org Tables 之后。

4 Elements

Element 不能包含任何其他元素。

只有keywords名称属于 org-element-document-properties, verse blocks , paragraphstable rows 可以包含 Object

4.1 Babel Call

Babel calls 的模式如下:

#+CALL: VALUE

VALUE 是可选的。 它可以包含除换行符以外的任意字符。

4.2 Blocks

Greater blocks 一样, Block 模式如下:

#+BEGIN_NAME DATA
CONTENTS
#+END_NAME

NAME 不能包含任何空格字符。

如果 NAMECOMMENT ,它将是一个"comment block"。如果它是 EXAMPLE ,它将是一个"example block"。 如果它是 EXPORT ,它将是一个"export block"。如果它是 SRC ,它将是一个"source block"。如果是 VERSE ,它将是一个"verse block"。

如果 NAME 是与加载的任何 export back-end 的名称相匹配,则块将是"export block"。

DATA 可以包含除换行符以外的任意字符。它可以省略,除非 Block 是"source block"或"export block"。 在后一种情况(export block)下,它应该由一个单词组成。 在前一种情况(source block)下,它必须遵循"LANGUAGE SWITCHES ARGUMENTS"的模式,其中 SWITCHESARGUMENTS 是可选的。

LANGUAGE 不能包含任何空格字符。

SWITCHES 由任意数量的"SWITCH"模式组成,由空行分隔。

SWITCH 模式是 "-l" FORMAT "",其中 FORMAT 可以包含除双引号和换行符之外的任意字符, "-S"或"+ S",其中S表示单个字母。

ARGUMENTS 可以包含除换行符以外的任意字符。

CONTENTS 可以包含任意字符, 包括换行符。 Verse block 只能包含 Org Block ,不然的话 CONTENTS 将不能被解析。

4.3 Clock, Diary Sexp and Planning

Clock 模式如下:

CLOCK: TIMESTAMP DURATION

TIMESTAMPDURATION 都是可选的。

TIMESTAMP 是一个 timestamp object

DURATION 遵循模式如下:

=> HH:MM

HH是一个包含任意位数的数字。 MM是两位数字。

Diary sexp 是以第"%%("从0列起始一行,它可以包含除了换行符之外的任意字符。

planning 遵循下面模式的 Element

HEADLINE
PLANNING

其中 HEADLINE 是标题 Element ,PLANNING是填充有INFO部分的行,其中每个都遵循以下模式:

KEYWORD: TIMESTAMP

KEYWORD是 org-deadline-stringorg-scheduled-stringorg-closed-string 中的一个字符串。 TIMESTAMP是一个timestamp Object 。 特别要强调的一点,就是在PLANNING和HEADLINE之间不允许有空行。

即使 Planning element 可以存在于一个 Section 中的任何地方或者一个 Greater element 中,但是它只影响标题包含的 Section ,前提是它位在该标题之后。

4.4 Comments

A "comment line" starts with a hash signe and a whitespace character or an end of line.

Comments can contain any number of consecutive comment lines.

4.5 Fixed Width Areas

A "fixed-width line" start with a colon character and a whitespace or an end of line.

Fixed width areas can contain any number of consecutive fixed-width lines.

4.6 Horizontal Rules

A horizontal rule is a line made of at least 5 consecutive hyphens. It can be indented.

4.7 Keywords

Keywords 语法如下:

#+KEY: VALUE

KEY 可以包含任何非空字符,但不能等于"CALL"或任何 Affiliated keyword

VALUE 可以包含除了换行符之外的任何字符。

如果 KEY 属于 org-element-document-properties ,则 VALUE 可以包含 Object

4.8 LaTeX Environments

LaTeX environment 的模式如下:


\begin{NAME}ARGUMENTS
CONTENTS
\end{NAME}

NAME 由字母数字或星号字符组成。

CONTENTS 可以包含除"\ end {NAME}"字符串之外的任何内容。

NAME is constituted of alpha-numeric characters and may end with an asterisk.

ARGUMENTS is is any number (including zero) of ARGUMENT constructs like [DATA] or {DATA} . DATA can contain any character excepted a new line or the one ending ARGUMENT.

CONTENTS can contain anything but the "\end{NAME}" string.

4.9 Node Properties

Node propertie 只能存在于property drawers中。 它可以是下面模式的任意一个:

:NAME: VALUE

:NAME+: VALUE

:NAME:

:NAME+:

NAME* 可以包含任何非空字符,但不能以加号结尾。 不能是空字符串。

VALUE 可以包含除换行符之外的任何内容。

4.10 Paragraphs

Paragraphs 是默认 Element ,这意味着任何无法识别的上下文(unrecognized context)都是段落。

空行和其他 Element 结束 Paragraphs

Paragraphs 可以包含任意类型的 Object

4.11 Table Rows

Table Rowvertical bar 和任意数量的table cells组成,或者由连字符后面跟 vertical ba 组成。

在第一种情况下, Tables Row 具有 standard 类型。 在第二种情况下,它具有 rule 类型。

Tables Row 只能存在于tables中。

A table rows is either constituted of a vertical bar and any number of table cells or a vertical bar followed by a hyphen.

In the first case the table row has the "standard" type. In the second case, it has the "rule" type.

Table rows can only exist in tables.

5 Objects

只能在以下位置找到 Object:

大多数 Object 不能包含 Object 。 那些可以包含的会做特别说明的。

5.1 Entities and LaTeX Fragments

Entities 遵循的模式如下:

\NAME POST

其中 NAMEorg-entitiesorg-entities-user 之间具有有效关联。

POST 是行尾,"{}""字符串或非字母字符。 它不是由空格符与NAME分隔。 where NAME has a valid association in either org-entities or org-entities-user.

LaTeX Fragments 可以遵循多种模式:

\NAME BRACKETS
\(CONTENTS\)
\[CONTENTS\]
$$CONTENTS$$
PRE$CHAR$POST
PRE$BORDER1 BODY BORDER2$POST

NAME 仅包含字母字符,且不能和 org-entitiesorg-entities-user 具有关联。

BRACKETS 是可选的,不与 NAME 用空格分隔。 它可以包含任意数量的以下模式:


[CONTENTS1]
{CONTENTS2}

其中CONTENTS1可以包含除"{""}","[""]"以及换行符和CONTENTS2之外的任何字符可以包含除"{","}"和换行符之外的任何字符。

CONTENTS can contain any character but cannot contain "\)" in the second template or "\]" in the third one.

PRE is either the beginning of line or a character different from $.

CHAR is a non-whitespace character different from ., ~,~, ?, ;, ~'~ or a double quote.

POST is any of -, ., ~,~, ?, ;, :, ~'~, a double quote, a whitespace character and the end of line.

BORDER1 is a non-whitespace character different from ., ;, . and $.

BODY can contain any character excepted $, and may not span over more than 3 lines.

BORDER2 is any non-whitespace character different from ~,~, . and $.


It would introduce incompatibilities with previous Org versions, but support for $...$ (and for symmetry, $$...$$) constructs ought to be removed.

They are slow to parse, fragile, redundant and imply false positives. — ngz

5.2 Export Snippets

Export snippets 模式如下:

@@NAME:VALUE@@

NAME 可以包含任何字母数字字符和连字符。

VALUE 可以包含除"@@"字符串之外的任何内容。

5.3 Footnote References

Footnote References 有四种模式:

[MARK]
[fn:LABEL]
[fn:LABEL:DEFINITION]
[fn::DEFINITION]

MARK 是一个数字。

LABEL 可以包含任何字组成字符,连字符和下划线。

DEFINITION 可以包含任何字符。 开关方括号必须成对出现。 它可以包含任何出现在 Paragraph 中的 Object ,甚至其他 Footnote Reference

如果引用遵循第三模式,则其被称为 inline footnote ,如果它跟随第四个,即如果省略 LABEL ,它是一个 anonymous footnote

5.4 Inline Babel Calls and Source Blocks

Inline Babel call 遵循以下任何模式:

call_NAME(ARGUMENTS)
call_NAME[HEADER](ARGUMENTS)[HEADER]

NAME can contain any character besides (, ) and "\n".

HEADER can contain any character besides ] and "\n".

ARGUMENTS can contain any character besides ) and "\n".

Inline source blocks 遵循以下任何模式:


src_LANG{BODY}
src_LANG[OPTIONS]{BODY}

LANG can contain any non-whitespace character.

OPTIONS and BODY can contain any character but "\n".

5.5 Line Breaks

A line break consists in "\\SPACE" pattern at the end of an otherwise non-empty line.

SPACE can contain any number of tabs and spaces, including 0.

5.7 Macros

Macros 遵循如下模式:


{{{NAME(ARGUMENTS)}}}

NAME 必须以字母开头,后面可以跟随任意数量的字母数字字符,连字符和下划线。

ARGUMENTS 可以包含除"}}}" 字符串之外的任何内容。 ARGUMENTS 中的值用逗号分隔。 非分隔逗号必须用反斜杠字符转义。

5.8 Targets and Radio Targets

Radio targets 的模式如下:

<<<CONTENTS>>>

CONTENTS 可以是除了 <, >\n 之外的任何字符。 它不能以空格字符开始或结束。 作为 objects 而言,它只可以包含 entities, latex fragments, subscriptsuperscript

Targets 的模式如下:

<<TARGET>>

TARGET 可以是除了 <, >\n 之外的任何字符。 不能包含任何 Objects .

5.9 Statistics Cookies

Statistics cookies 遵循任一模式:

[PERCENT%]
[NUM1/NUM2]

PERCENT ,*NUM1* 和 NUM2 是数字或空字符串。

5.10 Subscript and Superscript

Subscript 的模式是:

CHAR_SCRIPT

Superscript 的模式是:

CHAR^SCRIPT

CHAR 是任何非空格字符。

SCRIPT 可以是 * 或括在括号(respectively curly brackets)中的表达式,可能包含平衡括号(respectively curly brackets)。

SCRIPT循该如下模式:

SIGN CHARS FINAL

SIGN 是加号,减号或空字符串。

CHARS 是任意数量的字母数字字符,逗号,反斜杠和点,或空字符串。

FINAL 是一个字母数字字符。

SIGN ,*CHARS* 和 FINAL 之间没有空格。

5.11 Table Cells

Table cells 遵循如下模式:

CONTENTS SPACES|

CONTENTS可以包含除垂直条之外的任何字符。

SPACES包含任意数量的空格字符,包括零。 它可用于正确对齐表格。

最后一个条可以用行中最后一个单元格的换行符替换。

5.12 Timestamps

Timestamp 有七种可能的模式:

<%%(SEXP)>                                   (diary)
<DATE TIME REPEATER-OR-DELAY>                                  (active)
[DATE TIME REPEATER-OR-DELAY]                                  (inactive)
<DATE TIME REPEATER-OR-DELAY>--<DATE TIME REPEATER-OR-DELAY>   (active range)
<DATE TIME-TIME REPEATER-OR-DELAY>                             (active range)
[DATE TIME REPEATER-OR-DELAY]--[DATE TIME REPEATER-OR-DELAY]   (inactive range)
[DATE TIME-TIME REPEATER-OR-DELAY]                             (inactive range)

SEXP 可以包含除了 >\n 之外任何字符。

DATE 模式如下:

YYYY-MM-DD DAYNAME

Y ,*M* 和 D 是数字。 DAYNAME可以包含除 +, -, ], >, 数字 和 \n 之外的任何非空白字符。

TIME 遵循模式= H:MM〜。 H可以是一个或两个数字长,可以从0开始。

REPEATER 模式如下:

MARK VALUE UNIT

MARK 对于 repeater 而言,是 + (cumulate type), ++ (catch-up type) 或者 .+ (restart type) 。 在 warning delays 的请求, MARK 可以是 - (all type) 或者 -- (first type)。

VALUE 是一个数字。

UNIT 是h(小时),d(日),w(周),m(月),y(年)中的字符。

MARK ,*VALUE* 和 UNIT 不以空格字符分隔。

时间戳中可以有两个REPEATER-OR-DELAY:一个作为 repeater ,一个作为 warning delays

5.13 Text Markup

Text markup 模式如下:

PRE MARKER CONTENTS MARKER POST

PRE 是一个空格字符, (, { ~'~ 或一个双引号,它也可以是一行的开头。

MARKER* (bold), = (verbatim), / (italic), + (strike-through), _ (underline), ~ (code) 中的符号。

CONTENTS 是模式如下的字符串:

BORDER BODY BORDER

BORDER 可以是除了 ~,~, ~'~ 和双引号之外的任何非空格字符。

BODY 可以包含任何字符,但不能跨越超过3行。

BORDERBODY 不被空格分隔。

当标记为 "bold", "italic", "strike-through" 或者 "underline"时, CONTENTS 可以包含段落中遇到的任何对象。

POST是一个空格字符, -, ., ~,~, :, !, ?, ~'~, ), } 或双引号。 它也可以是行尾。

PREMARKERCONTENTS ,*MARKER* 和 POST 不以空格字符分隔。


All of this is wrong if org-emphasis-regexp-components or org-emphasis-alist are modified.

This should really be simplified and made persistent (i.e. no defcustom allowed). Otherwise, portability and parsing are jokes.

Also, CONTENTS should be anything within code and verbatim emphasis, by definition. — ngz

脚注:

1

Org Syntax (draft) 的org源码: http://orgmode.org/worg/sources/dev/org-syntax.org

因此,使用 org-element-at-pointorg-element-context 将向上移动到父标题,并从那里自顶向下解析,直到找到原始位置周围的上下文。

2

特别说明,解析器要求在列0处的星号在不被定义为标题时用逗号来引用。

3

这也意味着只有 HeadlineSection 能通过查看行的开头来识别。 Planning linesProperty drawers 可以通过查看一行或两行以上来识别。

Last Updated 2017-05-23 Tue 13:28.
Render by hexo-renderer-org with Emacs 25.3.2 (Org mode 8.2.10)