fishはいいぞ


こんにちは.Tattsumです.

これはNISE (南山大学 青山研究室) Advent Calendar 2019の11日目の記事です.

昨日は,後輩の@takaakikachiが初心者に向けてモバイル開発のチュートリアルを書いてくれました!できる後輩がたくさん情報発信しているのをみるととても刺激を受けます!Flutterは自分も注目しているので,みなさんと一緒にやっていきたいです!

さてさて,11日目は・・・

最近,なにかとUbuntuを作っては壊して,また作ってと,環境構築芸人になりかけていました.特に深層学習の環境構築はとても大変です.黒い画面をただひたすら眺めていても面白いと感じる人は生粋のエンジニアしかいません.ちょっとでも楽しくするためにこのfishをつかってはいかがでしょうか??

fishとはなんぞや?

the Friendly the interactive shell です.
初心者には優しく,他のbashやzshとは違い,カスタマイズなしでも高性能な補完機能がついてきます!
とにかく使う人に優しいShellです!

HP: https://fishshell.com/
Github: https://github.com/fish-shell/fish-shell

Install

今回はUbuntu18.04を対象としています.Ubuntu16.04でも動作確認済です.ぜひ使ってみてください.

$ sudo apt-add-repository ppa:fish-shell/release-3
$ sudo apt update
$ sudo apt install fish

apt or apt-get でInstallします.どっちを使うかは宗教戦争?なのかもしれませんが,aptのほうが,良さげだとおもいます.
以下は,ご参考までに
- パッケージ管理コマンド aptとapt-getの違い

Use

まあ,とりあえず,使ってみましょう.

$ fish

はいかわりました.

かわいい.... (!これには個人差があります)

ログインシェルにするかどうかは,ぶっちゃけ個人の好みです.今までに使ってきたShellがBashやZshだとPathの記法が異なっていたり,まだ追加されていない機能とかあるんで,それらがめんどいって人はログインシェルに変更するのはおすすめしません.

それでもいいよ〜〜って人は,

$ which fish
chsh -s $(which fish)

で変更することができます.
ただ,現在のUbuntuだと,Terminalを開き直すだけでは確認することができず,一旦,ユーザのログアウトをしなければなりません.

Theme

はい,こっからより可愛く,スマートにShellちゃんを変更させていきましょう!

Oh-my fishの導入

$ apt install curl
$ curl -L https://get.oh-my.fish | fish
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish

Promptの変更

デフォルト設定でもいいのですが,個人的に使いにくいところがあったので,変更します.

$ fisher add oh-my-fish/theme-bobthefish

フォントの変更

うえのコマンドを叩くだけでいいはずなのですが,文字化けを起こしてしまうバグも確認されました.なので,フォントをかえます.

$ git clone https://github.com/powerline/fonts.git                                                
$ cd fonts/                                                                                       
$ ./install.sh 

ThemeのInstall

$ omf install lambda

みんな大好きLambdaですよ〜〜〜〜〜(ここ大切
はい,おっけー

カスタマイズ

ここからはより使いやすくするための設定です.個人的には絶対にやらないと損します.開発効率が遅くなります.

履歴検索を追加

fishは履歴からのコマンドが補完でき非常に重宝しますが一方でbashやzshで良く使う履歴検索自体はデフォルトで無いんです.
なので,pecoを入れてそちらでコマンド検索を実現します.

$ brew install peco                                                                               
$ fisher add oh-my-fish/plugin-peco                                                               

からのconfigファイルを変更します.

$ vim ~/.config/fish/config.fish   
~/.config/fish/config.fish
function fish_user_key_bindings
  bind \cr 'peco_select_history (commandline -b)'
end

これで,terminalを再起動すれば,Control-rで実現します.

ディレクトリの履歴移動

zshだとcdにpushがデフォルトで付くのでpopdを使ってディレクトリを移動します.
fishにその補完は無いのですがより便利な拡張があります.popdに相当する機能はprevdとnextdですかね

$ mkdir -p dir1/dir2 
$ cd dir1
$ cd dir2
$ pwd
/tmp/dir1/dir2
$ prevd # 戻る
$ pwd
/tmp/dir1/
$ prevd # 戻る
/tmp/
$ nextd # 進む
/tmp/dir1

popdと同じことが可能.dirhで一気に移動することもできますよ〜!!

$ dirh
 3) /tmp
 2) /tmp/dir1
 1) /tmp/dir1/dir2
    /tmp/dir1/dir2/dir3
$ prevd 3
$ pwd
/tmp

Bashとの互換

非互換一覧

fishはBashやzshのようにPOSIX互換ではないです.なので,色々仕様が違うのですが例えば以下のような差分があります.

  • 標準エラー出力のリダイレクトは^を使う
  • 変数はNAME=hogeではなくset NAME hogeを使う
  • 終了ステータスは$?ではなく$statusを使う
  • コマンド置換はcommandや$(command)ではなく(command)を使う

Bashラッパー

まあ,これは覚えようねーってところなんですが,結構,世に出回っている記事って,bashが前提になっています.それをそのまま使おうとすると,まあーだめなので,自分は bass を入れてます.

$ fisher add edc/bass

これで,bashの操作が可能となります.

$ echo $(date)
fish: $(...) is not supported. In fish, please use '(date)'.
echo $(date)
     ^
$ bass 'echo $(date)'
Sat Apr 13 22:45:05 PDT 2019

まとめ

まあ,こんな感じで自分の大切な相棒をどんどん自分好みに変更して,モチベーション高く開発していきましょう!

明日は,また,後輩の@RomuskaPaloUrLaputaです!
NISE (南山大学 青山研究室) Advent Calendar 2019 5日目の初学者にとってなんだかんだVScodeは最強じゃね?って思う理由3選を書いてくれましたが,次はなにをかいてくれるのか楽しみです!