100 numpy exercises の Ruby版である 100 narray exercises を Markdownで書いたのですが、その中に書いてあるコード片をコピペ実行する必要が出てきます。このコピペ実行を繰り返し行うのが結構面倒だったので、Emacsで開いたファイルの選択範囲を M-xコマンド一発で実行できるようにする方法を調べました。
環境
CentOS Linux release 7.2.1511 (Core)
GNU Emacs 24.3.1 (x86_64-redhat-linux-gnu, GTK+ Version 3.8.8)
サンプルMarkdown
このMarkdownの中のコード部分を選択して実行することが目的。
## Sample MD
Python:
```python
import numpy as np
Z = np.arange(10)
print(Z)
```
Ruby:
```ruby
require "numo/narray"
z = Numo::DFloat.new(10).seq
```
Pythonコード片の実行
Emacsバッファ内でPythonを実行するには、python.el と python-mode.el の2種類の方法がある。
(1) Emacsに付属の python.el
Emacsに標準で入っているのでインストール不要。
~/.emacs.el 設定
(require 'python)
この設定は、.pyを開けば自動でロードされるので不要だが、Markdownのコード片を実行する場合はロードされないので必要。
選択範囲の実行
EmacsでMarkdownファイルを開いてPythonコードを選択し、次のコマンドを実行する。
M-x python-shell-send-region
すると、インタラクティブモードの python が起動し、*Python[ファイル名]*
というバッファに実行結果が記録されるが、前面には出ないので、swithc-to-buffer する必要がある。
(2) python-mode.el
こちらは IPython にも対応。
インストール
python-mode.el のサイトからソースを取得してインストールする。
~/.emacs.el 設定
(require 'python-mode)
これも、Markdownのコード片を実行する場合に必要。
選択範囲の実行
M-x py-execute-region
実行結果
インタラクティブモードのpythonが起動し、*Python*
というバッファが分割画面に現れて実行結果が表示される。
IPythonの場合
インタラクティブモードpythonではなく、IPythonに渡す場合は、次のコマンドを用いる。
M-x py-execute-region-ipython
Rubyコード片の実行
Emacsバッファ内でRubyを実行するには、inf-ruby.el (Inferior Ruby Mode) を用いるが、こちらも2種類ある。
(1) Ruby付属の inf-ruby.el
Rubyのソースコードに含まれているもの。長らく更新が止まっている。
インストール
Rubyソースツリーの misc/inf-ruby.el を適当なパスに配置する。
~/.emacs.el 設定
(autoload 'run-ruby "inf-ruby" "Run an inferior Ruby process")
(require 'inf-ruby)
irbプロセス起動
M-x run-ruby
選択範囲の実行
M-x ruby-send-region
(2) 派生版の inf-ruby.el
https://github.com/nonsequitur/inf-ruby で開発されている。こちらは上のRuby付属版から修正が加えられており、Pry にも対応。試したバージョンは 2.4.0。
インストール
上記URLから inf-ruby.el を取得。irb を使う場合は、そのままでは無駄なプロンプトが多数表示されて見にくいので、オプションに --inf-ruby-mode を加える修正をしてから、適当なパスに配置する。
diff --git a/inf-ruby.el b/inf-ruby.el
index deb5769..39f586d 100755
--- a/inf-ruby.el
+++ b/inf-ruby.el
@@ -83,7 +83,7 @@ Also see the description of `ielm-prompt-read-only'."
:group 'inf-ruby)
(defcustom inf-ruby-implementations
- '(("ruby" . "irb --prompt default --noreadline -r irb/completion")
+ '(("ruby" . "irb --prompt default --inf-ruby-mode -r irb/completion")
("jruby" . "jruby -S irb --prompt default --noreadline -r irb/completion")
("rubinius" . "rbx -r irb/completion")
("yarv" . "irb1.9 -r irb/completion")
~/.emacs.el 設定
(autoload 'inf-ruby "inf-ruby" "Run an inferior Ruby process" t)
irbプロセス起動
M-x inf-ruby
選択範囲の実行
M-x ruby-send-region
実行結果
Pryの場合
irbではなくPryを使う場合は、次の行を ~/.emacs.el に追加する。
(setq inf-ruby-default-implementation "pry")