xonsh
XonshDay 11

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

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

はじめに

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

自己紹介

私について

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

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

何故Xonshを使い始めたのか

  • 導入が楽そう
  • zshに飽きた
  • 多分Windowsでも同じ感じで使えるだろう(未検証)
  • 曖昧にシェルスクリプト書くよりはマシにPythonでスクリプト書いたりalias書いたり出来るだろうという期待 みたいな感じです

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

導入

取りあえずpip install xonshしたら怒られました
未だにPython 2系を使っていたからです
Anacondaかなにかで3.4以上の系で環境を作ってもう一度試します
スクリーンショット 2017-11-17 16.21.22.png

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

スクリーンショット 2017-11-17 16.23.20.png

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

スクリーンショット 2017-11-17 16.23.31.png

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

スクリーンショット 2017-11-17 16.29.39.png

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

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

Xonsh 再起動

スクリーンショット 2017-11-20 9.42.11.png

悩み

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

解決

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

コマンド作る

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

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 }とかでなんとかなるようです
自分は以下のようにしています

$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

$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を見ると,以下のように書かれています

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

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

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

実用ネタ

スクリーンショット 2017-12-11 20.18.44.png

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

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のステータスを変更できます!!

クリスマス小ネタ

アドベントカレンダーなのでコマンド作ってメリークリスマスしました
スクリーンショット 2017-12-11 20.11.49.png
コードはGistに置いておきます
https://gist.github.com/hashimock/c39fdaa7139f4647b6ef7b431893a260

おわりに

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