「fish shell」を導入したら、システム開発の作業効率が改善したよ❗

私は、Mac 環境で「fish」と呼ばれるシェルを使用してシステム開発をしています。

fish は、スマートでユーザーフレンドリーなコマンドラインシェルです。

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

他にも、旧 Mac 標準の「bash」や macOS Catalina からデフォルトシェルになった「zsh」もあります。

たまに案件によって使用禁止というところもありますので、3つのシェルを使えるようにカスタマイズしています。

[zsh を Mac のデフォルトシェルとして使う](https://support.apple.com/ja-jp/HT208050)

一度「fish」を使用してみると、快適すぎて他のシェルに戻れなくなってしまいました（苦笑）

この note を読んでいるってことは、大多数がエンジニアさんだと思いますので、その魅力を少しでもお伝えできれば幸いです。


#目次
- [fish とは](https://qiita.com/digiangler/items/d961f208044913f16416#fish-%E3%81%A8%E3%81%AF)
- [事前準備](https://qiita.com/digiangler/items/d961f208044913f16416#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99)
- [fish のインストール](https://qiita.com/digiangler/items/d961f208044913f16416#fish-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- [設定](https://qiita.com/digiangler/items/d961f208044913f16416#%E8%A8%AD%E5%AE%9A)
- [ドキュメント](https://qiita.com/digiangler/items/d961f208044913f16416#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88)
- [プラグイン管理ツールのインストール](https://qiita.com/digiangler/items/d961f208044913f16416#%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- [プラグインのインストール](https://qiita.com/digiangler/items/d961f208044913f16416#%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- [その他](https://qiita.com/digiangler/items/d961f208044913f16416#%E3%81%9D%E3%81%AE%E4%BB%96)
- [プログラミング環境](https://qiita.com/digiangler/items/d961f208044913f16416#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E7%92%B0%E5%A2%83)

---

#fish とは
普通に読めば”お魚”と思いますが、**”Friendly interactive shell”**の略称だそうです。

<img width="896" alt="スクリーンショット 2020-06-17 15.15.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240597/fedefaef-8b35-5ce8-6b3e-8625bf2f7da5.png">

デフォルトで強力な機能が備わっているので、インストールしただけでも十分に活用できます。

メリットはたくさんありますが、ブレット的に書くとこんな感じ。

> 
✓ カラフルでわかりやすい（24bit カラーのサポート）
✓ シンタックスハイライトが効く
✓ ブラウザから細かな設定ができる
✓ コマンドやパスなどのオートサジェスチョン機能の搭載
✓ タブ補完ができる
✓ コマンドエラー判定がある
✓ 存在しないコマンドやディレクトリの場合は赤文字で表示される
✓ grep に 色がつく

など

実際に使用してみるのがわかりやすいので、まずはインストールしてみましょう❗

#事前準備

##Xcode：

まずは事前準備として、Xcode をインストールしましょう。

お好きな方からインストールしてください。

###App store から Xcode をインストールする場合

[Xcode](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)

###コマンドラインからインストールする場合

```
$ xcode-select --install
```

###Homebrew からインストールする場合

```
# Homebrewをインストール
＄ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Homebrewインストール完了確認
$ brew doctor
```

###Powerline フォント（お好み）

お好みになるので必須ではないですが、テーマによっては文字化けすることがあるため、私は powerline フォントをインストールしています。

ターミナルのほか、iTerm2 にもフォントを変更しております。

[powerline/fonts](https://github.com/powerline/fonts)

```
# Gitでクローン
$ git clone https://github.com/powerline/fonts.git --depth=1

# インストール
$ cd fonts
$ ./install.sh

# 要らないファイルを削除
$ cd ..
$ rm -rf fonts/
```

###iTerm2（お好み）

こちらもお好みですが、いざ乗り換えてみると細かい環境設定や便利な機能があったりと、意外と Hotkey が便利だったりします。

私のまわりでも iTerm2 を使用しているエンジニアは多いです。

詳細は、過去の note に書いていますのでご覧ください。

[コマンドラインツール「iTerm2」の環境構築をしよう❗](https://note.com/digiangler777/n/n8206e2163904)

こちらの記事も Qiita にまとめる予定です。

もうしばらくお待ちください。

ということで、iTerm2 のインストールは、上記の記事に書いていますので、今回は省きます。

iTerm2 のフォント変更は、以下になります。

「Profiles > Text > Font」を選択し、フォントを変更します。

<img width="931" alt="スクリーンショット_2019-10-08_16_00_44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240597/0b4901e4-c61f-96d0-5900-69dd7a0cb1be.png">

私の場合は、"Hack Nerd Font" を使用しています。

#fish のインストール

公式サイトからインストールしてください。

[fish shell](https://fishshell.com/)

画像の通り、インストール方法はいろいろあります。

<img width="885" alt="スクリーンショット 2020-06-17 16.01.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240597/3d489d60-0860-edc1-257d-59eef68cdf4a.png">

###Homebrew の場合

```
# インストール
$ brew install fish

# バージョンが表示されることを確認
$ fish -v
fish, version 3.1.2
```

インストール後、デフォルトシェルを変更をします。

```
$ chsh -s /usr/local/bin/fish
```

もし fish をインストールしても ”/etc/shells” に ”/usr/local/bin/fish” が追加されていない場合は、次のコマンドで追加してください。

```
$ echo /usr/local/bin/fish | sudo tee -a /etc/shells
```

設定後、シェルを再起動すると fish が起動されるようになります。

#設定

fish 上で、以下のコマンドを入力すると各種設定や履歴などが確認できるページがブラウザで表示されます。

```
$ fish_config
```

こんな感じ。

カラーバリエーションが豊富ですよね。

※ iTerm2 を使っている場合、配色の変更は iTerm2 側に依存するため反映されません。

<img width="1680" alt="スクリーンショット 2020-06-17 16.54.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240597/a486db19-17be-cb7b-d0ee-7de75d825f42.png">

デフォルトの設定でカラーやプロンプトを変更してみましょう。

プロンプトで表示する情報を増やすことで、業務効率の向上に繋がります。

プロンプトに気に入ったものがない場合は、後述するプラグインを導入してカスタマイズすることができます。

#ドキュメント

fish 上で、以下のコマンドを入力すると、本家ドキュメントがブラウザで表示されます。

```
$ help document
```

こんな感じ。

<img width="1666" alt="スクリーンショット 2020-06-17 17.02.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240597/d455162e-ff34-0673-c716-669b13a5a17e.png">

日本語のドキュメントを見たい方は、全訳！fishシェル普及計画さんのページをご覧ください。

[fish2.4日本語ドキュメント:すぐ使える25の便利機能と実例](http://fish.rubikitch.com/document-ja/)

ここまででも充分に便利ですが、更に便利にするためプラグインを導入してみましょう。

できれば、紹介しているプラグインをすべてインストールするのではなく、機能を理解したうえで自分に合ったものだけインストールするようにしましょう。

#プラグイン管理ツールのインストール

Jorge Bucaran さんが、fish 情報をまとめて下さっていますので、こちらを参考に進めてもいいと思います。

[jorgebucaran/awesome-fish](https://github.com/jorgebucaran/awesome-fish)

##Fisher：

fisher は fish のパッケージ管理ツールです。

昔は、fisherman という名前でした。

プラグイン導入に必須ですので、インストールしましょう。

[jorgebucaran/fisher](https://github.com/jorgebucaran/fisher)

###fisher のインストール

※隠れている文字もありますのですべてコピーしてね。

```
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
```

###fisher でプラグイン追加

fisher でプラグインを追加するには、次のように ”fisher add” を使用します。

```
$ fisher add <パッケージ名>
```

###ヘルプの表示

コマンドは install、update、remove、list、help のみです。

```
$ fisher help

fisher: unknown flag or command "help"
usage: fisher add <package...>     Add packages
      fisher rm  <package...>     Remove packages
      fisher                      Update all packages
      fisher ls  [<regex>]        List installed packages matching <regex>
      fisher --help               Show this help
      fisher --version            Show the current version
      fisher self-update          Update to the latest version
      fisher self-uninstall       Uninstall from your system
examples:
      fisher add jethrokuan/z rafaelrinaldi/pure
      fisher add gitlab.com/foo/bar@v2
      fisher add ~/path/to/local/pkg
      fisher add <file
      fisher rm rafaelrinaldi/pure
      fisher ls | fisher rm
      fisher ls fish-\*
```

コマンドを忘れてしまっても help さえ覚えておけば問題ないと思います。

英語も簡単なので親切ですね。

#プラグインのインストール

##〜 oh-my-fish 編 〜

###【oh-my-fish/plugin-balias】

alias の代わりに balias と書くことで、alias を補間してくれます。

エイリアスを定義した上で、なおかつ登録したエイリアスも他のコマンドと同じように補完できます。

[oh-my-fish/plugin-balias](https://github.com/oh-my-fish/plugin-balias)

####インストール

```
$ fisher add oh-my-fish/plugin-balias
```

####設定

~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。

```
$ vim ~/.config/fish/config.fish

# 例：git のエイリアスを追加する場合
# git コマンドを g で打てるように登録

# 下記を追記
balias g git
```

以上

---

###【oh-my-fish/plugin-expand】

cd を冒頭につけなくてもディレクトリ移動ができるようになります。

[oh-my-fish/plugin-expand](https://github.com/oh-my-fish/plugin-expand)

####インストール

```
$ fisher add oh-my-fish/plugin-expand
```

以上

---

###【oh-my-fish/plugin-peco】

使い勝手の良いフィルタリングツールです。

コマンドの実行履歴の絞り込みには peco、もしくは、後述の fzf のどちらか一方で良いと思います。

以下、2つの機能を提供してくれます。

- peco_kill ･･･ プロセスキル
- peco_select_history ･･･ コマンド履歴

[peco/peco](https://github.com/peco/peco)

[oh-my-fish/plugin-peco](https://github.com/oh-my-fish/plugin-peco)

####インストール

```
$ brew install peco

$ fisher add oh-my-fish/plugin-peco
```

####設定

~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。

peco_select_history と peco_kill をそれぞれキーバインド設定しています。

```
$ vim ~/.config/fish/config.fish

# 下記を追記
function fish_user_key_bindings
  bind \cr 'peco_select_history (commandline -b)' # control + R
  bind \cx\ck peco_kill # control + X からの control + K
end
```

peco を使ってヒストリーをフィルタリングできるようにしています。

```
$ vim ~/.config/fish/config.fish

# 下記を追記
function peco_select_history_order
  if test (count $argv) = 0
    set peco_flags --layout=top-down
  else
    set peco_flags --layout=bottom-up --query "$argv"
  end

  history|peco $peco_flags|read foo

  if [ $foo ]
    commandline $foo
  else
    commandline ''
  end
end

function fish_user_key_bindings
  bind /cr 'peco_select_history_order' # control + R
end
```

以上

---

###【oh-my-fish/plugin-extract】

どんな圧縮ファイルも解凍してくれる extract コマンドです。

[oh-my-fish/plugin-extract](https://github.com/oh-my-fish/plugin-extract)

####インストール

```
$ fisher add oh-my-fish/plugin-extract
```

以上

---

###【jethrokuan/fzf】

よく使うプラグインで、ファイル検索や実行コマンド検索を、あいまい検索で絞り込みができるコマンドラインツールです。

control + R で実行履歴を表示し、コマンドが選択できます。

上へ移動する場合 ･･･ control + K or ↑
下へ移動する場合 ･･･ control + J or ↓

[jethrokuan/fzf](https://github.com/jethrokuan/fzf)

####インストール

```
$ brew install fzf

$ fisher add jethrokuan/fzf
```

####設定

~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。

```
$ vim ~/.config/fish/config.fish

# 下記を追記
set -U FZF_LEGACY_KEYBINDINGS 0
set -U FZF_REVERSE_ISEARCH_OPTS "--reverse --height=100%"
```

####FZF_LEGACY_KEYBINDINGS：

新しいキーバインドを使用するのに必要

####FZF_REVERSE_ISEARCH_OPTS：

”–reverse”オプション ･･･ 入力欄をターミナル上部に表示させる
”–height”オプション ･･･ フルスクリーンで表示させる

もし、peco を設定している場合は、キーバインドが重複しないように注意ください。

以上

---

###【sijad/gitignore】

.gitignore を作成できます。

[sijad/gitignore](https://github.com/sijad/gitignore)

####インストール

```
$ fisher add sijad/gitignore
```

以上

---

###【jorgebucaran/fish-bax】

時間がかかる処理のときクルクル回るアイコンを表示されます。

[jorgebucaran/fish-bax](https://github.com/jorgebucaran/fish-bax)

####インストール

```
$ fisher add jorgebucaran/fish-bax
```

以上

---

###【jethrokuan/z】

よく使うプラグインで、過去に訪れたディレクトリを記憶・移動できるコマンドです。

スペースの後にタブで補完することができるので、ディレクトリの移動が楽になります。

z + -l でトラックしているディレクトリのリストを表示したり、z + 文字列 で履歴から移動するディレクトリの候補を表示してくれます。

[jethrokuan/z](https://github.com/jethrokuan/z)

####インストール

```
$ fisher add jethrokuan/z
```

以上

---

###【ghq】

git repository を置いているディレクトリを設定します。

ghq は、Go 言語で作成されたツールで、リポジトリを一元管理してくれるツールです。

少しややこしいので、GitHubのページをよく読んでインストールと設定をしましょう。

[decors/fish-ghq](https://github.com/decors/fish-ghq)

####インストール

```
$ brew install go

$ brew install ghq

# git repositoryを置いているディレクトリを設定
# 例：~/dev
$ git config --global ghq.root ~/dev

$ fisher add decors/fish-ghq
```

クローンしたリポジトリを一括管理できます。

ghq.root を設定することで、保存先のディレクトリを意識せず手軽にクローンできます。

```
$ ghq get <リポジトリURL>
```

clone したリポジトリは、~/.ghq/github.com で管理されているので、peco または fzf でリポジトリ一覧をフィルタリングし、選択したディレクトリに cd するようにすれば、リポジトリへの移動が非常に楽になります。

Go をインストールしたら、”~/.config/fish/config.fish” で GOPATH を設定します。

```
# Golang
set -x GOPATH $HOME/dev
set -x PATH $PATH $GOPATH/bin
```

go get を実行して ghq をインストールします。

```
$ go get github.com/motemen/ghq

$ source ~/.config/fish/config.fish
```

以降は peco または fzf で使いたい方を設定してください。

ghq + peco の設定：

~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。

```
# ghq + peco
function ghq_peco_repo
  set selected_repository (ghq list -p | peco --query "$LBUFFER")
  if [ -n "$selected_repository" ]
    cd $selected_repository
    echo " $selected_repository "
    commandline -f repaint
  end
end

# fish key bindings
function fish_user_key_bindings
  bind /cg ghq_peco_repo
end
```

####ghq + fzf の設定

fisher でプラグインを追加します。

```
$ fisher add decors/fish-ghq
```

~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。

```
# ghq + fzf
function ghq_fzf_repo -d 'Repository search'
  ghq list --full-path | fzf --reverse --height=100% | read select
  [ -n "$select" ]; and cd "$select"
  echo " $select "
  commandline -f repaint
end

# fish key bindings
function fish_user_key_bindings
  bind \cg ghq_fzf_repo
end
```

以上

---

###【hub】

GitHub に対する操作をコマンドラインから簡単に行うためのツール。

[github/hub](https://github.com/github/hub)

####インストール

```
$ brew install hub

$ hub version
git version 2.27.0
hub version 2.14.2
```

~/.config/fish/config.fish ファイルを編集して以下のように設定を追記します。

```
eval (hub alias -s)
```

以上

---

#その他

###【edc/bass】

Bash の文法を fish シェルでも使えるようにしてくれる。

[edc/bass](https://github.com/edc/bass)

####インストール

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

以上

---

###【0rax/fish-bd】

ディレクトリを遡ることができます。

$ cd ../../../ のような相対パスを打たなくてよくなります。

[0rax/fish-bd](https://github.com/0rax/fish-bd)

####インストール

```
$ fisher add 0rax/fish-bd
```

以上

---

###【yoshiori/fish-peco_select_ghq_repository】

ghq コマンドと peco の連携ができます。

ghq リポジトリ群を peco で選択して移動できる。

[yoshiori/fish-peco_select_ghq_repository](https://github.com/yoshiori/fish-peco_select_ghq_repository)

####インストール

```
$ fisher add yoshiori/fish-peco_select_ghq_repository
```

####設定

~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。

```
# yoshiori/fish-peco_select_ghq_repository
function fish_user_key_bindings
  bind \c] 'stty sane; peco_select_ghq_repository'
end
```

以上

---

###【tsu-nera/fish-peco_open_gh_repository】

ghq コマンドと peco の連携ができます。

ghq リポジトリ群を peco で選択して gh-open コマンドで開くことができます。

[tsu-nera/fish-peco_open_gh_repository](https://github.com/tsu-nera/fish-peco_open_gh_repository)

####インストール

```
$ fisher add tsu-nera/fish-peco_open_gh_repository
```

####設定

~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。

```
function fish_user_key_bindings
  bind \cx\cl peco_open_gh_repository
end
```

以上

---

###【franciscolourenco/done】

通知を表示する秒数を変更する。

[franciscolourenco/done](https://github.com/franciscolourenco/done)

####インストール

```
$ brew install terminal-notifier

$ fisher add franciscolourenco/done
```

####設定

指定した時間を超えたときに通知をするように変更するには、~/.config/fish/config.fish に __done_min_cmd_duration をセットします。

```
# デフォルトの設定であれば、実行に5秒以上掛かる場合に通知が表示されます
set -U __done_min_cmd_duration 5000  # default: 5000 ms
end
```

以上

---

#プログラミング環境

詳細は、過去の note に書いていますのでご覧ください。

[「anyenv」の環境構築をしよう❗](https://note.com/digiangler777/n/n16c2853e7287)

こちらの記事も Qiita にまとめる予定です。

もうしばらくお待ちください。

---

ちなみに、こんな感じになります。

他にもいじっているので、同じようにはなりませんが･･･

<img width="1680" alt="スクリーンショット 2020-06-21 15.55.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240597/990865da-7052-9a08-b4df-c9797b7e56c1.png">

以上です。

プラグインの内容は、過去にメモったものをまとめただけなので、もしかしたら古くなっている可能性がありますので、GitHubのページを確認しながらインストールや設定をしてください。