Macでbashからzshへお引越しする方法

# お断り
筆者はbashにもzshにも疎いです。そして、この記事はmacOSが対象です。
そしてそして、n番煎じの記事です(n>2)
予めご了承ください。

# 前置き
前日の[WWDC2019](https://developer.apple.com/wwdc19/)にて、 macOS Catalinaが発表されたのはこの記事を読まれている皆さんの記憶にも新しいかと思います。

ところで、macOS Catalinaからは、新規ユーザーの設定時にデフォルトのログインシェルが `bash` から `zsh` になるようです。[参考リンクはこちら](https://support.apple.com/en-ca/HT208050)

ということで、これを機に母艦であるMacにてbashからzshに **可能な限り既存の設定を引き継いで** zshに乗り換えつつ、良い感じに整えてみたので、自分が行った手順を残しておこうかと思います。
参考になれば幸いです。

# 前提環境
筆者が行った際の環境は以下の通りです。
macOS 10.14.5 (Mojave)
iTerm2 3.2.9
Homebrew 2.1.4導入済み

また、これまで`zsh`をインストールしたことがない環境への導入を行うものとして説明を行います。

# セットアップ手順
前提環境にもあるように、ここでの手順はHomebrewを導入していることを前提に手順を記します。
また、以下の説明にて実行するコマンドの先頭には`$`をつけています。

## 1. zshをインストール
`zsh`に乗り換えるので、これがないと始まりません。
Homebrew経由で`zsh`をインストールします。

```console
$ brew install zsh
```

## 2. zsh-completionをインストール
`zsh`の補完機能を強化する`zsh-completion`をインストールします。

```console
$ brew install zsh-completion
```

インストール後、設定を行うよう促される表示が出ますが、一旦無視します。

## 3. zshを起動してセットアップしてみる
おもむろに以下のコマンドで`zsh`を起動します。

```console
$ zsh
```

すると、以下のような表示が出るかもしれません。

```
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses --- 
```

この表示が出た場合、`1`をタイプします。
続けて、以下のような表示になります。

```
Please pick one of the following options:

(1)  Configure settings for history, i.e. command lines remembered
     and saved by the shell.  (Recommended.)

(2)  Configure the new completion system.  (Recommended.)

(3)  Configure how keys behave when editing command lines.  (Recommended.)

(4)  Pick some of the more common shell options.  These are simple "on"
     or "off" switches controlling the shell's features.

(0)  Exit, creating a blank ~/.zshrc file.

(a)  Abort all settings and start from scratch.  Note this will overwrite
     any settings from zsh-newuser-install already in the startup file.
     It will not alter any of your other settings, however.

(q)  Quit and do nothing else.  The function will be run again next time.
--- Type one of the keys in parentheses ---
```

この表示で、`0`をタイプします。

すると、コメントのみの`~/.zshrc`が作成されますが、これを削除します。(理由は後ほど)

```console
$ rm ~/.zshrc
```

`zsh`を起動したまま、次の手順に進みます。

## 4. Preztoをセットアップ
zshの設定フレームワークと謳っている`Prezto`をセットアップします。
[Preztoのリポジトリ](https://github.com/sorin-ionescu/prezto)のREADMEに従い、セットアップを行います。
先の手順で`zsh`は起動してありますので、README中の手順1は飛ばします。

以下のコマンドを実行します。

```console
$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

処理に時間がかかりますがしばらく待ちます。
終わったら、そのまま次のコマンドを実行します。

```console
$ setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

このコマンドにより、`Prezto`側でよしなに設定ファイルを作成してくれるようです。(先程削除した`.zshrc`も含まれます)

その後、以下のコマンドを実行します。
これで、`zsh`起動時に`zsh-completion`を読み込む準備が整います。

```console
$ echo 'fpath=(/usr/local/share/zsh-completions $fpath)' >> .zshrc
```

## 5. ログインシェルを変更する
新規タブ/ウインドウにてデフォルトで`zsh`を起動するよう、ログインシェルを`zsh`に変更します。

まず、インストールした`zsh`をログインシェルとして使用できるようにします。
`/etc/shells`をお好みのエディタで編集します。スーパーユーザでないと書き込めないため、`sudo`で実行します。

```console
$ sudo vi /etc/shells
```

以下の記述を最後の行に追記し、保存します。

```
/usr/local/bin/zsh
```

その後、以下のコマンドを実行することでログインシェルが`zsh`に変更されます。

```console
$ chsh -s /usr/local/bin/zsh
```

## 6. 設定を整える
`.bash_profile` 、 `.bashrc` を引き継ぎます。(他に設定ファイルがある場合、以下を参考によしなに引き継ぎます)
が、`.zprofile`と`.zshrc`は既にこれまでの手順でお膳立てされているので、追記する形で内容を引き継ぎます。
(ミスってここまでお膳立てした設定ファイルを失わないよう、バックアップを取るといいかもしれません。)
自分の試した範囲では、ほぼ全部引き継げていましたが、この手順の結果に関しては各自の環境に依るかと思われます。

```console
$ cat .bash_profile >> .zprofile
$ cat .bashrc >> .zshrc
```

確認のため、新規タブもしくは新規ウインドウを開きます。
先の手順でログインシェルを変更したため、`zsh`が立ち上がるかと思います。
が、もしかすると、起動時にエラーが出てきたりするかもしれません。
エラー文などを参考に、`.zshrc`、`.zprofile`等をよしなに編集し、エラーの解消に努めたりします。(完全に解消できないかもですが、環境に依りますので悪しからず...)

# 終わりに
補完機能がbashのときよりもつよく、良い感じです。
まだ使い始めたばかりなので、`zsh`を使いこなせるよう頑張ります。

間違い等あるかもしれません、その際はコメントや編集リクエストでご指摘いただければ幸いです。

# 参考リンク
作業するにあたり、以下の文献を参考にしました。
[bashからzshに移行したときのメモ](https://qiita.com/hiroyuki827/items/4e87ce517a4894f092e8)