flycheck で走らせるプログラムを探すのに direnv に手伝わせる時の注意点
挨拶
またしても前回の投稿から間が空いてしまいましたが、なんと就活が終わっていたり 大学院を中退していたりと色んなことが起こりました。ひと段落したので VJや動画制作やWebデザインなど、もっと取り組んでいきたいと思います。
flycheck が使う文法チェック系プログラム
Emacs でリアルタイムに文法チェックを行うのに便利なのが flycheck ですが、
flycheck 自体がコードを調査しているのではなく、rubocop やら eslint やらを
実行しているのはご存知かと思います。
それらのプログラムはどのように探されているかというと、シェルが $PATH から
プログラムを探すように、Flycheck は Emacs 上の変数 exec-path から探しています。
公式ドキュメントにその記述があります。
また、exec-path の中身は
M-x describe-variable RET exec-path
で見ることができます。
direnv を使ってプロジェクト毎の文法チェックプログラムを探させる
少し話が逸れますが、eslint だったり rubocop と言った文法チェック系のプログラムは、
なるべくグローバルにではなくプロジェクトのディレクトリ内に置いときたい派です。
なんとなくなのでちゃんとした理由があるわけではないです。
なので、例えばNode.js 系のプロジェクトなら npm で eslint を導入すると、
node_modules/.bin ディレクトリに実行ファイルが置かれるような状態です。
普通はそのようなディレクトリには $PATH が通ってませんが、direnv を使えば
プロジェクトのディレクトリ下に入った時だけ $PATH にそれらを含めることができます。
.envrc というテキストファイルをプロジェクトのルートディレクトリに置き
export PATH="node_modules/.bin:$PATH"
と記載してやると良い感じになります。細かい話などは割愛しますので調べてみてください。
そして、普通シェルから立ち上げた Emacs は $PATH から exec-path に値が丸写しされますし
(GUI の場合は exec-path-from-shell というパッケージが要るそうです)、
direnv 管理下のファイルを Emacs で開けば .envrc に書かれた内容も
もちろん exec-path に反映されています。
.envrc での $PATH の追加の仕方に注意
ただし、上記の export PATH="bin:$PATH" のように相対パスで指定すると、実はうまく動かない時が出てきます。
例えばファイル構成が以下の場合を想定します。
- /your/great/project/.envrc
- /your/great/project/node_modules/.bin/eslint
- /your/great/project/code1.js
- /your/great/project/nested/code2.js
.envrc には
export PATH="node_modules/.bin:$PATH"
が記載されています。
このとき、Emacs で /code1.js を編集しているときは $PATH に従って /node_modules/.bin/eslint を見つけにいきますが、/nested/code2.js を編集しようとすると /nested/node_modules/.bin/eslint を探しに行こうとして見つからずに失敗します(多分そうだと思います)。
なのでEmacs の flycheck を利用する場合は $PATH は必ず絶対パスである必要があります。
PATH_add で楽して絶対パスを指定する
では .envrc には必ず絶対パスを書く面倒なことをしなくちゃいけないのかというとそうではなく、
PATH_add という便利機能が備わって要るので、それを使いましょう。
PATH_add node_modules/.bin
これによって $PATH には /your/great/project/node_modules/.bin のように
絶対パスで追加されます。
結論
プロジェクトディレクトリ以下に文法チェック系のプログラムがあり、
かつ flycheck にそれを見つけさせるために direnv を使う場合は、
PATH_add を使った方が良いと思います。
告知
5月中に 2件VJやります。
初めて学外でVJやった 武蔵小杉アルファクロス 様でまたVJできるのとても楽しみです。 エイジアも2回目になります。前よりゴリゴリ視力削っていきたいです。
お時間あれば何卒よろしくお願いいたします。