XONSHをWindowsにインストールしてWindows Terminalに設定してみる

Oh My Poshの対応しているシェルを見ていると、XONSHというシェルが目につきました。

[Oh My Posh Change your prompt](https://ohmyposh.dev/docs/installation/prompt)

調べてみると、XONSHはshellコマンドとPythonコマンドが利用できるシェルのようで、Linux、OSX、Windowsと主要なシステムで動くようです。

普段は主にPowerShellを利用しており、PowerShellには親しみを感じている気がするので、ちょっとXONSHを利用する事によってPythonに親しみが持てるようになるのでは？

と思い浮かんだので、ちょっとWindowsにXONSHをインストールしてみます。

## サイト

- [XONSH](https://xon.sh/)
- [xonsh documentation](https://xon.sh/contents.html)
- [Windows](https://xon.sh/platform-issues.html#windows)
- [anki-code / xonsh-cheatsheet](https://github.com/anki-code/xonsh-cheatsheet)
- [Awesome Xontribs](https://xonsh.github.io/awesome-xontribs/)
- [Tutorial: Extensions (Xontribs)](https://xon.sh/tutorial_xontrib.html#loading-xontribs)

## 今回実行している環境

- Windows 11 23H2
- xonsh 0.15.1
- Windows ターミナル (プレビュー) 1.20.10822.0

## インストール

[Installation](https://xon.sh/contents.html#installation)

インストール方法として下記の3種類の記事が用意されていました。

- [Package Manager](https://xon.sh/packages.html)
- [AppImage](https://xon.sh/appimage.html)
- [Docker container](https://xon.sh/containers.html)

今回は[Package Manager](https://xon.sh/packages.html)に記載されているpipを使った方法を使い、venvで仮想環境をつくってそこにインストールを行います。

### venvで作成した仮想環境へのインストールについて

[Python Virtual Environments](https://xon.sh/python_virtual_environments.html)

ドキュメントを読むと、xonsh上で仮想環境 venv , virtualenv, pewとは相性が悪いと記載があります。

xonsh上で仮想環境を利用する場合はVoxを使うのが間違いないようですが。

今回のようにxonsh自体をvenvで作った仮想環境上にインストールについては特に言及されていないので、venvで作成した仮想環境にxonshをインストールしてみます。

何か問題が出てきてたその時はその時です。

### PyPiパッケージからインストール

PowerShellコンソールで下記コマンドを実行してインストール。
今回はvenvで仮想環境xnoshを作成して、そこにインストールしています。

```powershell
py -m venv C:\venv\xonsh
C:\venv\xonsh\Scripts\Activate.ps1
pip install 'xonsh[full]'
gcm xonsh
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/8689e7dc-cacb-01e2-ed73-882928cd7673.png)

## Windows Terminalで起動できるようにしてみる

Windows Terminalの設定から新しい空のプロファイルを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/752242cb-4899-6927-5e84-dd3310bb02c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d51f12b1-27fd-89ff-f03f-af40c3fbc167.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ffefe337-aa55-544f-833a-1d7479c8cd33.png)

- 名前をxonsh
- コマンドラインをインストールしたxonsh.exeのパスを指定
- タブタイトルをxonsh
- 追加の設定でタイトルの変更を表示しない
 
上記を入力して保存を選択

Windows Treminalでxonshが起動できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/83a233eb-edec-2107-1fd7-8cfd4a3b2210.png)

## チュートリアル

[Tutorial](https://xon.sh/tutorial.html)

インストールができたので、ここではチュートリアルの最初の部分をやってみます。
（全部なぞると、長いので）

### xonshの起動

先ほどWindows Treminalで起動できるように設定したので、そちらから起動。
もしくは仮想環境をActiveにした状態で下記コマンドでも起動できます。

```powershell
# xonsh 起動
xonsh

# これでも起動できる
py -m xonsh
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/126076af-c194-13af-7d67-2652362d45ba.png)

### プロンプト表示を変更してみる

[$PROMPT](https://xon.sh/envvars.html#prompt)

標準では$PROMPTという変数でプロンプト表示をしているようなので、下記のように更新してみる。

```xonsh
$PROMPT = 'qiita: {cwd} '
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3a7f6553-a99e-13ec-ab4c-68c7fa374cee.png)

### Basics

xonshはPythonに基づいているため、下記のようにかけるようです。

四則演算ができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/07fc8e67-4749-c81a-0d43-45e47bb862e5.png)

pythonのライブラリが使える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/2baa9676-8273-cfe6-1f3a-5367425ab565.png)

Dictionaryを使える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/b9824d7f-8096-6bbe-39ea-6eab23161b5f.png)

if文も書ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/43163fb7-8f89-c971-90f2-f1e852c56d80.png)

forなどのループもできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ccad2fbb-cd28-8e06-de42-afc0870d057c.png)

関数やクラスも定義できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/6b3c1c30-4a3e-02e4-7dd9-4cb0699e7796.png)

### shift+tabでスペース4つ入力

xonshではshift+tabでスペースを4つ入力してインデントを挿入する。

### 環境変数

環境変数も利用できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/02b6e85a-517e-4f79-8640-206e98b32a60.png)


### すべての環境変数　${...}

すべての環境変数を表示したい${...}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/fd72b375-417f-b70d-cb31-65bdc23c98ab.png)

## Name space conflicts

[Name space conflicts](https://xon.sh/platform-issues.html#name-space-conflicts)

Windows環境ではディレクトリを参照するコマンドdirとPythonの標準関数dirが競合しているため。

ディレクトリを表示したい場合は`dir .`と入力する必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/635686c7-62bd-df31-06af-77b762e3ab56.png)

## Windows上のxonshでlsなどのLinuxコマンドを利用するには

- [ls not working #3057](https://github.com/xonsh/xonsh/issues/3057)
- [Will xonsh work well as a replacement for cmd.exe on Windows? #3062](https://github.com/xonsh/xonsh/issues/3062)
- [Add cmdix as (optional?) replacement for xoreutils #3178](https://github.com/xonsh/xonsh/issues/3178)

Windows上のxonshでlsなどのLinuxコマンドを利用するには、そもそもWindows上でLinuxコマンドを実行できるようにする必要があります。

上記issueでは下記の方法について言及されていました。

- Git For Windowsでインストール時にオプションで選択できるUnixToolsを利用する
- BusyBox for Windowsを利用する
- cmdixを利用する

xonshをインストールしたからといって、Linuxライクなコマンドが利用できるようになるといった事はないので、Windows上では上記のケアが別途必要になってきます。

## xontrib

[Tutorial: Extensions (Xontribs)](https://xon.sh/tutorial_xontrib.html#loading-xontribs)

xontribはxonshの拡張機能となっており、コミュティが公開している拡張機能が存在しています。

[Awesome Xontribs](https://xonsh.github.io/awesome-xontribs/)

xontribについては、上記サイトに公開されており、デフォルトでは xontrib.coreutils が付属されていました。

[xontrib](https://xon.sh/api/_autosummary/xontribs/xontrib.html)

デフォルトで付属しているxontrib.coreutilsはいくつかのコマンドを提供しており。

ここではxontrib.coreutilsを読み込んで、提供されているcatコマンドを利用してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/21bf7b4b-13f4-0708-85cd-b12f6dc09acd.png)

上記画像ではUnixコマンドを利用できるようにケアしていないWindows環境で、まずは `cat hello.txt` を実行し、catコマンドが利用できない事を確認。

その後、coreutilsを読み込み。

再度catコマンドを実行してcoreutilsのcatコマンドを利用してc:\qiita\hello.txtに配置したテキストファイルを表示しています。

```xonsh
cat hello.txt

xontrib load coreutils

cat hello.txt
```

## 総評

Windows環境にインストールした場合、そのままではLinuxコマンドが使えないので別途準備が必要となり。

Windows環境にそのままxonshをインストールすると、考えなければならない部分が多そうです。

そうなってくるとWindows上のWSL2にxonshをインストールする方がよいのでは？　といった気もしてきますが、本記事ではWindows上に素直に導入してみました。