Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

xonshにおけるxontribの紹介

- はじめに -

この記事は、Xonsh Advent Calendar 2017 - Qiita 14日目の記事です。

xonshにおけるいわゆる拡張機能であるところのxontribについて書いていきます。

「オススメXontrib!」と行きたい所ですが、そもそも2017年末時点で公開されているxontribは少ないのでほぼ全てです。

 

- xontribとは -

xontribはxonshの拡張群です。

例えばhogeパッケージをロードするには、以下Commandを入力します。

xontrib load hoge

~/.xonshrcに上記Commandを直接書くか、~/.config/xonsh/config.json内にあるxontribsという名前のlistにパッケージ名を書いておくと、xonshセッション起動時にロードされます。

現行のxontribパッケージについては、公式ドキュメントにまとまっています。
Xontribs — xonsh 0.6.0.dev151 documentation
この中にあるやつないやつで、少しだけ便利になるやつだけ紹介していきます。


 

- 補完 -

apt_tabcomplete

apt-getコマンドをtabで補完できるようにします

# 導入
pip install xonsh-apt-tabcomplete
xontrib load apt_tabcomplete

apt-getのinstall、remove、apt-cacheのsearchの補完がサポートされています。
github.com

Ubuntuなどaptを良く使う環境でxonshを使う時は入れておくと良いと思います。

 

docker-tabcomplete

dockerコマンド周りをtabで補完できるようにします

# 導入
pip install xonsh-docker-tabcomplete
xontrib load docker_tabcomplete

docker imageの補完などがxonsh上で上手くいかないのですが、こちらを導入することで解決します。
github.com

dockerで複数のコンテナを扱いながら開発している場合に便利です。

 

scrapy-tabcomplete

scrapyコマンド周りをtabで補完できるようにします

# 導入
pip install xonsh-scrapy-tabcomplete
xontrib load  scrapy_tabcomplete

scrap crawlコマンドやscrapy checkコマンドの結果のcacheから、次のコマンドを補完してくれます。

github.com

scrapyをコンソール上で使っている人(そんな人が居るかどうかは別として)には使えると思います。

 

fzf-widgets

sshコマンドの補完、historyの検索をサポートしてくれます。

公式のGIFが大体全てを説明してくれています。
https://raw.githubusercontent.com/shahinism/xontrib-fzf-widgets/master/docs/cast.gif

# 導入
pip install xontrib-fzf-widgets
xontrib load fzf-widgets

github.com

historyや補完はもともと強力なxonshですが、sshのconfigから補完は一応デフォでやってくれないので便利。

 

thefuck

コマンドを打ち間違えた時に「fuck」と入力すればコマンド候補を入力してくれるxontrib。
xonshrcの書き方の記事にもある$SUGGEST_COMMANDSをもうちょっと便利にする感じ。

# 導入
pip install xontrib-thefuck
xontrib load thefuck

xonsh記事ではないけど以下見ると大体の概要がわかります
thefuckのインストール方法 - Qiita

github.com


  

- UI -

powerline

おなじみpowerlineのサポートxontribです
見た目を色々できます

https://github.com/santagada/xontrib-powerline/raw/master/screenshot.png

# 導入
pip install xontrib-powerline
xontrib load powerline

プロンプトの右側を $PL_PROMPT、下側を $PL_TOOLBAR で設定します。
whoやbranchなどはセクションです。
pl_available_sectionsコマンドで全ての使えるセクションを表示できます。pl_build_promptコマンドで再ロードします。

$PL_PROMPT = '!'    # 使わない時
$PL_TOOLBAR = 'who>time'

xonshrcの書き方の記事でも紹介した $PROMPT も使えます。

github.com

iterm2ではpowerlineフォントが化けたり、表示が重なったりします。
その時は以下で対応できます。
iTerm2+powerline文字化け対策めも - Qiita

一回やってしまえばカッケーコンソールでxonshできます。

 

prompt-vi-mode

promptの表示に「vi-modeかどうか」を加えます。

# 導入
pip install xontrib-prompt-vi-mode
import xontrib.prompt_vi_mode

導入後は、xonshrcの書き方の記事でも出た、$PROMPTや$RIGHT_PROMPTに "{vi_mode}" もしくは "{vi_mode_not_input}"を突っ込むだけです。

こんな感じ
f:id:vaaaaaanquish:20171213175148p:plain

github.com

仕方ないですがimportなところに注意です。
私はptkのショートカットを登録してINSERTとNORMALを切り替えています。
vim開けばよくね…」と言われればそれはそう。


 

- タスク、操作 -

z

ディレクトリ移動を潤滑にするxontrib。
/home/work に行ったことがあれば $ z work とだけ入力すれば高確率で移動できる。

# 導入
pip install xontrib-z
xontrib load z

基本的にはcacheされたとこに行きます

github.com

アドベントカレンダー内の以下でも紹介されていて、zshのz.shを上手く書き換えているので一読すると吉です。
qiita.com

 

autoxsh

.autoxsh」というスクリプトファイルをディレクトリに設置しておくと、そのディレクトリにcdした時に毎回そのスクリプトが実行されるようになります。

# 導入
pip install xonsh-autoxsh
xontrib load autoxsh

初回の実行時には以下autoxshを許容し実行するかのメッセージが出るのでYesで実行

Unauthorized ".autoxsh" file found in this directory. Authorize and invoke? (y/n/ignore): y

github.com

.autoxshは普通のxonshスクリプトが記述できるので、lsコマンドの自動実行や、注意喚起のprint、envの切り替えを記入しておくと便利です。

 

schedule

スケジューラです。
コマンドにtimeオブジェクトを投げておくと、指定時間に実行したり、delayをかけて実行したりできます。

# 導入
pip install xontrib-schedule
xontrib load schedule

以下scheduleパッケージwrapperです
schedule — schedule 0.4.0 documentation

import time

def func():
    print("20秒経ちました")

schedule.when(time.time()+20).do(func)

時間指定のwhenと、遅延実行のdelayが使えます。

github.com

これに似た方法を上手く使えば「xonshrcに書いておいて最速でxonshを起動しつつ、よく使うパッケージを遅れて読み込む」なんてこともできそうです。いつかやりたい。


 

- おわりに -

その他にも、xonsh用のenvである"vox"用のxontribxonsh上でcondaを扱うためのxontrib簡易エディタxoを提供するxontribコマンドを保存していくxontrib…などが使えそうです。

voxはまだ使った事無く、anacondaは宗教上無理。エディタはvimだしな…となって今の記事に収まっています。


Githubリポジトリを見てもらえば分かりますが、xontribは数行Pythonを書けばできてしまいます。
xonshでは実際色んなイベントをデコレータを付けることでキャッチできるので、自身でxontribを作っていくのもかなり簡易だと感じます。
 

xonsh アドベントカレンダーも後半戦に入り、空きが出てきたのでなんとか登録だけでもお願いします!
後半戦のどこかでxontrib作れたらいいなと思っています。

qiita.com