LoginSignup
3
5

More than 5 years have passed since last update.

xonshでdirenvを使う

Last updated at Posted at 2018-12-07

2019/02/09追記
xontribが本家のリストに追加されました。xontrib listで表示されます。
https://xon.sh/xontribs.html#direnv

2019/01/09追記
xontrib にしました → https://github.com/74th/xonsh-direnv/

注意: xonsh/0.8.1 の時点での動作を確認した

direnv という .envrc というファイルに export を書いておくと、そのディレクトリでのみ環境変数を有効にしてくれる便利なツールがある。

bashでは、eval "$(direnv hook bash)"を.bashrcに書いておくことで有効になるが、xonshでは使うことができない。

これをxonshで有効にするには以下のよう.xonshrcにセットする。

import jaon
@events.on_chdir
def direnv(olddir, newdir, **kw):
    r = !(direnv export json)
    r.end()
    if len(r.output) > 0:
        lines = json.loads(r.output)
        for k,v in lines.items():
            if v is None:
                del(__xonsh__.env[k])
            else:
                __xonsh__.env[k] = v

direnvのbashでの動作は、プロンプトにdirenv export jsonのコマンドを仕込み、ディレクトリを移動するタイミングで、export及びunsetで目的の環境変数の設定を行う。

これをxonshのディレクトリ移動のイベント(@events.on_chdir)で実行し、exportとunsetを環境変数の辞書である__xonsh__.envに対して実行すれば良い。

なお、!(command)はCommandPipeline型が返り、end()をよぶとコマンドの終了まで待ち、outputerrorsに標準出力、エラー出力が入る。$(command)だと標準エラーが出力されないので、こちらを使っている。

この手の挙動もPythonで楽々組めるxonshは便利です。

3
5
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
3
5