Xonshを使ってみた

この記事は、Yahoo! JAPAN 18 新卒 Advent Calendar 2018の14日目の記事です。

この記事では、コマンドシェルの一種であるXonshについて軽い紹介をしつつ、私のXonshの環境について紹介していきます。

Xonshとは?

Xonshとは、Pythonで作られたコマンドシェルの一種です。

XonshはPythonで動くクロスプラットフォームのUnix-gazingシェル言語とコマンドプロンプトです。   
この言語は、追加のシェルプリミティブを持つPython 3.4+のスーパーセットです。   
Xonsh(コンシュと発音される)は、専門家と初心者の日常的な使用のために意味されます。

https://github.com/xonsh/xonsh より直訳

Xonshが他のシェル環境と異なる点としては、主に以下のようなものがあります。

Pythonインタプリタ

Xonshではシェルコマンドはもちろん使うことができますが、シェル上でそのままPythonのコードを実行することができます。

f:id:Unicore32:20181213231642p:plain

上の画像では、サンプルとしてrequestを使用してYahoo! JAPANのトップページのレスポンスを拾っています。このようにインタプリタ的なこともできますし、実行結果をそのままシェルに渡すこともできます。

f:id:Unicore32:20181213231701p:plain

補完機能

XonshはデフォルトでTabキーでのコマンド補完機能を使えるのが強みです。

f:id:Unicore32:20181213231711p:plain

fzf-widgetsを導入すると、SSHコマンドやコマンド履歴の補完も可能です。

履歴

Xonshでは、過去のコマンドの履歴を~/.local/share/xonsh/内にJSONファイルで保有しています。
1セッションごとにファイルが作成され、コマンドが記録されます。

# data.cmds内の一部分
{
  "inp": "cd templates\n",
  "rtn": 0,
  "ts": [
    1543904421.338391,
    1543904421.341983
  ]
},
{
  "inp": "ls\n",
  "rtn": 0,
  "ts": [
    1543904422.34545,
    1543904422.3573859
},

過去のコマンドの実行履歴は__xonsh_history__で呼び出すことができ、過去全てのセッションや現在のセッションの履歴を取得することも可能です。

プラグイン管理(xontrib)

Xonsh自体でプラグインも管理できる機能も備わっています。
zshの場合ですと機能拡張する場合、oh-my-zshやzgenなどといったプラグインマネージャを使うことが当たり前でしたが、Xonshではpipでプラグインを導入できます。

他にも

  • マクロを使うことが可能(メタプログラミング)
  • Pythonの仮想環境を作成可能(Vox)
  • 何かしらの操作をトリガーしてイベントを発火させることが可能

など、十分すぎる機能が備わっています。

zshなどといったシェルと比べると出回っている情報は少ないですが、最近はさまざまなブログで取り上げられるようになってます。

わたしのXonshの環境

私の環境では、zshの上でマルチプレクサであるtmuxを動かしており、その上でさらにXonshを動かしています。

以前は、pyenvの環境にPython3.6を入れてその環境にXonshをインストールしていましたが、業務上でPython使うことが基本無いこともあり、現在はhomebrewでPython3.7をインストールした上で、Xonshを導入しています。

f:id:Unicore32:20181213231729p:plain

Xonshは、設定を~/.xonshrcに記述する形となっております。ここの解説については、@vaaaaanquish さんの記事が非常に分かりやすいです。

vaaaaaanquish.hatenablog.com

#.xonshrc

# Ctrl + D で終了しない
$IGNOREEOF = True
# インデント空白4つ
$INDENT = "  "
# 補完で大小区別しない
$CASE_SENSITIVE_COMPLETIONS = False
# 補完選択Enterで即実行しない
$COMPLETIONS_CONFIRM = True
# 括弧補完
$XONSH_AUTOPAIR = True
# cd付けなくてもcdできるようにする
$AUTO_CD = True
# PROMPT
$PROMPT=" {cwd}{branch_color}{curr_branch: {}}{NO_COLOR} {BOLD_BLUE}{prompt_end}{NO_COLOR} "
# カラーテーマ
$XONSH_COLOR_STYLE="native"
# alias vim
aliases["vim"] = "nvim"
# fzf-widgets
xontrib load fzf-widgets
# coreutils
xontrib load coreutils
# docker-tabcomplete
xontrib load docker_tabcomplete
# vox (Virtual Environments Tool)
xontrib load vox

現状、特にこれと言った変わった設定を加えているわけではありませんが、業務で使用してる環境は数ヶ月ほどこの設定で使用しており、特に大きな不満もなく使えています。

また、.xonshrc内にそのままPythonのコードを記述もできます。例えば、コマンドを使って勤怠の打刻をするといったことも可能です(もちろん悪用厳禁ですが)。

私の場合は、会社の個室トイレの空き状況をコマンドで確認できるようにしています。

f:id:Unicore32:20181213231741p:plain

一方でちょっとしたことですが、バッククオートを使用したコマンド置換ができず、シェルスクリプト動かしたときに詰まったことがあります。動かす際は気をつけましょう。

f:id:Unicore32:20181213231751p:plain

おわりに

軽くですがXonshについて今回は自分の環境を交えつつ紹介しました。まだまだ使いこなせてないのでもうちょっと有効活用できるようにしたいところです。

シェル環境の中でそのままPythonを書けるというのは非常にメリットが大きいです。シェアはまだ少ないですが、使い方次第では大変便利なツールになると思います。

特にPythonistaの皆さん、ぜひ使ってみてはいかがでしょうか?