Emacs: ob-ipython.el で日本語を使う設定等

以前 紹介した ob-ipython.el について 2 点ほどメモ。

日本語を使う場合の設定

[2015-07-04 土] 修正されたので以下の設定は不要です。

ob-ipython.el ではコードブロックに日本語のコメントを書くとエラーになります。流石にこれは困るので、とりあえず init.el に以下のように設定することで回避することにしました。lisp 力が低すぎて自信ないですがこれで問題ないかと。

(defun org-babel-execute:ipython (body params)
  "Execute a block of IPython code with Babel.
This function is called by `org-babel-execute-src-block'."
  (let* ((file (cdr (assoc :file params)))
         (session (cdr (assoc :session params)))
         (result-type (cdr (assoc :result-type params))))
    (org-babel-ipython-initiate-session session)
    (-when-let (ret (ob-ipython--eval
                     (ob-ipython--execute-request
                      ;; 日本語を使う場合の設定
                      ;; (org-babel-expand-body:generic body params (org-babel-variable-assignments:python params))                      
                      (org-babel-expand-body:generic (encode-coding-string body 'raw-text) params (org-babel-variable-assignments:python params))
                      (ob-ipython--normalize-session session))))
      (let ((result (cdr (assoc :result ret)))
            (output (cdr (assoc :output ret))))
        (if (eq result-type 'output)
            output
          (ob-ipython--create-stdout-buffer output)
          (cond ((and file (string= (f-ext file) "png"))
                 (->> result (assoc 'image/png) cdr (ob-ipython--write-base64-string file)))
                (file (error "%s is currently an unsupported file extension." (f-ext file)))
                (t (->> result (assoc 'text/plain) cdr))))))))

書き換えたのは (encode-coding-string body 'raw-text) の箇所です。どうやらマルチバイト文字列を扱えない箇所があるようだったので、文字列をバイト列に変換するようにしました。これは割とありがちなエラーのようで、websocket.el でマルチバイト文字を扱う時の注意 を参考にさせて頂きました。

# 日本語のコメントも OK
print(2015 - 629)
1386

:results output のサポート

ver 20150627.532 からヘッダー引数の :results output がサポートされました。

今までコード評価の標準出力はポップアップバッファに表示されていましたが、:results output により #+RESULTS: に表示できるようになりました。

:results output を使わない場合、以下のように変数を表示するのに print 関数は不要でした。

#+BEGIN_SRC ipython :session :eval no-export :exports results
a = 1
a
#+END_SRC
a = 1
a
1

以下のように コードブロックのヘッダーに:results output を指定すると、print 関数を使って標準的な記法で結果を表示できます。

#+BEGIN_SRC ipython :session :eval no-export :exports results :results output
print(a)
#+END_SRC
print(a)
1

また、これで IPython のマジックコマンドでの評価結果も取得できるようになりました。

#+BEGIN_SRC ipython :session :eval no-export :exports results :results output
%time a
#+END_SRC
%time a
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 8.34 µs

コメント

Comments powered by Disqus
書籍更新情報
2017-04-18
Pythonによる科学技術計算 基礎編
固定版:1.5版、リフロー版:1.2版への更新が可能になりました。
サポートページはこちら
電子書籍