Emacs:在 org-mode 中插入源代码块

用 org-mode 记笔记、写博客(比如你现在看到的这篇)、做知识管理的时候,经常需要插入各种类型的源代码,于是我写了个小函数来简化这个过程。

1 org-mode 中的源代码块

这是一个 org-mode 中的 Elisp 代码块(可折叠):

#+BEGIN_SRC emacs-lisp
  (message "天地玄黄,鸟生鱼汤")
#+END_SRC

:在 Emacs 中,把光标置于源代码中间,按 M-x org-edit-src-code (我把它绑定到了 C-c s e ),就可以在相应的模式下编辑这段代码。

2 org-insert-src-block

为了不用自己输入 #+BEGIN_SRC…#+END_SRC 这一段,我写了下面这个 Elisp 函数:

(defun org-insert-src-block (src-code-type)
  "Insert a `SRC-CODE-TYPE' type source code block in org-mode."
  (interactive
   (let ((src-code-types
          '("emacs-lisp" "python" "C" "sh" "java" "js" "clojure" "C++" "css"
            "calc" "asymptote" "dot" "gnuplot" "ledger" "lilypond" "mscgen"
            "octave" "oz" "plantuml" "R" "sass" "screen" "sql" "awk" "ditaa"
            "haskell" "latex" "lisp" "matlab" "ocaml" "org" "perl" "ruby"
            "scheme" "sqlite")))
     (list (ido-completing-read "Source code type: " src-code-types))))
  (progn
    (newline-and-indent)
    (insert (format "#+BEGIN_SRC %s\n" src-code-type))
    (newline-and-indent)
    (insert "#+END_SRC\n")
    (previous-line 2)
    (org-edit-src-code)))

eval 之,按 M-x org-insert-src-block ,然后输入代码类型(如 emacs-lisp,按 TAB 可自动补全)即可。

感谢 李杀 关于 ido-completing-read 的帮助。

3 绑定快捷键

把 `C-c s i’ 绑定到这个函数,我的 org-mode-hook 设置如下:

(add-hook 'org-mode-hook '(lambda ()
                            ;; turn on flyspell-mode by default
                            (flyspell-mode 1)
                            ;; C-TAB for expanding
                            (local-set-key (kbd "C-<tab>")
                                           'yas/expand-from-trigger-key)
                            ;; keybinding for editing source code blocks
                            (local-set-key (kbd "C-c s e")
                                           'org-edit-src-code)
                            ;; keybinding for inserting code blocks
                            (local-set-key (kbd "C-c s i")
                                           'org-insert-src-block)
                            ))

4 代码块中的语法高亮

org-src-fontify-natively 这个变量设为 t, 这样代码块里也会语法高亮 (需要 revert-buffer 来重新加载一下当前的 org 文件).

(setq org-src-fontify-natively t)

org2blog 是利用 org-mode 的 export 引擎来把 org 文件转换成 HTML, 生成的 HTML 中的代码块依然是语法高亮的.

需要注意的是, 生成的 HTML 中的语法高亮配色, 和你在 emacs 中看到的是一样的. 所以博客的配色和 emacs 的配色最好是接近的. 比如我在 emacs 用 zenburn, 博客的配色也是类似于 zenburn (我自己改的 CSS). 否则你在 emacs 看着很舒服的代码, 换个背景色, 可能就看着很难受了. 如果你的博客是浅色背景, 而在 emacs 中用的是深色背景, 那么在 M-x org2blog/wp-post-buffer 之前, 最好换一个浅色主题, 比如 M-x load-theme tango.

5 org-mode 支持的语言

目前(版本号:7.9.3d)支持以下语言:

语言 标识符
Asymptote asymptote
Emacs Calc calc
C++ C++
CSS css
Graphviz dot
gnuplot gnuplot
Java java
Javascript js
Ledger ledger
Lilypond lilypond
Mscgen mscgen
Octave octave
Oz oz
Plantuml plantuml
R R
Sass sass
GNU Screen screen
SQL sql
Awk awk
C C
Clojure clojure
ditaa ditaa
Emacs Lisp emacs-lisp
Haskell haskell
LaTeX latex
Lisp lisp
MATLAB matlab
Objective Caml ocaml
Org mode org
Perl perl
Python python
Ruby ruby
Scheme scheme
shell sh
SQLite sqlite

6 其他方案

感谢 Celad Evra 的提醒,org-mode 自带的 Easy Templates 也提供了快速插入代码块的功能: 输入 <s TAB 即可(但不提供语言标识符的补全),具体细节请见 org-mode 的文档。

3 thoughts on “Emacs:在 org-mode 中插入源代码块

  1. Pingback: Org-mode.8 以上的更新及 Org2blog 总结 | 朱晓瑞 Xiaorui.Zhu