9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

xonshの設定ファイルをPythonの文法で記述する

Last updated at Posted at 2018-12-01

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ライフを!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?