bashからzshに移行したらコマンドの補完が強化され，入力が爆速になった話

## これは何?

普段使っているbashをzshに以降したらかなり使いやすくなったので記事にしました。↓イメージ

![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/34bc7aa3-b5ab-1770-c47e-f1f8003652e4.gif)


特に，
- fishのような補完性能の向上
- terminal入力に使うviモードが使いやすくなった
    - ビジュアル面
    - 設定面: bashだと.inputrcとかが必要だったが，zshだと.zshrcで完結する。
の2点がイチオシポイントです。

:::note warn
筆者はbashのシェルスクリプトが2番目に覚えたプログラミング言語(?)でありbashは結構好きです。そのため，bashのネガティブキャンペーンを行うのが記事の目的ではありません。
:::

---

## この記事でできるようになること

### fishのようなコマンド入力の補完を行う

tabキーを連打して補完を連打している皆様に朗報です。
zshに以降してプラグインを入れれば，**ターミナルに文字を入力するだけで補完候補がでてくるようになります**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/0e8936ca-7886-afdf-869a-125e3a5f8b51.png)

### terminalのviモードがかっこよくなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/47c5adfc-9103-4ff7-b646-dbc65bcf068e.png)
- ターミナルでノーマルモードにした時に<<<を表示することができます。そのため，vimが好きな方はzshへの移行を強くおすすめします。

> bashrcをコネコネしてもvimのモードを表示できるようにはなるのですが，**bashだと動的にターミナル変数の書き換えができない**ので，改行するなどした際に反映されるので動的な書き換えはできません。

- 細かいカスタマイズが楽
一部emacsのキーバインド(Ctrl pで履歴参照とか)したい場合にbashだと.inputrcに記載したりしていましたが，zshなら.zshrcで完結します。

---

## 動作確認済み環境
- Ubuntu22.04
    - Gnome Terminal
    - tmux
- WSL2 Ubuntu 22.04
    - Windows Terminal

---

## そもそもなぜ今更移行したのか

かなり個人的な話になってしまうのですが，私が最初にまともに触ったコンピュータが研究室にあったlinuxサーバでした。
自然科学の数値計算にはFortranが使われており，そのため，linuxサーバ内で作業することが多かったと思います。
作業の効率化のため，bashやlinuxのコマンドを勉強していたのですが，そのうち研究そのものよりもIT技術が楽しくなったので非IT系の学部からIT業界に行くことを決めました。
そのため，最初に触ったshellであるbashへの思い入れが強く，zshの存在自体はずっと知っていたもののなかなか移行に踏み切れませんでした。

ですが，1ヶ月ほど前に，ターミナルの入力モードをviにしたのをきっかけにいろいろカスタマイズがしたくなり，自然とカスタマイズ性が高いzshに移行したくなったという次第であります。

---

## おすすめのzsh設定方法

### zshのインストール

自分はUbuntuなのでaptを使って入れました。v

```shell
sudo apt install zsh
```

### oh-my-zshを入れる

zshは非常にカスタマイズ性が高いのでzshrcを自分でコネコネするのも楽しいのですが，3日くらい自前で弄った結果，[oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh)を入れるとすべてが解決することがわかり，Oh-my-zsh教団に入団しました。

インストール方法は[公式](https://github.com/ohmyzsh/ohmyzsh)通りで問題ないです。

:::note warn
既存のzshrcが上書きされてしまうのできちんとバックアップをとっておいてください。
:::

```shell
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
```

#### oh-my-zshのテーマを決める

- [テーマ一覧](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes)
- [External theme](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes)

と大量のテーマが公式から提供されており，.zshrcに一行書くだけで使えます。

カッチョイイテーマはたくさんあるんですが，自分は
- ターミナル変数は短めが好き，改行なんてしたくない
- gitのブランチ情報くらいはほしい

という感じだったので`essembeh`に落ち着きました。

```
ZSH_THEME="essembeh"
```

#### pluginを入れる

[oh-my-zshの公式プラグイン](https://github.com/ohmyzsh/ohmyzsh/tree/master/pluginsが大量にあります。

自分はコマンドが覚えられないので，以下の2つだけ入れました。
これもzshrcに記載するだけでpluginの管理ができます。

```
# Add wisely, as too many plugins slow down shell startup.
plugins=(
  git
  vi-mode
)
```
特におすすめなのが[vi-mode](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/vi-mode)というプラグインでzshでのviモードを快適なものにしてくれます。
上述したnormalモードやvisualモードでわかりやすく，<<<を表示してくれるだけでなく，viモードでも普通に使いたいemacs式のターミナルのショートカットもプラグインで設定してくれています(ctrl p,n等)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/47c5adfc-9103-4ff7-b646-dbc65bcf068e.png)

### fishのように入力補完を強化するプラグインをインストール(oh-my-zsh外部プラグイン)

[zsh-autocomplete](https://github.com/marlonrichert/zsh-autocomplete)を使うとtabを押さなくても自動で入力候補が表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/bc6c4a73-3544-0d9e-c5a7-4b28edca6d38.png)
インストール自体は完全にoh-my-zshに載っかれば良いです。

```shell  
git clone https://github.com/marlonrichert/zsh-autocomplete.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autocomplete
```

```
plugins=(
  git
  vi-mode
  zsh-autocomplete
)
```

文字を打つだけで画面がチカチカと変化して自分がキラになったかのような全能感が味わえます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/6323a36f-31c7-76b2-eb43-f6f4bbab655f.png)

もっと落ち着いた画面が好みの方はzsh-autosuggestion等を使ったほうがいいかもしれません。

---

## まとめ

- zshに移行すると補完等多大なメリットがある。
- oh-my-zshを使うと楽。

---

## 参考

[自分のdotfiles](https://github.com/RyosukeDTomita/dotfiles)が詰まったときや設定の参考になるかもしれないので置いておきます。

自分もzsh初心者なのでいろいろいい使い方とか教えていただけると幸いです。