xonshの文法は、Pythonを拡張しており、Shellとして使う時にはコマンドとPythonコードを混在させて記述でき、とても便利に使うことができる。
しかし、あくまでxonshの文法はPythonの拡張のため、Visual Studio Codeなどで.xonshrcを編集しようとすると、mypyや補完などと連携できない。設定ファイルを記述するときにも、これらのツールの恩恵が得られれば、よりxonshを拡張しやすいのにと考えていた。
問題は3つある。
-
$HOGE
で、環境変数を参照している。$
はPython文法ではないためエラーになる。 -
$(hoge)``!(hoge)
で、PythonではなくShellとしてhogeコマンドを実行できる。$()
はPython文法ではないため、エラーになる。 -
alias
関数は builtins.alias と、builtinsに直接追加されている。from builtins import alias
としてもmypyではエラーになる。
そこで、Pythonの文法を逸脱しないように以下の2つを行った。
-
$(hoge)``!(hoge)
を使わず、invokeや、builtins.__xonsh__.execer.eval(hoge)
を使って、コマンドを実行する。 -
$HOGE
を使わず、builtins.__xonsh__.env
を使って環境変数をやり取りする。
つぎに、mypyでbuiltins.alias
などのbuiltinsの拡張がエラーになる問題に対して、以下を行った。
- xonshオリジナルの
builtins.xxx
を使う場合、それを一つのパッケージでラップし、.xonshrcからは、そのパッケージを参照する。
以下のようなパッケージを作成した。
xonsh_builtin/__init__.py
import builtins
import xonsh
x_env: xonsh.environ.Env = builtins.__xonsh__.env
x_execer: xonsh.execer.Execer = builtins.__xonsh__.execer
x_aliases: xonsh.aliases.Aliases = builtins.aliases
x_events: xonsh.events.EventManager = builtins.events
このパッケージを参照することにより、以下のように使える。
.xonshrc
from .xonsh_builtin import x_env, x_aliases, x_execer
# 環境変数の取り回し
HOME = x_env["HOME"]
x_env["PATH"].append("{HOME}/bin")
# コマンドの実行
def __bookmark():
name = run("cat ~/bookmark | peco").lines[0].strip()
x_execer.eval(command)(f"cd {name}")
x_aliases["bk"] = __bookmark
# aliasesの利用
x_aliases["ll"] = ["ls", "-al"]
このようにPythonの文法の範疇で、xonshの設定を記述することができる。
ちなみに、私のxonshの設定ファイルは以下にあります。
では、よいPythonShellライフを!