xonshのわからなかったことと解決したこと

xonshのわからなかったことと解決したこと
===

## はじめに
最近Twitter周りでxonsh(コンシュ)についてのツイートを見ない日はないぐらい注目されてますよね
僕は流行りモノ大好きですけど，IT系の知識はそんなにないので
自分と同じノリではじめた人に困った点とその解決について共有しておければなという記事です
とりあえず自己紹介挟んで導入から書いていきます
でもそこは飛ばしてもらってもOKです　似た感じの人にxonshを紹介する時に使えるかもしれません

## 自己紹介
### 私について
Pythonを使い始めて半年と少しくらいです
Pythonの認識はWindows, Mac, Ubuntuでだいたい同じ感じに動いてくれる，
簡単便利有能な言語くらいに思っています

またbashからzshに乗り換えたのが４ヶ月前くらいです
Fishはなんか合いませんでした
のでこのシェルは三つ目ですね

### 何故Xonshを使い始めたのか
 - 導入が楽そう
 - zshに飽きた
 - 多分Windowsでも同じ感じで使えるだろう（未検証）
 - 曖昧にシェルスクリプト書くよりはマシにPythonでスクリプト書いたりalias書いたり出来るだろうという期待
みたいな感じです

使っている感じだとTensor FlowのEager Executionがシェルで動くので便利です
**シェルで人工知能できます**

## 導入
取りあえず`pip install xonsh`したら怒られました
未だにPython 2系を使っていたからです
Anacondaかなにかで3.4以上の系で環境を作ってもう一度試します
<img width="878" alt="スクリーンショット 2017-11-17 16.21.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/188946/3a6a6680-1771-9024-ad5e-55850383d339.png">

インストールが成功後，ターミナルで`xonsh`すると取り敢えず何か出てきます

<img width="491" alt="スクリーンショット 2017-11-17 16.23.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/188946/5e5a0b0e-dfc4-927d-2492-d58b8ff4fd73.png">

`xonsh tutorial`するとWeb上のチュートリアルに飛ぶらしいですが飛びませんでした（High Sierra）

<img width="808" alt="スクリーンショット 2017-11-17 16.23.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/188946/37d04734-660f-6a74-1804-17c7a81cf5be.png">

`xonsh wizard`すると色々セッティングが始まります
ここやっておくと何が既に出来上がってるのかなんとなくわかるような気がします

<img width="854" alt="スクリーンショット 2017-11-17 16.29.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/188946/332e427a-13b0-43cc-dd3b-66d138e6a052.png">

**Xontribs**
拡張機能なしのシェルってかんがえられないでしょ？xonshも拡張機能あるよ xontribsだよって感じのことが書いてあり
拡張機能が一つづつ紹介されます

これを全部答えるとYesに回答したものはpipでインストールしてくれます
exitでxonshから抜けて，元のシェルに行きます

## Xonsh 再起動

![スクリーンショット 2017-11-20 9.42.11.png](https://qiita-image-store.s3.amazonaws.com/0/188946/ed00cb83-b6c5-e143-b857-4785c25420fa.png)

### 悩み
しばらくこれに悩まされていました
入れたはずのxontribsが反映されていないみたいです
`pip install xxxx`してみるとrequired satisfiedみたいなのが出てきます

### 解決
**pipがだめでした**
conda環境以下のpipではなく，2系の元々入っていたpipを使っていました
`which pip`とかして出てきたところを`unlink /path/to/pip`
としたらどうにかなりました


## コマンド作る

.xonshrcに何かコマンドを書こう！aliasはっておこう！

```python
aliases['hello'] = hello

def hello(args, stdin):
    print('Hello', args[0])
```

### 悩み
上のコードが正常に作動しませんでした
何度`source ~/.xonshrc`しても`NameError: name 'hello' is not defined`

### 解決
zshとは違い，下で書いた関数をaliasにすることは出来ません
xonshrcはPython?ですので**先に関数を書いておく必要**がありました

## プロンプト変える
`$PROMPT={ cwd }`とかでなんとかなるようです
自分は以下のようにしています

```bash

$PROMPT='{BOLD_GREEN}{cwd}{branch_color}{curr_branch: {}}{NO_COLOR} {BOLD_BLUE}{prompt_end}{NO_COLOR} '
```

### 悩み
zshの方の設定だと`/path/to/dir`は`/p/t/dir`のようにすることが出来るのですが
xonshだとうまく行っていないです
どなたかわかる方いらっしゃいませんか

### 解決
コメントありがとうございました
https://qiita.com/hashimock/items/c9810430498043fd70eb#comment-10551242ad6b0a8b9fea

```bash

$PROMPT='{BOLD_GREEN}{short_cwd}{branch_color}{curr_branch: {}}{NO_COLOR} {BOLD_BLUE}{prompt_end}{NO_COLOR} '
```

これで解決です！

## Vimで.xonshrcを編集する

### 悩み
Vimで.xonshrcを編集するとシンタックスハイライトがつかないのがつらいです

### 解決

`/usr/share/vim/vim80/filetype.vim`を見ると，以下のように書かれています


```vim

" Python, Python Shell Startup Files
" Quixote (Python-based web framework)
au BufNewFile,BufRead *.py,*.pyw,.pythonstartup,.pythonrc,*.ptl  setf python
```

これを真似て.vimrcなどに対して，以下のように，`.xonshrc`について記すと`.xonshrc`ファイルでシンタックスハイライトが効きます

```vim

" Python, Python Shell Startup Files
" Quixote (Python-based web framework)
au BufNewFile,BufRead *.py,*.pyw,.pythonstartup,.pythonrc,*.ptl,.xonshrc  setf python
```


## 実用ネタ
<img width="264" alt="スクリーンショット 2017-12-11 20.18.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/188946/c015717a-fd6e-80fe-d62d-e12614fd5bdb.png">

Slackのステータスで自分がどこにいるか他の人に教えておきたいとかあるじゃないですか？
例えばご飯してるだったり，例えばサーバー室にいるであったり
Xonshで```slack server_2```とかやったらStatus変更できるとかあればうれしいですよね！！

```python
def slack(args):
    import requests
    import json
    emoji = ":"+args[0]+":"
    req_result = requests.post('https://slack.com/api/users.profile.set',params={
        "token":"YOUR_TOKEN",
        "profile":"{'status_emoji':'"+ emoji + "'}"
    })
    print(req_result.content)

aliases['slack'] = slack

```
これでターミナル上からSlackのステータスを変更できます！！

## クリスマス小ネタ
アドベントカレンダーなのでコマンド作ってメリークリスマスしました
<img width="883" alt="スクリーンショット 2017-12-11 20.11.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/188946/01f1cbdb-0640-91ab-c15c-f3e01446ce99.png">
コードはGistに置いておきます
https://gist.github.com/hashimock/c39fdaa7139f4647b6ef7b431893a260


## おわりに
表層的なところしか触っていない感じなので特に困るところとかありませんでした……
あと２週間くらいありますが，皆様善きクリスマスを！