emacsのalchemist-modeについての備忘録

主に、[公式のREADME](https://github.com/tonini/alchemist.el)の転載です。

# elixirコマンドやiexコマンドを呼び出す

## コマンドチートシート

### elixirコマンドの呼び出し

| キーバインド | 関数名 | 概要 |
|:-----------|-------|:-----|
| `C-c a e b`  | alchemist-execute-this-buffer | 現在のバッファを実行 | 
| `C-c a e f`  | alchemist-execute-file | ファイル名を指定して実行 |
| `C-c a e e`  | alchemist-execute | 対象ファイルを、任意のオプションをつけて実行 |

### iexコマンドの呼び出し

| キーバインド | 関数名 | 概要 |
|:-----------|-------|:-----|
| `C-c a i i`  | alchemist-iex-run | iexプロセスを開始する |
| `C-c a i p`  | alchemist-iex-project-run | プロジェクトの依存モジュールをロードしつつiexプロセスを開始する？(iex -S mix) | 
| `C-c a i l`  | alchemist-iex-send-current-line | 現在の行をiexに渡す |
| `C-c a i c`  | alchemist-iex-send-current-line-and-go | 現在の行をiexに渡し、iexバッファにカーソルを移動する | 
| `C-c a i r`  | alchemist-iex-send-region | マークされたリージョンをiexに渡す |
| `C-c a i m`  | alchemist-iex-send-region-and-go | マークされたリージョンをiexに渡し、iexバッファにカーソルを移動する |
| `C-c a i b`  | alchemist-iex-compile-this-buffer | 現在のバッファをコンパイルする |
| `C-c a i R` | alchemist-iex-reload-module | 現在のバッファを再コンパイルし、iexプロセス内でリロードする |

## 使い方
実験用に、[こんな] (https://gist.github.com/ak-ymst/3e3cfd619e9aa2cefe65)ファイルを用意する。

```elixir:hello.ex
defmodule Hello do

  def world do
    IO.puts "Hello world from function"
  end
end

Hello.world
IO.puts "Hello world from inlinet"
```

このファイルを、コマンドラインから実行すると...

```
$ elixir hello.ex 
Hello world from function
Hello world from inlinet
$
```
この通り、特におもしろみのない結果が表示されます。
同じことを、emacs上で行いたい場合はファイルをemacsで開いた状態で`C-c a e b`と入力すれば、別バッファが開き、そこに結果が出力されます。

また、対話式の実行環境であるiexを使って、行単位に実行して見たい時は、まず`C-c a i i`（あるいは`C-c a i p`）でiexプロセス開始し, 実行したい行にカーソルを合わせた状態で`C-c a i l`と入力します。

![スクリーンショット 2016-02-17 19.02.36.png](https://qiita-image-store.s3.amazonaws.com/0/111295/9e409636-1716-28c6-c73f-ad2a7221e09f.png)

図は9行目をiexに渡して実行したところです。
`C-c a i l`の代わりに`C-c a i c`を入力すると、コマンド実行後、結果バッファの方にカーソルが移動します。
ただし、この状態で8行目を実行しようとすると…

```
iex(3)> Hello.world
** (UndefinedFunctionError) undefined function Hello.world/0 (module Hello is not available)
```

とエラーになります。
モジュールがロードされてないわけなので当然ですね。
なので, 1行目から6行目までをリージョン指定して、`C-c a i r`
その後、もう一度8行目を実行すれば、エラーは発生しないことが確認できると思われます。
![スクリーンショット 2016-02-17 19.15.45.png](https://qiita-image-store.s3.amazonaws.com/0/111295/deafdbbe-9cec-26b3-7e69-650034dd9d39.png)

ちなみに、コマンド表には見当たりませんでしたが、alchemist-iex-send-last-sexpという
直前のブロック全体をiexに渡す関数(lisp-modeでいうC-jみたいなものか？)も定義されているので
モジュールの定義とうはこちらを使ったほうが楽かもしれません。


# phoenixプロジェクトに関連したコマンド

## コマンドチートシート
| キーバインド | 関数名 | 概要 |
|:-----------|-------|:-----|
| `C-c a n w`  | alchemist-phoenix-find-web | webディレクトリのファイルを開く |
| `C-c a n c`  | alchemist-phoenix-find-controllers | controllersディレクトリのファイルを開く |
| `C-c a n l` | alchemist-phoenix-find-channels | channelsディレクトリのファイルを開く |
| `C-c a n t` | alchemist-phoenix-find-templates | templatesディレクトリのファイルを開く |
| `C-c a n m` | alchemist-phoenix-find-models | modelsディレクトリのファイルを開く |
| `C-c a n v` | alchemist-phoenix-find-views | viewsディレクトリのファイルを開く |
| `C-c a n s` | alchemist-phoenix-find-static | staticディレクトリのファイルを開く |
| `C-c a n r` | alchemist-phoenix-router | router.exを開く |
| `C-c a n R` | alchemist-phoenix-routes | `mix phoenix.route`を実行する |

## 使い方
まず、`C-c a n r`と`C-c a n R`について。
これらは単純で、前者は現在のウィンドウにrouter.exバッファを開き、後者は別のウィンドウに`mix phoenix.route`の結果を出力する。

ちょっとつまずいたのは、それ以外のコマンド。
例えば、`C-c a n c`(alchemist-phoenix-find-controllers)は公式の説明では

> List all controllers in web/controllers directory.

と書かれています。
一見、diredか何かでweb/controllersディレクトリを開くのかのような説明ですが、実際にコマンドを実行してみると。

![スクリーンショット 2016-02-17 19.38.15.png](https://qiita-image-store.s3.amazonaws.com/0/111295/d5c6d0f4-6024-eeca-cc3f-dfb6eba7cd26.png)

とミニバッファに表示されるだけ。
なんとなく、ここに開きたいコントローラの名前を入力してやればいいのかな？とpost_controller.exと入力してTABを押してみると[No match]と表示さる。
実際に開いてみても、まっさらなバッファが作られるだけ。
いったんバッファを閉じて、もう一度`C-c a n c`と入力し、今度はミニバッファに何も入力していない状態でTABを押してみると...
![スクリーンショット 2016-02-17 19.49.27.png](https://qiita-image-store.s3.amazonaws.com/0/111295/2b6431ec-4c0c-5156-444c-b934b05936a0.png)

ここまで補完される。
更にTABを押すと、新しいバッファが開き、候補リストが表示される。
ファイルを候補リストから選択するか、あるいはファイルのプロジェクトルートからのパスをミニバッファで指定してやることで、ようやくコントローラのファイルを開くことができました。
他のmodel等のコマンドに関しても基本的には同じ操作のようです。
（ただし、templateファイルを開く`C-c a n t`に関しては動作が確認できませんでした）

ちなみに、結局プロジェクトルートからのパスを指定してファイル開いているだけなので、コントローラを開くコマンドでモデルも開けるのでは？と試したところ、実際に開くことはできましたが、入力補完が働かず全部手動で正確に入力してやる必要があり、とても使い物にはなりませんでした。

ファイルの種類を細かく分類せず、webディレクトリ以下のすべてのファイルを開く対象としている
`C-c a n w`コマンドを使えばすべてのファイルに対して入力補完が効くので、ファイル開きたいときは、このコマンド一本でいいような気もします。
（その場合、限定版の`C-x C-f`と同じなのでは？という気もしますが）


# その他MixとかTestとかとの連携
READMEには、他にもMIXコマンドの呼び出しやテストの実行などについての説明がいろいろと書かれていましたが
まだ動作の確認が取れていないので、今回はここまで。
これらの機能（特にテスト関連）についても、色々便利そうなことが書いてあるので、動作確認できたらまた記事まとめます。