koh’s blog

Sys Admin who loves automation

zsh(bash)からxonshに乗り換えたい

ここ数年は手元の端末ではzshを使用していたが、最近xonshを試しています。

基本的な情報は下記。ざっくり言うとpython製のシェルです。

xon.sh

現状はxonshrcを育てたりしている最中なのですが、これまでzsh(bash)でできていたことをxonshでやろうとした際の設定をいくつかメモしておきます。

*動作環境

koh@Kohs-MacBook-Pro-M1 ~ $ sw_vers
ProductName:    macOS
ProductVersion: 11.2.1
BuildVersion:   20D74
koh@Kohs-MacBook-Pro-M1 ~ $ xonsh --version
xonsh/0.9.26
koh@Kohs-MacBook-Pro-M1 ~ $ python --version
Python 3.9.1
koh@Kohs-MacBook-Pro-M1 ~ $

直前のコマンドの戻り値 $?

$?の代わりに_.rtnでとれます。

koh@Kohs-MacBook-Pro-M1 ~ $ ls nothing
ls: nothing: No such file or directory
koh@Kohs-MacBook-Pro-M1 ~ $ echo $?
$?
koh@Kohs-MacBook-Pro-M1 ~ $ ls nothing
ls: nothing: No such file or directory
koh@Kohs-MacBook-Pro-M1 ~ $ print(_.rtn)
1
koh@Kohs-MacBook-Pro-M1 ~ $

ちなみにzshだと setopt print_exit_valueを設定すると戻り値が0以外の時に表示してくれますが、xonshだと xontrib load prompt_ret_codeするとプロンプトに表示してくれます。こちらの方が見やすい

koh@Kohs-MacBook-Pro-M1 ~ $ xontrib load prompt_ret_code
koh@Kohs-MacBook-Pro-M1 ~ $ ls nothing
ls: nothing: No such file or directory
koh@Kohs-MacBook-Pro-M1 ~ [1]$ true
koh@Kohs-MacBook-Pro-M1 ~ $

直前のコマンドの最後の引数 $_

zsh(bash)だと $_でとれたんですがxonshだととれないようです。

koh@Kohs-MacBook-Pro-M1 ~ $ echo aa bb
aa bb
koh@Kohs-MacBook-Pro-M1 ~ $ echo $_
$_
koh@Kohs-MacBook-Pro-M1 ~ $

!$は使えるようなのでこちらで代用します。
bashismというxontribが必要です。

koh@Kohs-MacBook-Pro-M1 ~ $ xontrib load bashisms
koh@Kohs-MacBook-Pro-M1 ~ $ echo aa bb
aa bb
koh@Kohs-MacBook-Pro-M1 ~ $ echo !$
bb
koh@Kohs-MacBook-Pro-M1 ~ $

sshのホスト名補完

xonshはデフォルトだと補完してくれないのでbash-completionを使用します。
bash-completionをインストールして$BASH_COMPLETIONSを適宜修正します。

brew install bash-completion2 #macの場合
$BASH_COMPLETIONS=('/opt/homebrew/share/bash-completion/bash_completion')

f:id:koh-sh:20210221231154p:plain

まとめ

bashからの乗り換え用の情報は公式がまとめていました。

xon.sh

あとはzshselect-word-styleに相当する設定を探してるのですが今のところ見つからない。
("/"などを区切り文字として認識してくれるやつ)

使っていくうちにまた何か見つけたら追記する予定。