fishに乗り換えてみて

私は以前、z-shellを使っていましたが、最近fishシェルに乗り換えてみました。この記事では、なぜ私がfishシェルに変更したのか、どのようにインストールしたかについて紹介したいと思います。

# fishとは
### 記述が簡潔でわかりやすい

fishシェルはコマンドの補完や色付きのプロンプトなど、使いやすい機能が豊富です。また、コマンドのオプションや引数を入力する際にも、候補がリストアップされて選択することができるため、記述が簡潔でわかりやすくなります。

### デフォルトのシェルスクリプトが使いやすい

fishシェルには、bashやzshなどの他のシェルに比べてデフォルトのシェルスクリプトがシンプルでわかりやすい特徴があります。ですがこれが仇となって未だになれていません。。

### プラグインマネージャーが豊富


fishシェルには、公式のプラグインマネージャーであるfisherがあります。このツールを使用すると、コマンドの補完やテーマの変更など、様々なプラグインを簡単にインストールできます。また、他のユーザーが作成したプラグインを共有するためのコミュニティも存在しています。

### セキュリティに配慮

fishシェルは、bashなどの他のシェルに比べて、セキュリティ面で優れた特徴があります。例えば、環境変数の自動展開を無効にするなど、セキュリティ上の問題に対処するための機能が充実しています。

## インストール
+ Ubuntu
```shell
sudo apt-get install fish
```
+ Arch
```shell
sudo pacman -S fish
```
デフォルトに設定するには
```shell
chsh -s /usr/bin/fish
```
で完了です。


## どのあたりがよかったか

`zsh-autosuggestions`や`zsh-syntax-highlighting`を用意しなくてもインストールした時点でハイライトや補完や予測は申し分ない性能があり、いちいち自分で設定しなくて良かったところが良かったです。
![Screenshot from 2023-03-15 21-13-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/5c909403-eb82-ff88-26fa-b51b89ea44a8.png)

このようにオプションすべて表示してその説明もついていたりします。

### cdが賢くなった

今まで`zsh-autosuggestions`をインストールしていると今までの`history`から予測を示してくれますが、fishは特に設定しなくてもその階層にどのようなディレクトリがあるかを把握してくれています。

具体的には![Screenshot from 2023-03-15 21-17-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/e744b28b-ad83-333d-6bb7-04b4e246e9c4.png)
このように補完が最初は出てきたとします。
その次にzshであれば
cd `workspace/rione/`
が予測として出てきてしまいます。一番新しい履歴をたどってしまうためです。

ですが、その階層にいたときに実行したコマンドの履歴をたどってくれるのでかなり精度の高い予測を行ってくれます。

![Screenshot from 2023-03-15 21-20-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/bcd626c6-8f8a-d968-b3a0-7b02d94ec224.png)

実際に`speech_and_NLP`というディレクトリは存在しているのでそのまま右矢印キーを押してEnterを押すだけで次の階層に進むことができます。

## 設定がとても楽だった。
zshを使用しているときは`PS1`をいい感じに書き換えて右プロンプトにブランチ名を表示して、、と結構`.zshrc`ファイルがややこしくて管理も面倒だったのですが、fishにしてからとても設定が楽で、
```shell
fish_config
```
と入力するだけでfishの設定をGUI上で行うことができます。
(↓あと何気に良かったのがexitコードが出てくることです)
![Screenshot from 2023-03-15 21-24-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/998d56a6-cdca-bf30-ef5d-8e2d1a2d6f34.png)
とすると自動でブラウザが立ち上がり![Screenshot from 2023-03-15 21-25-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/fd043174-da6b-6341-2a6c-fc44faa48f9f.png)

これでテーマやプロンプトを選ぶことができます。非常にかんたんで設定しやすいです。

## デメリットや不満点
最初でも書いたのですが、POSIX準拠ではなくzshやbashとコマンドが違ってきます。
ほとんど同じですが、たまに引っかかることがあります。

fishシェルでは変数を設定する場合、環境変数かローカル変数かを明示的に指定する必要があります。環境変数はset -xコマンドを使用して設定し、ローカル変数はsetコマンドを使用して設定します。

例えば、環境変数を設定する場合は以下のようになります。
```shell:fish
set -x MY_VARIABLE value
```
ローカル変数の場合は
```shell:fish
set MY_VARIABLE value
```
fishシェルでは変数名にドル記号($)をつける必要があります。例えば、環境変数を参照する場合は以下のようになります。
```shell:fish
echo $MY_VARIABLE
```
zshではグローバル変数やローカル変数に違いがなく
```shell:zsh
MY_VARIABLE=value
```
で完了です。環境変数を参照する場合も、ドル記号をつける必要はありません。
```shell:zsh
echo $MY_VARIABLE
```
呼び出すときはfishと変わりません。

あとはパスを通すのに戸惑って一苦労しています。

nvmがなかなかうまく動いてくれず、困っていますがzshでも色々あったのでそれはお互い得意不得意はあると思って使用しています。

![Screenshot from 2023-03-15 21-35-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/1c44a77d-26a4-8e4a-de05-9905a3670d96.png)

以上です。zshも極めればfishを超える性能があるかもしれませんが手軽で使いやすいシェルだったので紹介しました。

参考になれば幸いです。

## 参考文献
https://github.com/zsh-users/zsh-autosuggestions

https://github.com/zsh-users/zsh-syntax-highlighting

https://github.com/marlonrichert/zsh-autocomplete