VSCode Devcontainerでdotfilesを使いoh-my-zshを使うようにしてみた

# はじめに

Ubuntuで標準のBashは、自動補完機能があまり強力ではありません。

[oh-my-zsh](https://ohmyz.sh/)は、見た目の良さだけでなく、自動補完や過去に入力したコマンドのサジェスト機能が非常に優れており、個人的には満足して利用しています。

しかし、開発環境がコンテナ、特に[Devcontainer](https://code.visualstudio.com/docs/devcontainers/containers)の場合、多くの場合シェルがBashに戻ってしまいます。

今回は、**リポジトリのDockerfileやdevcontainer.jsonを変更することなく**、Devcontainerのシェルをoh-my-zshにする方法を試みました。この目的を達成するために、dotfilesを活用しています。

dotfilesについては、[こちら](https://qiita.com/frozenbonito/items/aa320c4b3f84b9816daa)の素晴らしい解説をご参照ください。


## dotfiles用のRepository

お試しとして、oh-my-zshをdotfilesで利用するためのリポジトリを、[こちら](https://github.com/AkihiroUeda35/zsh-dotfiles) に作成しました。

リポジトリの内容は以下の通りです。

### zsh, oh-my-zsh, プラグインをインストール

```bash
sudo apt-get install -y zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
sudo apt-get install -y bat
ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
mkdir -p "$ZSH_CUSTOM/plugins"
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-"$HOME/.oh-my-zsh/custom"}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting ${ZSH_CUSTOM:-"$HOME/.oh-my-zsh/custom"}/plugins/zsh-syntax-highlighting
git clone https://github.com/fdellwing/zsh-bat "$ZSH_CUSTOM/plugins/zsh-bat"
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
```

oh-my-zshのプラグインについては[こちら](https://qiita.com/flowernotfound/items/480f1aea319762aaf842)を参照ください。

### zshrcと[powerlevel10k](https://qiita.com/831kirimi/items/582e0abc26dbd7776d9b)の.p10k.zshをコピー

```bash
cp $script_dir/dotfiles/.zshrc ~/.zshrc
cp $script_dir/dotfiles/.p10k.zsh ~/.p10k.zsh
```

:::note info
.zshrcにはプラグインの記載が必要です。プラグイン追加のコマンドに加えてここもお気に入りの設定にしてもらえればと思います。
```
ZSH_THEME="powerlevel10k/powerlevel10k"
plugins=(git zsh-autosuggestions zsh-syntax-highlighting docker zsh-bat)
```
:::

### bashrcの設定をコピー

Dockerfileで.bashrcに環境変数が記述されている場合、Zshではそのままでは動作しません。この問題に対処するため、.bashrcから.zshrcに必要な行をコピーします。

```
if [ -f ~/.bashrc ]; then
    echo "⚙️  Converting .bashrc environment variables for zsh..."    
    echo -e "\n# Environment variables from .bashrc\n$(grep '^export ' ~/.bashrc | grep -v 'shopt\|function')\n" >> ~/.zshrc
    echo -e "\n# Aliases from .bashrc\n$(grep '^alias ' ~/.bashrc)\n" >> ~/.zshrc
    echo -e "\n# Source commands from .bashrc\n$(grep '^source ' ~/.bashrc)\n" >> ~/.zshrc
fi
```
   
## VScodeの設定

VS codeのユーザー設定の`settings.json`に、dotfilesとデフォルトのシェルを設定します。

`Ctrl + Shift + p`で、「Open User Settings (JSON)」を選ぶと`settings.json`が開くので、以下のように設定します。

```jsonc
  "dotfiles.repository": "https://github.com/AkihiroUeda35/zsh-dotfiles.git", // URL of this dotfiles repository
  "dotfiles.targetPath": "~/dotfiles", //repository will be cloned to this path
  "dotfiles.installCommand": "install.sh", // command to run after cloning the repository

   "terminal.integrated.defaultProfile.linux": "zsh", // set zsh as default shell ( if not found, bash will be used)
```

これでRepositoryをDevcontainerで開くと、Terminalがzshに変わります！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128387/f8dcf26e-a814-4b39-ba87-47b8bd006952.png)

## まとめ

dotfilesを活用することで、Devcontainerでもoh-my-zshを利用できるようになりました。

Devcontainerで開発を行っていてoh-my-zshを使いたいものの、Dockerfileやdevcontainer.jsonを変更できないといった状況の方は、ぜひこの方法を試してみてはいかがでしょうか。