Help us understand the problem. What is going on with this article?

xonshでdirenvを使う

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は便利です。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away