Zsh + Powerlevel10k + プラグインをセットアップする

# はじめに
Bashよりも強力なシェル **Zsh** と、フレームワーク **Oh My Zsh** をインストールし、テーマ **Powerlevel10k** や最低限のプラグインを導入して、デフォルトのBashの数十倍使いやすくします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/93cfb2ad-8239-c2c6-75dd-29c860e00964.png)


# 環境
これは私の環境ですが他の環境でも使えるはずです。

OS: **EndeavourOS Galileo Neo**
Kernel: **6.7.9-arch1-1-surface**
Terminal: **yakuake**


# 忙しい人用
以下の3つを順にコピペすればとりあえず使えるようになるはずです。
忙しくない人は [手順](#手順) を読んでください。

```shell:Step1 (必要なパッケージ wget, zsh, git, (Macのみ)gnu-sed をインストール)
if   command -v pkg;    then pkg update && pkg install -y wget zsh git;
elif command -v apt;    then sudo apt update && sudo apt install -y wget zsh git;
elif command -v pacman; then sudo pacman -Syu --needed wget zsh git;
elif command -v yum;    then sudo yum install -y wget zsh git;
elif command -v zypper; then sudo zypper install -y wget zsh git;
elif command -v apk;    then apk add wget zsh git;
elif command -v brew;   then brew install wget zsh git gnu-sed && alias sed=gsed;
else echo "No package manager found" >&2; fi
```
```shell:Step2 (OMZをインストール、p10kセットアップ用のzshを待機)
sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)" &&
zsh
```
```shell:Step3 (p10kとプラグインをインストール、一度exitしStep2のzshでp10kをセットアップ)
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k &&
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions &&
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting &&
sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="powerlevel10k\/powerlevel10k"/' ~/.zshrc &&
sed -i 's/plugins=(git)/plugins=(\
  zsh-autosuggestions\
  zsh-syntax-highlighting\
)/' ~/.zshrc &&
exit
```

# 手順


## ターミナルのフォントを変更
事前にターミナルのフォントを、**Nerd Fonts**を含むものに変更しておくことをおすすめします。
NerdFontがあるとこのようなアイコンをターミナル上で表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/b08a1372-1736-e8f1-e462-fd9a9f392f1a.png)

(通常のフォントの場合はただの豆腐になります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/9c3a72d7-63ad-7922-5388-b1265e11c80c.png)


私は [HackGen Console NF](https://github.com/yuru7/HackGen/releases) を愛用しています。


## Zshをインストール
まずはZshのインストールを行います。
後に使用するためGitも一緒にインストールします。

以下を参考に、自身の環境にあったコマンドを一つ実行してください。
```shell
sudo apt update && sudo apt install wget zsh git  # Debian / Ubuntu
sudo pacman -Syu --needed wget zsh git            # Arch / Manjaro / EndeavourOS
sudo yum install wget zsh git                     # RHEL / Fedora
sudo zypper install wget zsh git                  # openSUSE
apk add wget zsh git                              # Alpine
pkg update && pkg install wget zsh git            # Termux
brew install wget zsh git                         # Mac
```

Macの場合は、標準のBSD sedの代わりにGNU sedを用意しておきます。
```shell
brew install gnu-sed && alias sed=gsed
```

## Oh My Zshをインストール
Zshを起動する前に、 [Oh My Zshのページ](https://ohmyz.sh/#install) に記載されているインストールスクリプトを実行します。
```shell
sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
```
途中でデフォルトのシェルを変更するか聞かれた場合は`y`と答えます。

カラフルな`oh my zsh`の文字が表示されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/3cb2fa81-9404-3e6a-0ccb-e987012bf15c.png)


## Powerlevel10kをインストール
デフォルトのプロンプトもシンプルで美しいですが、今回はPowerlevel10kを導入してカスタマイズできるようにします。
[Powerlevel10kのREADME](https://github.com/romkatv/powerlevel10k?tab=readme-ov-file#oh-my-zsh) を参考に、リポジトリをクローンします。
```shell
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
```
```:出力
Cloning into '/home/meatwo310/.oh-my-zsh/custom/themes/powerlevel10k'...
remote: Enumerating objects: 92, done.
remote: Counting objects: 100% (92/92), done.
remote: Compressing objects: 100% (75/75), done.
remote: Total 92 (delta 18), reused 73 (delta 13), pack-reused 0
Receiving objects: 100% (92/92), 349.34 KiB | 5.21 MiB/s, done.
Resolving deltas: 100% (18/18), done.
```
`~/.zshrc`の`ZSH_THEME="robbyrussel"`を`ZSH_THEME="powerlevel10k/powerlevel10k"`に置き換えます。
```shell:直接編集する場合はこちら
nano ~/.zshrc
```
```shell:コマンド一発で済ませる場合はこちら
sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="powerlevel10k\/powerlevel10k"/'
```

テーマの設定ができたら、シェルを開き直して反映させます。


## Powerlevel10kをカスタマイズ
再度zshを起動すると、自動で設定ウィザードが開くので、環境や好みに応じて、プロンプトをカスタマイズします。

以下に私の場合のウィザード例を載せておきますが、選択肢に応じて質問は変化するので、あくまで参考程度に。

<details><summary>ウィザード例 (⚠️大量の画像を含みます)</summary>

`ダイヤモンドに見えますか?`なので`y`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/849c74e5-0045-dccd-5237-48106f164aca.png)

`鍵に見えますか?`なので`y`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/7095971e-39a8-d53c-4f0e-5351d11fbeed.png)

`上向き矢印に見えますか?`なので`n`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/9d37bbd5-589a-1c44-293e-7eb0562dad37.png)

`他のものを試してみましょう。上向き矢印に見えますか?`なので`y`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/1ac15c0e-6c5b-bec6-427d-44cafe2dff54.png)

`下向き矢印が指している数字は?`なので`1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/e473c00e-0528-8ac2-7217-d9c02cc91d3d.png)

`アイコンがバツ印の間に収まっていますか？`なので`n(アイコンがいくつかバツ印に被さっています)`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/6b868df6-554c-5adc-3e31-18982313e67d.png)

プロンプトの種類はお好みで。私は`2 Classic`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/30fa1a51-9563-d777-e8bc-3d286db9fe4e.png)

文字セットは`1 Unicode`がおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/acd85a60-17fc-d1e8-da32-5e11f6154022.png)

プロンプトの色。私は`2 Light`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/e52f6395-740f-6f7e-a04a-c0f0b17ac698.png)

現在時刻の表示。私は`n No`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/135c7a13-357b-8d47-67bc-c1747eed8e35.png)

プロンプトの区切り。私は`1 Angled`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/484f7631-0539-c092-30b3-d2399ce29aa3.png)

プロンプトの頭。私は`3 Sharp`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/6777b000-6a02-9686-c615-fef5c0c701fc.png)

プロンプトの尻尾。私は`5 Round`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/9b5e2da9-359e-d396-7a80-a612f24b5aab.png)

プロンプトの高さ。私は`2 Two lines`を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/cc2852f7-4217-372a-b04d-1c38f2ee67a3.png)

プロンプトの接続。私は`1 Disconnected`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/4ab59232-016b-22e7-97af-2f193776cd60.png)

プロンプトの枠。私は`1 No frame`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/e81918db-9f0d-ce00-3364-ebe48dadb847.png)

プロンプトの間隔。私は`2 Sparse`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/bddeb80a-eb9e-2394-5aa3-609984cfecd7.png)

アイコン。私は`2 Many icons`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/5e097d0c-d498-d5b5-880d-cdb605e24a0a.png)

プロンプトの...量? 私は`1 Concise`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/2565f4de-c8c1-81e3-fae6-e332ad7da76f.png)

コマンドを送信したあとプロンプトを消すか残しておくか。私は`y`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/486df061-39d8-8157-bf02-bdd61fdcaf4d.png)

インスタントプロンプトなる機能。`1 Verbose`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/ef02c651-ee7f-4038-dfa7-509457fcd101.png)

もしすでにコンフィグがあれば`y`で上書き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/3ce2ccb8-cecc-8661-6334-28de6d857e3b.png)

`y`で`.zshrc`に反映
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/cab8191d-bb00-4dac-0e6c-a285b80bc539.png)

完！

</details>

私はこうなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/ef006bd3-3f05-af5b-afac-9f74b3c01106.png)

設定をやり直したい場合は、`p10k configure`を実行することで、再度ウィザードを開くことができます。

ちなみに、`.zshrc`を手動で編集することで、プロンプトに表示する内容を調整できます。
気になった方はぜひ [Powerlevel10kのREADME](https://github.com/romkatv/powerlevel10k?tab=readme-ov-file#for-new-users) を読んでみてください。


## プラグインを導入する
最後に、プラグインを2つ導入します。
一つは**zsh-syntax-highlighting**で、もう一つが**zsh-autosuggestions**です。
前者は入力したコマンドをリアルタイムで色付けし、後者は過去に入力したコマンド履歴を元にした補完候補を表示します。
[zsh-syntax-highlighting/INSTALL.md](https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md#oh-my-zsh) と [zsh-autosuggestions/INSTALL.md](https://github.com/zsh-users/zsh-autosuggestions/blob/master/INSTALL.md#oh-my-zsh) に従って、それぞれのリポジトリをクローンします。
```shell
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```
```shell
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
```
`~/.zshrc`の`plugins`に`zsh-syntax-highlighting`と`zsh-autosuggestions`を追加します。
```diff_shell:~/.zshrc
  # ...
  # Add wisely, as too many plugins slow down shell startup.
- plugins=(git)
+ plugins=(
+   git
+   zsh-syntax-highlighting
+   zsh-autosuggestions
+ )
  
  source $ZSH/oh-my-zsh.sh
  # ...
```

シェルを開き直すと反映されます。
(`ech`まで打った図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/d817b7cc-b336-0698-3ed4-f9024959059e.png)

これにてセットアップ完了です。
お疲れ様でした。


# おまけ: zsh標準の補完機能について
zshは引数の補完機能が優秀です。
例えば、`cd `と打って`Tab`を一回押すと、ディレクトリの一覧が表示されます。
この状態でもう一度`Tab`を押すことでディレクトリがハイライトされ、`Enter`で選択することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/6df5b602-23b8-fa9c-7639-0ad11cb623db.png)

また、オプションの補完機能も強力です。
例えば、`ls -`と打って`Tab`を押すと、引数の一覧とともに説明が表示されます。
こちらもまた、`Tab`と`Enter`で選択することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149594/a24d9c8a-7740-7cb3-aead-50eaba4c161a.png)