かーくがかーくよ

色々書くよ プログラミングとか漫画とかゲームとかが主

XonshをWindowsで(比較的)お手軽に使ってみる

はじめに

これはXonsh Advent Calendar 2018の23日目の記事です。

概要

同カレンダー3日目の記事の終わりでも書いたように、できるだけストレスなくWindowsにXonshを導入する方法について考えてみました。

考えてみた結果、「Git for Windows(GitBash)の上で起動するのが一番カジュアルじゃね?」という結論に達しました。

以下、具体的な準備について書いていきます。

1. Git for Windowsをインストールする

とりあえず、コマンドプロンプトよりはシェルの上で使いたいので、シェル環境を導入したいところです。

Windows上で動くシェルについては下記の記事が大変参考になります。

Windowsで使えるターミナルとシェルのまとめ - Qiita

記事中にもあるように色々な選択肢があるとは思うのですが、個人的には、Windows上でのちょっとした作業をLinuxライクなシェルでこなしたい場合はGit for Windowsが結局一番ミニマムかつお手軽なのではと思っています。

ターミナルエミュレータについては私はConEmuを愛用してますが(どうしてもコマンドプロンプト使わないといけないときはあるし、そういうときにシェルとタブ切り替えで使えるのは楽)、デフォルトでGit for Windowsに付属しているminttyでも全然いいと思います。

具体的な手順については流石に書くほどのこともないとは思うのですが…ここからダウンロードして、ウィザードに従ってインストールするだけです。

2. Pythonをインストールする

3.7系はsubprocess.run()がサイコーなので導入したいのですが、Xonshのコードに3,7以降ではdeprecatedな書き方をしてる部分があるらしくてWarningが出ることがあるのがちょっと鬱陶しい…近い内に対応されると思うのでまあいいのですが。

まあ3系ならなんでもいいのではないのでしょうか。既に環境がある場合は、py launcherとかでうまく共存させるといいと思います。py launcherについては下記の記事が参考になります。

Pythonの複数バージョンの扱い方(Windowsの場合) | ガンマソフト株式会社

こちらのインストール方法もそれほど複雑なものではないです。こちらからお好みのものを。

3. Xonshをインストールする

さて、ここからがいよいよ本番です。前回もこういう流れだったな。

とはいえインストールそのものはさほど難しくありません。例えば、2の手順でインストールしたPythonが3.7系である場合は、

$ py -3.7 -m pip install xonsh
$ py -3.7 -m pip install prompt-toolkit

でインストール可能です。もちろん、Python環境が一つしか入っていない場合などは、単に

$ pip install xonsh
$ pip install prompt-toolkit

でもOKです。

これで、下記のコマンドを実行するとXonshが立ち上がります。

$ py -3.7 -m xonsh

4. 起動設定(.bashrc)

Git for Windowsbash起動時に、自動的にXonshも立ち上がるようにしたいところです。.bashrcに仕込んでおきましょう。

~/.bashrcを作成し、(必要であればお好みのエイリアス設定などを行った上で、)末尾にXonshの起動コマンドを記述しておきます。

# .bashrc
# ...中略...
py -3.7 -m xonsh  # 末尾に追記

これでGit for WindowsのシェルがXonshになりました!

ちなみに、.bashrcを新規に作成した直後にGit for Windowsを起動すると、下記のようなWarningが出るようです。ちょっと言い草が恩着せがましくてイラッとしなくもないですが、要するに「起動時にちゃんと.bashrc実行するようにしといたよ」ということなので、ありがたく受け取っておきましょう。

WARNING: Found ~/.bashrc but no ~/.bash_profile, ~/.bash_login or ~/.profile.
 
This looks like an incorrect setup.
A ~/.bash_profile that loads ~/.bashrc will be created for you.

5. その他設定(.xonshrc)

Xonsh側の設定ファイルである~/.xonshrcを作成します。

.xonshrcの内容については下記の記事を参考にしています。

xonshrcを書く - Stimulator

import _locale
_locale._getdefaultlocale = (lambda *args: ['ja_JP', 'utf_8'])

$VI_MODE = False
$COMPLETIONS_CONFIRM = True
$IGNOREEOF = True
$INDENT = "    "
$CASE_SENSITIVE_COMPLETIONS = False
$HISTCONTROL = "ignoredups"
$XONSH_AUTOPAIR = True
$AUTO_CD = True
$XONSH_SHOW_TRACEBACK = True
$SUPPRESS_BRANCH_TIMEOUT_MESSAGE = True
$UPDATE_COMPLETIONS_ON_KEYPRESS = True
$PROMPT = "{INTENSE_GREEN}{user}@{hostname}{INTENSE_YELLOW} [ {cwd} ]\n{INTENSE_CYAN}$ "
    # 参照;https://xon.sh/tutorial.html?highlight=prompt_end#customizing-the-prompt
$LS_COLORS="di=34:ln=36:so=34:pi=33:ex=31:bd=46;34:cd=43;32:su=41;30:sg=46;30:tw=42;30:ow=43;30"
    # 参照:https://qiita.com/aosho235/items/6e4737a1eca11c41da9b

from xonsh.lazyasd import lazyobject
import importlib
lazy_module_dict = {
    'sys': 'sys',
    'random': 'random',
    'shutil': 'shutil',
    'requests': 'requests',
    'os': 'os',
}
for k,v in lazy_module_dict.items():
    t = "@lazyobject\ndef {}():\n    return importlib.import_module('{}')".format(k, v)
    exec(t)

aliases['ls'] = "ls.exe --color=auto"
aliases["l"] = "ls -l"
aliases["lf"] = "ls -f"
aliases["ld"] = "ls -d"
aliases["la"] = "ls -la"
aliases["ll"] = "ls -l"
aliases["vx"] = "vim ~/.xonshrc"
aliases["pwd"] = "pwd.exe"

…ほとんど前回記事と変わらないのですが、一部注意点があるので補足しておきます。

(1) コメントなどを日本語(ascii文字以外)で書く場合、SJISで保存すること

UTF-8だとUnicodeDecodeErrorが発生します。

多分、chcp 65001コマンドプロンプト文字コードUTF-8にすれば解消されるのですが、これはこれで副作用がありそうなのでやめたほうが無難じゃないかと。

(2) encodingの文字コードを変更しておくこと

この部分ですね。

import _locale
_locale._getdefaultlocale = (lambda *args: ['ja_JP', 'utf_8'])

下記の記事参照。

xonshのタブ補完でなんかエラーになる件 - Qiita

(3) エイリアス設定でGit for Windowsのコマンド実行ファイルを明示する

この部分。

aliases['ls'] = "ls.exe --color=auto"

何故か単にlsとか実行するとPermission Deniedを食らうのですが、こうしてls.exeを指しておくと大丈夫みたいです。

grepとかviとかは別にこんなことなしなくてもいいのでちょっと釈然としないのですが…MinGWに何かあるのかな?ちょっと原因までは突き止められていないので、単に対症療法ということで。

以上で設定は完了です。

おわりに

とりあえず、WindowsだけどXonsh触ってみっかーと思った人があまり悩みすぎずに導入できるように…というあたりがこの記事の目的です。果たすことができれば嬉しいです。

まあ正直なところ最近仕事でMacを使い始めてそこにXonshを導入したらWindowsで引っかかったポイントで全然引っかからないしそもそもUNIXネイティブだからもっさりしないし変なエイリアス噛ませなくていいしパス分かりやすいし結局Xonsh使いたいならMacのほうが100000倍いいよね…やっぱり…という気持ちになったりもしたんですがそれでもWindowsだってXonsh使いたいんだから仕方ないじゃんね、MacBookほしい…

以上、読んでくださりありがとうございました!