fishはいいぞ

こんにちは．Tattsumです．

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

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

さてさて，11日目は・・・

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

# fishとはなんぞや？

the **F**riendly the **i**nteractive **sh**ell です.
初心者には優しく，他のbashやzshとは違い，カスタマイズなしでも高性能な補完機能がついてきます！
とにかく使う人に優しいShellです！

HP: [https://fishshell.com/](https://fishshell.com/)
Github: [https://github.com/fish-shell/fish-shell](https://github.com/fish-shell/fish-shell)


# Install

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

```terminal
$ 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の違い
](https://qiita.com/quzq/items/8e47414bf95d1fcfa24a)


# Use

まあ，とりあえず，使ってみましょう．

```terminal
$ fish
```

はいかわりました．

<img width="798" alt="How_To_Install__Configure_And_Use_Fish_Shell_In_Linux____2daygeek_com.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123597/0cf354f9-2e6b-3432-2c22-1c0fe99b6284.jpeg">

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

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

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

```terminal
$ which fish
chsh -s $(which fish)
```

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

# Theme

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

## Oh-my fishの導入

```terminal
$ 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の変更
デフォルト設定でもいいのですが，個人的に使いにくいところがあったので，変更します．

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

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

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

## ThemeのInstall

```terminal
$ omf install lambda
```

みんな大好きLambdaですよ〜〜〜〜〜（***ここ大切***）
はい，おっけー

# カスタマイズ
ここからはより使いやすくするための設定です．個人的には絶対にやらないと損します．開発効率が遅くなります．

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

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

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

```terminal
$ 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ですかね

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

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

```terminal
$ 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` を入れてます．

```terminal
$ fisher add edc/bass
```

これで，basｈの操作が可能となります．

```terminal
$ 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](https://qiita.com/RomuskaPaloUrLaputa)です！
NISE (南山大学 青山研究室) Advent Calendar 2019 ５日目の[初学者にとってなんだかんだVScodeは最強じゃね？って思う理由3選](https://qiita.com/RomuskaPaloUrLaputa/items/065589942eee0bc7e2a9)を書いてくれましたが，次はなにをかいてくれるのか楽しみです！