LoginSignup
9
7

More than 5 years have passed since last update.

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

Posted at

主に、公式のREADMEの転載です。

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プロセス内でリロードする

使い方

実験用に、こんなファイルを用意する。

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

図は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

ちなみに、コマンド表には見当たりませんでしたが、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 rC-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

とミニバッファに表示されるだけ。
なんとなく、ここに開きたいコントローラの名前を入力してやればいいのかな?とpost_controller.exと入力してTABを押してみると[No match]と表示さる。
実際に開いてみても、まっさらなバッファが作られるだけ。
いったんバッファを閉じて、もう一度C-c a n cと入力し、今度はミニバッファに何も入力していない状態でTABを押してみると...
スクリーンショット 2016-02-17 19.49.27.png

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

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

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

その他MixとかTestとかとの連携

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

9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7