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()
をよぶとコマンドの終了まで待ち、output
、errors
に標準出力、エラー出力が入る。$(command)
だと標準エラーが出力されないので、こちらを使っている。
この手の挙動もPythonで楽々組めるxonshは便利です。