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回目になります。前よりゴリゴリ視力削っていきたいです。
お時間あれば何卒よろしくお願いいたします。