Emacsで選択範囲のRuby,Pythonコード片実行


100 numpy exercises の Ruby版である [100 narray exercises](https://github.com/ruby-numo/narray/wiki/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 設定

```lisp
(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](https://launchpad.net/python-mode) のサイトからソースを取得してインストールする。

### ~/.emacs.el 設定

```lisp
(require 'python-mode)
```

これも、Markdownのコード片を実行する場合に必要。

### 選択範囲の実行

```
M-x py-execute-region
```

### 実行結果

インタラクティブモードのpythonが起動し、`*Python*` というバッファが分割画面に現れて実行結果が表示される。

![2016-07-31 14-51-20.png](https://qiita-image-store.s3.amazonaws.com/0/33037/d23105eb-02ff-33fd-63bb-9c1fa3ab9a6c.png)


### 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 設定

```lisp
(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 設定

```lisp
(autoload 'inf-ruby "inf-ruby" "Run an inferior Ruby process" t)
```

### irbプロセス起動

```
M-x inf-ruby
```

### 選択範囲の実行

```
M-x ruby-send-region
```

### 実行結果

![2016-07-31 14-52-43.png](https://qiita-image-store.s3.amazonaws.com/0/33037/df5d07de-ade0-2735-f15a-9c47e070315b.png)


### Pryの場合

irbではなくPryを使う場合は、次の行を ~/.emacs.el に追加する。

```lisp
(setq inf-ruby-default-implementation "pry")
```

参考：
http://d.hatena.ne.jp/rubikitch/20140627/pry