違和感を取り除いてbashからzshに移行する

# はじめに
zsh の違和感を一歩ずつ取り除き、bash から卒業した方法を説明します。

zsh は周囲からの評判も良かったため、以前にも何度か使ったことがありました。
しかし、操作の違和感にどうしても慣れずに、毎回挫折していました。
最新 Mac OS の標準ログインシェルが zsh なったこともあり、改めて bash からの卒業を目指すことにしました。

# 移行ポリシー
* **無理せず一歩ずつ移行する**
最初から `chsh -s /bin/zsh` することはしません。
zsh な気分のときにだけ立ち上げて、少しずつ慣らしていきます。
<br>

* **キーバインドは bash に寄せる**
zsh の操作に慣れることよりも、bash のキーバインドを引き継ぐことを優先します。
仕事で本番機に bash ログインする機会があるため。
<br>

* **フレームワークは使わない**
**[oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh)** や **[Prezto](https://github.com/sorin-ionescu/prezto)** などのフレームワークやプラグインマネージャーが便利という声を聞きますが、使いません。
道具はシンプルなものが好きです。


# Step1: zsh にログインしてみる

zsh な気分になったら、次のコマンドで zsh を起動します

```
$ zsh --login
```
<br>

bash に戻りたくなったら、新しいターミナルを起動するか、次のコマンドで zsh を終了します。

```
% exit
```


# Step2: ~/.zshenv と ~/.zshrc を準備する
設定ファイルを準備しましょう。
bash のものとは、ひとまず以下の対応になると考えてください

* `~/.bash_profile` → `~/.zshenv`
* `~/.bashrc` → `~/.zshrc`

`export` や `alias` あたりの設定はそのままコピーすれば使えます。


# Step3: キーバインドを bash に寄せる
:warning: **違和感：** キーバインドが意味不明で不快。まともに操作できない
:warning: **個人事情：** bash も使う必要があるので、zsh 独自のキーバインドに慣れたくない

### bindkey は emacs モードを使用
デフォルトは emacs モードなので、ここでつまづく人は少ないと思いますが、
私が過去に挫折した最大の要因は、うっかり vim モードにしていたことでした。

vim モードだと、
`^a`(カーソルを行頭へ)、`^e`(カーソルを行末へ)、`^p`(コマンド履歴戻る)、`^n`(コマンド履歴進む) など、
bash でおなじみのキーバインドが使えなくなってしまいます。

よって、はじめは emacs モードをおすすめします。

```shell:~/.zshrc
bindkey -e
```

### zsh 独自のキーバインドを修正
bash の `^u`(カーソル位置から行頭まで削除) が zsh では行全体を削除する動作になります。

```
% bindkey -L | grep \"\^U
bindkey "^U" kill-whole-line
```

これを bash のキーバインドに合わせるには、次のようにします。

```shell:~/.zshrc
bindkey "^U" backward-kill-line
```

* 参考: [Which shortcut in Zsh does the same as Ctrl-U in Bash? - Stack Overflow](https://stackoverflow.com/questions/3483604/which-shortcut-in-zsh-does-the-same-as-ctrl-u-in-bash)
<br>

私の場合、これだけで違和感が消えました。
他に気になるものがあれば、同様に修正してください。

* 参考: [コマンドライン編集機能 Zsh Line Editor を使いこなす - Qiita](https://qiita.com/b4b4r07/items/8db0257d2e6f6b19ecb9)

# Step4: プロンプトをカスタマイズする
:warning: **違和感:** プロンプトが見づらくて、なんだかやる気が起きない。
zsh のデフォルトプロンプトが見づらくてモチベーションが上がらなかったので、先にカスタマイズしておきました。

| Before | → | After |
|--------|---|-------|
|<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18646/aeb2c4e7-0dcd-6331-b2c6-a0b78eca6e01.png">|→|<img width="450" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18646/2fee4728-3eef-37ec-855c-a51f458465c4.png">|

```shell:~/.zshrc
# prompt
autoload -Uz vcs_info
precmd() { vcs_info }
setopt prompt_subst
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{yellow} +%f"  # %c
zstyle ':vcs_info:git:*' unstagedstr "%F{green} *%f" # %u
zstyle ':vcs_info:*' formats " %F{green}(%b%u%c%F{green})%f"
zstyle ':vcs_info:*' actionformats " %F{green}(%b%u%c%F{green}|%f%F{red}%a%f%F{green})%f"
local cline=$'\n'
local p_dir="%F{blue}[%m:%~]%f "
local p_git='${vcs_info_msg_0_}'
local p_mark="%B%(?,%F{green},%F{red})>%f%b"
PROMPT="$cline$p_dir $p_git$cline$p_mark "
```

* 参考: [Git - ZshでGitを使う](https://git-scm.com/book/ja/v2/Appendix-A%3A-%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AEGit-Zsh%E3%81%A7Git%E3%82%92%E4%BD%BF%E3%81%86)
* 参考: [Zshでデキるプロンプト](https://www.slideshare.net/tetutaro/zsh-20923001)

私が bash で使っていたプロンプトとほぼ同じになりました。
この時点で、私の zsh に対する違和感はほぼ消えました。

# Step5: zsh を育てる
:rolling_eyes:  **葛藤**: わざわざ zsh に移るメリットがない気がする…。

ここまでは、操作の違和感を取り除くことに重点を置いていました。
ここからは、zsh の良さを知る・見つける段階になります。

1. 先輩たちの zshrc を探して、いろいろな設定を試す
3. 自身が使わない設定は削除する

上記を地道に繰り返して .zshrc を育てます。
<br>

* 参考: [Zsh 入門者のための超速設定ガイド - Qiita](https://qiita.com/uasi/items/c4288dd835a65eb9d709)

<br>

わからないことがあれば、公式マニュアルも参考になります。

```
> man zshoptions
```

* 参考: [zshのmanページが15個に分かれてるので解説してみる - mollifier delta blog](https://mollifier.hatenablog.com/entry/20090429/p1)

# Step6: bash との違いを把握する
:rolling_eyes: **不安**: zsh に移行してしまって、本当に大丈夫なのだろうか…。

挙動の違いは色々とあるようです。
例えば、以下の記事などが参考になると思うので、軽く目を通しておきましょう。


* 参考: [bashとzshの違い。bashからの乗り換えで気をつけるべき16の事柄](https://kanasys.com/tech/803)

# Step7: 卒業式
:cherry_blossom: **気持ちの変化**: zsh 最高！！

十分に zsh のメリットを感じられるようになったら、ログインシェルを切り替えましょう。

<br>

```
> chsh -s /bin/zsh
```

<br>

:cherry_blossom: :cherry_blossom: :cherry_blossom:  **ご卒業おめでとうございます**   :cherry_blossom: :cherry_blossom: :cherry_blossom: 
<br>
<br>