【ターミナル改造①】容易さと高機能さで、気軽に多彩環境へ変えられる「fish」を導入

- 白黒ターミナルを利用する生活が多くなってきた無機質生活に、少々彩りを加えるために奔走する記事第一弾。
- あの賢人のみが扱える、門戸が狭い「CLI日常利用」を、これから自分が経験していくことに、心配の前に、色彩不足を感じてしまう。
- 「導入が簡単で、カラフルで、イケてて・・・・」という、願望をただただ搾り尽くす、立場をわきまえない技術者。
- 今回は、そんな私でも簡単に扱えて、強力な補完等の高機能を簡単に利用できる「fish」を導入することにしよう。

## 概要
- fishとは、「シンプル」「利用者が扱いやすい」「実用性の高さ」を持ったシェル(人間とコンピュータのための対話係)環境。
- 視覚的かつ直感的に扱うことができるため、初心者や経験が浅くても、利用しやすい。
- [公式サイト](https://fishshell.com/)

## 特徴
### 強力なサジェスト機能
- 履歴や補完機能等に基づいた最適かつ強力なサジェスト(提案)機能を持つ。

### 色彩豊かなサポート
- [24ビットカラー](http://e-words.jp/w/24%E3%83%93%E3%83%83%E3%83%88%E3%82%AB%E3%83%A9%E3%83%BC.html)をサポートしているため、様々な色の形式での表示が可能。

### 視覚的な強調表示
- 構文の強調表示に加えて、誤ったコマンドにも色付けしてくれるため、間違いを減らせる。

### GUIでの確認や操作も可能
- 色彩・機能・履歴等といった設定が、ブラウザでも簡単に確認できる。

### 標準設定でも高機能
- 導入後のままのデフォルト(標準)設定でも、補完機能や強調表示等の様々な機能が扱える。

## 結果
- 下記のように、コマンドの強調表示や補完機能が利用できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/ffc6cac9-7b8a-42ba-6909-a8a815eb903b.png)

- また、誤ったコマンドの場合でも、リアルタイムで強調表示してくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/9425a4cb-1949-9553-5acc-c7412f97b048.png)

## 導入
### 環境
- Mac OS X 10.13.4
- Homebrew 2.1.0
    - <font color="tomato">※Windowsでのfish導入方法は、WSLを利用する方法があり、[詳細はこちら](https://qiita.com/kikuchi_kentaro/items/9dc441f64c17a38aad96)</font>

### インストール
- ターミナルを開き、下記のコマンドをうち、Homebrewの確認する。

```bash
# バージョン確認
$ brew -v
# バージョンが表示されなければ、下記でインストール
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 再度バージョン確認
$ brew -v
```

- 下記のコマンドをうち、fishのインストールとバージョン確認

```bash
# fishのインストール
$ brew install fish
# バージョン確認
$ fish -v

fish, version X.X.X
```

- 下記のコマンドをうち、fishのパッケージマネージャーのfisherのインストールとバージョンを確認する。

```bash
# fisherのインストール
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish

# バージョン確認
$ fisher -v
```

### 標準シェル設定変更
- ※fishをデフォルトの設定へ変更したくない人は、[こちらを参考](https://qiita.com/tak-onda/items/a90b63d9618d6b15c18c)にする。
- 下記のコマンドをうち、標準のシェル設定を開く。

```bash
# 設定ファイルを開く。パスワードが求められるので、入力する。
$ sudo vi /etc/shells
```

- 開かれたファイルの末尾に、下記を追加して保存する。

```shell:/etc/shells
/usr/local/bin/fish
```

- 下記のコマンドをうち、fishシェルへログインシェルを変更する。

```bash
# ログインシェルをfishシェルへ変更する。
$ chsh -s /usr/local/bin/fish
```

- ターミナルを再起動して、fishが動作すれば完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/a24b97e7-c5a7-9be8-f4ef-774526bba50e.png)

### 動作確認
- 下記のように、「補完設定」「誤りコマンドの強調表示」が行えたら、完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/ed1793bc-e108-bdd4-d5f9-f9611d743068.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/67a16d1a-5256-3d22-8511-3d893516883e.png)

## パスやエイリアスの設定
- ※bashrcやbash_profileにパスやエイリアスを設定していて、それを利用したい場合
- 下記のコマンドをうち、設定ファイルを作成する。

```bash
# fish設定ファイルを作成する。
$ touch ~/.config/fish/config.fish
# fish設定ファイルを開く。
$ vi ~/.config/fish/config.fish
```

- 作成した空の設定ファイルに、下記の例のように、パスやエイリアスの設定を記述する。。
    - ※aliasの設定は、bashと同じ記述で行える。

```shell:config.fish
set -x PATH $PATH:/Applications/XXXX/XXXXX/XXX
set -x PATH $HOME/.XXXXX/XXXXXX/bin:$PATH

alias ll='ls -lah'
alias opch='open -a google\ chrome'
```
- 記述して、保存後、下記のコマンドをうち、設定ファイルを読み込む

```bash
# config.fishファイルを読み込む
$ source ~/.config/fish/config.fish 
```

## GUIでの設定操作
- 下記のコマンドをうち、ブラウザで設定画面を開く。

```bash
# ローカルサーバーで設定画面が開く。
$ fish_config
```

- 下記の画面が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/064ac0a7-154f-eea1-3dda-83664d38de42.png)

- この画面で、色のショートカットキー等の設定や、履歴の確認もできる。

## プラグインの利用
- fisherというプラグイン(拡張)を利用することで、更に効率的かつ便利なターミナル環境にすることができる。

### 基本コマンド
- 下記の方式で、追加や削除、更新等を行う。

```bash
# パッケージの追加
$ fisher add パッケージ名
# パッケージの削除
$ fisher rm パッケージ名
# 全パッケージの更新
$ fisher
# インストール済みパッケージの一覧
$ fisher ls
# コマンド一覧
$ fisher -h
```

### パッケージ利用例
- ※今回は最初のチュートリアルのため、一個のみの導入とする。他おすすめパッケージは[こちらで紹介](https://qiita.com/susieyy/items/ac2133e249f252dc9a34)されています。
- 利用するパッケージは、下記。
    - 「z」 : 履歴に基づいて、パス候補を表示してくれる。あいまいな文字列でもしっかり検索できる。

- 下記のコマンドをうち、zパッケージを追加する。

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

- 導入後、下記のコマンドをうち、使用感を試してみる

```bash
# 利用履歴に基づいているため、色々試す。
$ cd ~/Desktop
$ mkdir test
$ touch ~/Desktop/test/hello.py
# 「z 文字列」のように検索する
# 下記のコマンドの後に、tabキーを押して、指定フォルダを簡単表示
$ z test
```

## まとめ
- 今回はfish shellの試用ということで、「本当に簡単にお洒落技術者気分を味わえた」と、素晴らしき高機能さは二の次で、外面を気にし続けながら記事を書く。
- 「自動で最適なコマンドを教えてくれる、先生的拡張機能あるかな」と、時代の素晴らしさに完全に甘えてしまった他人依存思考。
- 次回の更なる改造のために、「スタバ技術者を堂々観察」「泥臭調査」等に励むことにしよう。

## 参考
- https://dev.classmethod.jp/etc/fish-shell-life/  
→こちらの記事を参考にしました。大変お世話になりました。
- https://qiita.com/tak-onda/items/a90b63d9618d6b15c18c  
→シェル設定に関して参考にしました。大変お世話になりました。
- https://qiita.com/susieyy/items/ac2133e249f252dc9a34  
→プラグインに関して参考にしました。大変お世話になりました。
- https://qiita.com/kikuchi_kentaro/items/9dc441f64c17a38aad96  
→Windowsでのfish設定に関して参考にしました。大変お世話になりました。