明日から本気だす

データベース好きなサポートエンジニアのメモです.

WSL 2 の Ubuntu 20.04 に Zsh + Prezto を導入した

TL;DR

  • ながらく oh-my-zsh を使っていたが、後継にあたる Prezto に変更した.
  • Prompt を powerline に変更した際に \uE0B0 が文字化けしており、Powerline に対応した Font をインストールする必要があった.
  • WSL v2 の Ubuntu 20.04 環境で Prezto 導入後 Tab 補完に時間がかかる事象が発生し、Windows の PATH との統合を無効化する必要があった.

環境

導入後

最終的には Prezto 導入後に Prompt を paradox に変更し見た目が(できるエンジニアっぽく?)格好良くなった ٩(ˊωˋ*)و

インストール

すでに zsh はインストール済み. Prezto レポジトリ の README に従いインストールを実施した.

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

# - .zshrc .zshenv が存在する場合は退避 
$ mv $HOME/.zshrc $HOME/.zshrc.orig
$ mv $HOME/.zshenv $HOME/.zshenv.orig

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

Prezto インストール後は $HOME に .zprofile .zpreztorc .zlogout .zlogin .zshenv .zshrcシンボリックリンクが作成され .zshrc は以下の状態となっている.

# Source Prezto.
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi

# Customize to your needs...

必要に応じて .zshrc のカスタマイズを行う. 自分の場合は、自身の Githubdotfiles レポジトリの .zshrc と差し替えた.

$ cd $HOME && unlink .zshrc
$ git clone https://github.com/hogehoge/dotfiles.git
$ ln -sf dotfiles/.zsh/.zshrc ~
# - 上記の Prezto の読み込み部分を追記する
$ vi ~/.zshrc

Prezto ではプロンプトのテーマが用意されており、好きなテーマを適用できる.

$ prompt -l                                                                           
agnoster cloud damoekri giddie kylewest minimal nicoulaj paradox peepcode powerlevel10k powerlevel9k powerline pure skwp smiley sorin steeef adam1 adam2 bart bigfade clint default elite2 elite fade fire off oliver pws redhat restore suse walters zefram
# - テーマのプレビュー
$ prompt -p
# - テーマの適用
$ prompt powerline

設定を保存する場合は .zpreztorc に以下のように記載する.

zstyle ':prezto:module:prompt' theme 'paradox'

はまったところ①

プロンプトの文字化け

試しにテーマを powerline に変更したところ、以下のような文字化けが発生した.

ネットで調べると Powerline に対応した Font のインストールが必要みたいなので、今回は白源(HackGen)を Windows にインストールした. oh-my-zsh では Powerline Font を含むテーマを使っていなかったので、気づかなかった...

白源(HackGen)を選んだ理由については、最初に参考にさせてもらったサイトの手順で HackGen を利用していたから… もし、他の Powerline に対応したフォントが必要なのであれば powerlineGithub リポジトリからダウンロードできる。

HackGen のインストール

ここから最新の ttf ファイルをダウンロードし、 HackGenConsole-Bold.ttfHackGenConsole-Regular.ttf を右クリックからインストール.

Windows Terminal で Ctrl + , を押下. settings.json が開くので、以下のように fontFace を HackGen Console に変更する.

    "profiles":
    {
        "defaults":
        {
            // Put settings here that you want to apply to all profiles.
            "fontFace" : "HackGen Console",
            "fontSize" : 9,
            "cursorShape": "underscore",
            "colorScheme": "One Half Dark",
            //透明度
            "useAcrylic": true,
            "acrylicOpacity": 0.8,
            //"scrollbarState": true,
             "historySize": 9999
        },

以下のとおり、文字化けが解消すれば OK. 念の為、echo で特殊文字が表示されることを確認しておく.

最初、Ubuntu 20.04 側の Font の問題だと思って、いろいろ無駄な Font をインストールしてしまった...

はまったところ②

Tab 補完に時間がかかる

Prezto 導入後に Tab 補完の結果出力に 10 秒ぐらいかかる事象が発生. 最初は仕様なのかと思い、無視していたが oh-my-zsh では、Tab 補完でストレスを感じたことなどなかったので、調べてみたところ 以下の issue も上がっていた.

Slow tab completion on WSL2 #1820

回避策

回避策として、Windows の PATH との統合を無効にする方法が紹介されている. 自分は .zshrc で Prezto を利用する場合は $PATH に /mnt/c/ を含めないよう追記した.

if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
  export PATH=$(echo $PATH | tr ':' '\n' | grep -v "/mnt/c/" | tr '\n' ':')
fi

Windows の PATH との統合を無効化すると、VSCode の code コマンドや docker コマンド、docker-compose コマンド(Windows 側にインストールした Docker Desktop のコマンド)が利用できなくなるので、それが困る場合は .zshrc に以下も追記する.

alias code="'/mnt/c/Program Files/Microsoft VS Code/bin/code'"
export PATH="/mnt/c/Program Files/Docker/Docker/resources/bin:$PATH"
export PATH="/mnt/c/ProgramData/DockerDesktop/version-bin:$PATH"

同じ事象について書かれた Qiita の記事 を見つけたので、そちらを参考にさせてもらった.

参考 URL

今回、参考にさせてもらった記事.