Org Mode Basic In Doom Emacs

level 1

level 2

level 3

  • level 4

    • abc level 5

使用 TAB 来打开或者折叠

Shift TAB 可以在展开所有折叠 展开当前光标处的折叠和折叠所有之间切换

使用 zc 来折叠当前光标及它的子代码

使用 zo 来打开折叠

使用 zM 来折叠所有

使用 zR 来展开所有

Getting start on org mode

读 org 手册: M-x org info

转换文字和标题 : SPC m h

转换文字和列表 : SPC m i

  • item 1
  • item 2
  • item 3

abc

ccd
*

Motion

移动光标使用 h/j/k/l

(同级别的标题移动) 移动到上一个标题/下一个标题 => gk/gj OR C-k C-j

移动到父标题 => gh

Structure Editing (M即 Meta Windows: Alt MAC: option)

在上方插入新的标题 -> Shift + Ctrl + Enter

在下方插入新的标题 -> C-Enter

使当前标题升级或者降级 -> M-h/l OR M-Left/Right(方向键左右)

使当前标题及其以下的所有内容升级或者降级 -> M-S-h/l OR M-S-Left/Right(方向键左右)

abc

上下移动当前标题(下面的内容跟着移动) -> M-j/k OR M-Up/Down

cc

  • dd

上下移动当前标题(不包含其下面的内容) -> M-S-j/k OR M-S-Up/Down

Some advanced edditing thanks to Evil Mode

选择当前元素及其所有内容 -> vae

删除当前元素及所有内容 -> dae

选择当前元素及其所有内容 -> vaR

删除当前元素及所有内容 -> daR

Insert Snippets

SPC-i-s

bang -> #!/usr/bin/env bash

current time -> Sat May 2 17:11:28 2020

TODO

TODO example one

TODO example two

TODO 把TODO 替换成列表中的东西 : S-LEFT/RIGHT (列表如下 TODO PROJ STRT WAIT HOLD DONE KILL [] [-] [?] [X] 空)

TODO 指定 TODO 的state: SPC-m-t

Data/Deadline

进入以下界面后可通过 Shift + 方向键来调整日期 月份界面的切换可鼠标点击 < >

插入日历 SPC-m-d-s OR M-x org schedule

插入 Deadline SPC-m-d-d

To Create a checkbox : - [1/4][25%]

  • a
  • [-] b
  • c
  • C-c C-c OR Enter 来切换 checkbox 的状态

在 checkbox 的 父元素上输入 [/] 或者 [%] 当 checkbox状态改变时 [/]里面会显示 checkbox 的选中情况 [%] 会显示选中百分比

move this file to front of agenda: C-c-[

org agenda : SPC-o-a

Table

Create a Table

输入 |name|age|phone| 然后 SPC-m-b– org-table-insert-hline 即可插入头部 即 |—-—-—|这些内容 然后 C-Enter 就可以为表格增加行了

name age phone
abcdefdfa abceee phone
aaaa
1 abck

插入 hline 方式2

在表格下一行输入 |- 然后按 TAB ( 注意不是自动补全 如果触发了自动补全 就按个空格再回退回来再TAB )

插入 hline 方式3

C-c - (org-ctrl-c-minus)

通过 TAB 键移动光标至下一个单元

Table Motion

快捷键 说明
TAB 切换到下一个单元格,如已是最后一个单元格,则新建一行并跳到该行第一个单元格
M-S-right 在当前列前插入一列
M-S-left 删除当前列
M-S-down 在当前行前插入一行
M-S-up 删除当前行
C-m 移动到下一行,或新建一行
M-up/M-down 将当前行往上/下移动
M-left/M-right 将当前列往左/右移动
C-c ` 编辑当前单元格
C-c C-x C-w 剪切某个区域的表格内容
C-c C-x C-y 拷贝复制的内容到表格
S-return 当单元格无内容时,将其上方第一个非空内容拷贝过来;否则拷贝当前内容到下一行并随之移动
C-c C-c 强制表格重新排列
C-c ^ 表格排序

当前行上移一行 -> M-k/Up

当前行下移一行 -> M-j/Down

当前列左移一列 -> M-h/LEFT

当前列右移一列 -> M-l/Right

当前列左边插入新列 -> M-S-l

删除当前列 -> M-S-h

当前行上边插入新行 -> M-S-j

删除当前行 -> M-S-k

Shift-Enter

如果光标处的单元为空则把光标处上一行表格对应的内容复制到该光标处
如果光标处的单元不为空则把光标处的内容复制到下一行对应光标处

表格公式

Org mode 中的表格的另外一个强大之处,在于它支持公式。在表格区域使用快捷键 “C-c ‘",就可以对表格公式进行编辑,完成后公式会显示在表格下方,以 “#+TBLFM:” 开头,如下图所示。


使用 “C-c ‘” 后能在一个独立的、临时的 buffer 中编辑公式,但我们也可以在表格下方手工添加以 “+TBLFM:” 开头的行,然后直接添加公式。

上面这个公式表示将第四列的值设为第二列的值与第三列的值的乘积。在编辑好公式并保存后,将光标移动到公式所在行然后使用 “C-c C-c”,就可以应用公式到表格中。如下图所示:

在Org mode的表格公式中,用 “@” 来表示行,用 “$” 来表示列,最简单的,"@3$2” 表示的是第三行第二列的位置。
使用快捷键 “C-c }” 可以开启表格的横纵坐标显示——若要关闭的话也是用它。如果是用 “C-c ‘” 来进行公式编辑,在输入表格位置时,会看到表格上对应的位置会在当时高亮,所以建议用这种方式进行编辑。
如果只给一个坐标,则另一个坐标会被设为"当前行"或者"当前列",这在批量处理表格内容时会有用。
如果想表示一个区域的话,用 “..” 来表示。
下面这个表示左上角为第二行第一列单元格、右下角为第四行第三列单元格的区域,共包含 9 个单元格。

1
  @2$1..@4$3

下面这个则表示"当前行"的第一列到第三列的区域:

1
  $1..$3

在公式中,可以用 “@#” 表示当前行的行号,用 “$#” 表示当前列的列号,在一些稍复杂点的公式里会有用。
此外,还可以定义常量、变量,或者给某个单元格命名,然后引用它们。假设其名字为 “name”,那么 “$name” 就可以引用它了。
常量的定义可以通过 “org-table-formula-constants” 来进行,这样定义的常量是全局的;如果要定义局部的常量,可以在org文件中添加诸如这样的行:

1
   #+CONSTANTS: pi=3.14 eps=2.4e-6

还可以在当前表格引用其他表格的域,这需要其他表格被命名为某个名字,
如"FOO",我们要在另一个表格中使用其第三行第四列的域,将其值赋给当前表格的第五行第二列,则可以这样写:

1
  @5$2=remote(FOO, @3$4)

下图将被命名为 “fruit_expend” 的表格的第 6 行第 4 列的数据插入到新表格的第二行第二列中:

Org mode 的表格公式中,四则运算符都能正常使用,不过略有不同—— 乘号 "*" 的优先级要比除号 "/" 要高 ,因此

1
  $3 / $2 * $1

会被解释为

1
  $3 / ($2 * $1)

Org mode 默认使用的是 Emacs 中自带的 Calc 这个 package 来进行计算,而 Calc 中提供了相当丰富的计算方法,这里列举一二:

  1. 基础算术方法: abs, sign, inv, sqrt, min, max,详见 Arithmetic Functions
  2. 对数方法: ln, exp, log,详见 Logarithmic Functions
  3. 三角函数: sin, cos, tahn,详见 Trigonometric/Hyperbolic Functions
  4. 随机数方法: random
  5. 向量/矩阵方法: vunion, vint, vsum, vmean, vmax, vmin, vmedian,详见 Vector/Matrix Functions

Calc 的内容比较多,这里不做深入展开,有需要的话可以参考 GNU Emacs Calc Manual

此外,表格公式还能以 Emacs Lisp 的形式来进行编写,不过要在这种形式的公式前加上单引号 “’",才能正确求值。在 Emacs Lisp 形式的公式表达式中,传入的参数会被当作字符串,所有需要用格式化选项 “N” 来指明参数类型都是数值。
如下图,在不加格式化选项时,公式计算出错,加上 “;N” 后才得到了正确的结果。

所有的格式化选项,必须通过分号 “;” 和公式进行分隔并跟随在公式后面,可用的选项有:

  • p: 设置计算精度

  • n/s/e/f: 设置结果的输出格式

    • n3: 输出结果为3位有效数字(1.45)
    • s3: 输出结果为科学计数法,3位有效数字(1.45e0)
    • e3: 输出结果为工程计数法,3位有效数字(0.145e1)
    • f3: 输出结果精确至小数点后3位
  • D/R: 计算时使用角度制还是弧度制(如三角函数)

  • F/S: 分数还是符号(当为 S 时,若结果不为整数,则显示式子本身,如: sqrt(6))

  • T/t: 时间计算,要求用于计算的值是"HH:MM[:SS]“的形式,当使用 T 时,输出结果是 “HH:MM:SS” 形式;使用 “t” 时,结果显示为一个数值,默认情况下单位是小时,可以通过变量 org-table-duration-custome-format 来设置

  • E: 不使用时,所有空白单元格都会被跳过,不会包含在计算过程中;当使用时,如果还使用了 N ,则用 “0” 填充;否则,在普通公式中,用 “nan” 填充,在 emacs lisp 公式中,用空字符串填充

  • N: 使用时,将所有域的值视为数字,对于非数值型,用 0 替代

  • L: 只用于 emacs lisp 公式,后续

如果需要对表格公式的求值进行调试,可以通过快捷键"C-c {“来开启调试模式(或者关闭它)。

配合Source block 使用

Org mode 中的表格数据是可以作为变量传递到 source block 中的,如下图所示:

如上图所示,要将表格数据传递给 source block ,需要两个步骤

  1. 用 “#+NAME” 将表格命名为 “xxx”
  2. 在 source block 的选项中,用 “:var tbl_data=xxx” 将表格数据赋值给变量 “tbl_data”

对于下面这个表格,我可以可以用这个方法将数据传递给 source block ,然后用 matplotlib 来绘制图像。

Sede Max cites H-index
Chile 257.72 21.39
Leeds 165.77 19.68
Sao Paolo 71.00 11.50
Stockholm 134.19 14.33
Morelia 257.56 17.67

相应的 source block 为

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import  numpy  as  np
import  matplotlib
import  matplotlib.pyplot  as  plt

plt.style.use( 'ggplot' )
bar_names  = [row[0]  for  row  in  tbl_data]
h_index  = [row[2]  for  row  in  tbl_data]
ind  = np.arange( len (tbl_data))
width  = 0.5

plt.bar(ind, h_index, width)
plt.title( 'Citas' )
plt.xlabel( 'Sede' )
plt.ylabel( 'H-index' )
plt.xticks(ind + width/2., bar_names)

plt.savefig(filename)
return (filename)

中英文混排时 表格会不对齐 解决办法如下:

  • 下载安装 更纱字体
    https://github.com/be5invis/Sarasa-Gothic/releases 下载ttf字体 然后解压出来安装

    1
    2
    
        我们只需要安装等距更纱字体即可 因为下载下来的字体有很多
        为了确定哪个才是等距更纱字体 可以把鼠标移到字体上悬停片刻就会显示字体的标题了
    

    在等距更纱字体上右键安装即可

  • 在 ~/doom-emacs-cfg/config.el 中加入以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
        (after! org
        ;; org mode 中英文混排问题
        (defun org-buffer-face-mode-variable ()
            (interactive)
            (make-face 'width-font-face)
            (set-face-attribute 'width-font-face nil :font "等距更纱黑体 SC 16")
            (setq buffer-face-mode-face 'width-font-face)
            (buffer-face-mode))
        (add-hook 'org-mode-hook 'org-buffer-face-mode-variable))
    
  • 重启emacs生效

    该方法只在org mode中使用等距更纱字体 并不影响其它地方

  • :@ 注意部分主题不能使表格对齐如 tango

表格导出HTML

1
2
3
表格要想能正确导出则表格中的 + 和 | 必须对齐 上面已经设置了使用等宽字体解决表格对齐问题
一般来说在等宽字体对齐模式下看上去是对齐的就是对齐了 但是有一种例外: 比如使用了 pangu-spacing
在中英文中自动插入空格 这样看起来是对齐的 实际导出成HTML 就会丢失表格内容

原因是导出成HTML 的时候 导出程序自动把中英文之间的空格删掉 这就导致了表格不对齐
下面的表格就不能正确导出:


原因是在 size 行的即A 多少 K 大小那里在导出时会删掉4 个空格导致其后的 | 不能对齐 解决办法是在 | 前面加4 个空格

:@ 注意: 每一行的 + 和 | 对齐才能正确导出HTML

手动插入链接

在 + [[]] 两个中括号中输入要跳转到的唯一标题处即可自动识别建立链接

SPC 插入链接

SPC+m+l+l 即选择插入的链接类型然后添加描述
e.g : elisp -> (+ 1 2) -> want to know (+ 1 2) 效果如下:
want to know (+ 1 2)
e.g : shell -> ls *.org -> list org 效果如下:
list org

基于 headline

  1. 在文件1 中的headline 上 SPC m l s
    即调用 org-store-link 把headline 存储为一个link 供别处调用
  1. 在文件2 中 SPC m l S
    即调用 org-insert-last-stored-link 在当前位置指向最后存储的link 位置

基于文件

  1. 在文件1 中的 选中一段文字 后 SPC m l i 输入 file 回车后选择文件
    blog
    或者直接手动输入 [[file:xxx.org][文件跳转]]

emojify

:heart:
:relaxed:

导出

  • 导出 HTML
    C-c C-e h o/h
  • 导出 PDF
    C-c C-e h o 会在浏览器打开 html 这时
    • Windwos:
      Ctrl + p 打印 PDF
    • MAC
      Cmd + p 另存为 PDF

修饰

配置 (setq org-hide-emphasis-markers t) 可以在 Org 里面直接看到修饰效果

  • 粗体

    ABC

  • 斜体

    ABC

  • 下划线

    ABC

  • 清除线

    ABC

  • 代码

    ABC

  • 不使用转义字符

    A~!@#$%^&*()<>?* * BC

Special edit mode 模式

在特定的代码段按 C-' 会进入 org-edit-special
如在 babel 里会根据语言来进入一个minibuffer 这个bubffer 的模式会设为当前语言的模式
在里面可以享受所有的该模式下的代码补全代码高亮和 snippet

预览Latex

环境搭建参考 : /p/org-%E9%80%9A%E8%BF%87latex%E5%AF%BC%E5%87%BA-pdf/

\begin{equation} \left \{ \begin{aligned} 0 &= i_{a} + i_{b} + i_{c} \\ i_{\alpha} &= i_{a} \\ i_{\beta} &= \frac{\sqrt{3}}{3} \left( 2 i_{b} + i_{a} \right) \notag \end{aligned} \end{equation}

如果一切顺利的话按回车 或者 C-c C-x C-l 或者 org-latex-preview 就可以看到结果了


默认是按 scale 为 1.5 来预览 在Windows 下可能会觉得太小 想改大的话用

1
(setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0))

:@ 注意: 改变 scale 如果 org 中有加入了 minted 修饰的话很有可能会导致 预览失败
查看 log 会得到以下信息

1
2
3
4
5
6
7
8
9
runsystem(for ^%i in (pygmentize.exe pygmentize.bat pygmentize.cmd) do set > or
gtex9jdLXa.aex <nul: /p x=^%~$PATH:i>> orgtex9jdLXa.aex)...disabled (restricted
).
! Emergency stop.
<read 3>

l.36 \begin{document}

 (cannot \read from terminal in nonstop modes)

只要把 #+LATEX_HEADER: \usepackage{minted} 注释掉再重开org 文件即可
minted 是在导出成PDF 时代码高亮和代码对齐时用的 在导出成PDF 时再打开这个修饰即可

如果想一劳永逸 可以在 org 里加上修饰
#+STARTUP: latexpreview
这样重新打开 buffer 就可以看到预览效果了 但是这个预览后就看不到latex 源码了只有注释掉
#+STARTUP: latexpreview 才可行
或者用我自己写的函数来切换org 里的latex 预览状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
(defun my/preview-all-latex-toggle ()
  " 预览所有 latex 数学公式 "
  (interactive)
  (let (current-point)
    (setq  current-point (point))
    (goto-char (point-min))
    (while (re-search-forward "#\\+BEGIN_LaTeX\\s-*\n" nil t)
      ;; (message "line : %s" (buffer-substring (line-beginning-position) (line-end-position)))
      (org-latex-preview))
    (goto-char current-point)))

用Latex 导出PDF

图片

图片导出到PDF 时指定图片大小用
#+ATTR_latex: :width .5\linewidth 其中 .5\linewidth 即是宽度的0.5 倍
如果不想手动去每张图片都去修改的话可以用我写的函数来根据org 的设置来批量修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(defun my/latex-pic-size-fix ()
  " 根据org 的图片尺寸属性来添加或修改修饰 latex 图片大小的属性
    如果已经有对latex 图片配置了 则会覆盖掉原有配置"
  (interactive)
  (let (current-point pic-size latex-pic-conf line-content)
    (setq  current-point (point))
    ;; (message "origin current-point : %d" current-point)
    (goto-char (point-min))
    (while (re-search-forward "#\\+attr_org:\\s-*:width\\s-*\\([0-9]+\\)px\n" nil t)
      (setq pic-size  (string-to-number (match-string 1)))
      (setq latex-pic-conf (format "#+ATTR_latex: :width %0.2f\\linewidth\n" (/ pic-size 1500.0)))
      (setq line-content (buffer-substring (line-beginning-position) (line-end-position)))
      (when (string-match "#\\+ATTR_latex:\\s-*:width\\s-*" line-content)
        ;; 如果已经存在了 latex 的配置 直接删除
        (save-excursion
          (if (> current-point (line-end-position))
              (setq current-point (- current-point (- (+ (line-end-position) 1) (line-beginning-position)))))
          (delete-region (line-beginning-position) (+ (line-end-position) 1)))) ;; +1 是要把 \n 删掉
      ;; 插入配置
      (save-excursion
        (insert latex-pic-conf))
      (if (> current-point (line-beginning-position))
        (setq current-point (+ current-point (length latex-pic-conf)))))
    (message "all fix ok!")
    (goto-char current-point)))

表格

如果org 里有大表格 导出成 pdf 的时候会有问题需要做如下调整
#+LaTeX: \resizebox{\textwidth}{!}{ xxxx #+LaTeX: }
把表格包起来如:

1
2
3
4
5
#+LaTeX: \resizebox{\textwidth}{!}{
| 姓名 | 身高 | 颜值 | 爱好 | 交往系数 |
|------+-----+------+------+---------|
|      |     |      |      |         |
#+LaTeX: }
1
2
3
4
5
6
7
8
9
#+LATEX_HEADER: \usepackage{graphicx}
#+LATEX_HEADER: \usepackage{fancyhdr}
#+LATEX_HEADER: \pagestyle{fancyplain}
#+LATEX_HEADER: \chead{页眉}
#+LATEX_HEADER: \lhead{\includegraphics[scale=0.1]{tmp.jpg}}
#+LATEX_HEADER: \rhead{\bfseries rhead} # 页眉右边位置内容,并加粗
#+LATEX_HEADER: \cfoot{页脚}
#+LATEX_HEADER: \lfoot{lfoot}
#+LATEX_HEADER: \rfoot{rfoot}

导出

导出设置参考 /p/org-%E9%80%9A%E8%BF%87latex%E5%AF%BC%E5%87%BA-pdf/

Licensed under CC BY-NC-SA 4.0