org 文档使用 ob-ipython 进行 python literal programming

1. ob-ipython

使用 ob-ipython 可以在 org 文档内运行代码块, 代码块内容会被发送到后台的 Jupyter 进程运行, 返回结果会被插入到 org 文档中. org 文档丰富的显示类型使得使 用 org 文档来代替 jupyter notebook 成为了一种不错的体验.

效果图

2. 安装

以下指引针对 spacemacs 用户, 其它配置的用户需要在自己的配置中添加对应的设置.

2.1. 安装 ob-ipython

dotspacemacs-additional-packages 中添加 ob-ipython.

SPC f e R 重新载入 spacemacs 配置或者重启 spacemacs 下载安装 ob-ipython.

2.2. 安装 jupyter

2.2.1. 手动安装 jupyter

python3 安装 jupyter

pip3 install jupyter

2.2.2. 使用 use-package

dotspacemacs/user-config 中添加

(use-package use-package-ensure-system-package
:ensure t)

(use-package ob-ipython
:ensure-system-package ((jupyter . "pip3 install jupyter")))

使用 use-package 的 use-package-ensure-system-package 功能, 如果系统 PATH 中没有 jupyter, 自动运行下载命令.

SPC f e R 重新载入 spacemacs 配置.

3. 配置

dotspacemacs/user-config 中添加

;; 设置 python 解析器路径
(setq python-shell-interpreter "/usr/local/bin/python3")

(with-eval-after-load 'org
(add-to-list 'org-babel-load-languages '(ipython . t))
;; 不再询问是否允许执行代码块
(setq org-confirm-babel-evaluate nil)
;; display/update images in the buffer after I evaluate
(add-hook 'org-babel-after-execute-hook 'org-display-inline-images 'append)
)

4. 使用 yasnippet

使用 yasnippet 帮助你快速的创建 ipython 代码块.

打开 org 文档, 点击菜单 YASnippet New snippet, 粘贴以下内容, 保存.

# -*- mode: snippet -*-
# name: ipython block
# key: srcip
# --
#+BEGIN_SRC ipython :session ${1::ipyfile ${2:$$(let ((temporary-file-directory "./")) (make-temp-file (concat (file-name-sans-extension (file-name-nondirectory buffer-file-name)) "-py") nil ".png"))} }:exports ${3:both} :results raw drawer
$0
#+END_SRC

现在你可以在 org 文档中输入关键字 srcip 然后使用 M-/ 自动扩展, 然后连续按 下 TAB 自动生成类似以下的代码

#+BEGIN_SRC ipython :session :ipyfile /Users/mpwang/org/test-py9bDtND.png :exports both :results raw drawer

#+END_SRC

假设你的 org 文件名为 test.org, 如果你的代码块会生成图片, 这段代码会自动创建随 机生成的以 test 开头的文件名 test-py9bDtND.png 保存图片.

5. 显示图片及表格

ipython startup files

设置 ipython startup 文件让 org 文档显示图片以及表格

~/.ipython/profile_default/startup 中添加 ob-ipython.py 文件, 插入以下内容, 保存.

import IPython
from tabulate import tabulate

class OrgFormatter(IPython.core.formatters.BaseFormatter):
def __call__(self, obj):
try:
return tabulate(obj, headers='keys',
tablefmt='orgtbl', showindex='always')
except:
return None

ip = get_ipython()
ip.display_formatter.formatters['text/org'] = OrgFormatter()

6. Enjoy

现在你已经可以在 org 文档代码块中使用 C-c C-c 执行 python 代码并且可以在 org 文档中漂亮地显示图片以及表格了.

Emacs Rocks!

Generated using Emacs 29.0.50 (Org mode 9.4.6)