LoginSignup
6

More than 1 year has passed since last update.

WSL2のUbuntuでZsh + Preztoを導入するとTabキー補完に10秒かかった

Last updated at Posted at 2020-12-22

この記事は「株式会社オープンストリーム "小ネタ" Advent Calendar 2020」の22日目の記事です。

はじめに

WSL に zsh と Prezto を導入してターミナル環境を良くしようと思いましたが、とある条件で Tab キーの補完に 10 秒ぐらいかかるようになりました。

vi ./some-file などカレントディレクトリ以下にあるファイルを引数として渡すときは問題ないのですが、 ./sample.sh など実行権限の付いたスクリプトを起動するときに補完を使うと発生します。

高速なCPUとSSDを使っているのにこれはいけません🙅

.zshrc から Prezto を外してみると問題が起きなくなるため、Prezto が原因になっています。
"Prezto tab slow"で探してみると Prezto のプロジェクトにも Issue が立つほどです。

Slow tab completion on WSL2 · Issue #1820 · sorin-ionescu/prezto · GitHub
https://github.com/sorin-ionescu/prezto/issues/1820

環境

  • Windows 10 Home 20H2
  • Windows 10 Pro 1909

WSL2で検証しました。

Windows の PATH との統合を無効にする

「そういえばWSL側の PATH はどれくらいあるのかな…」と調べたところ「ぎゃー😱」となるような多さで表示されました。
Windows 側と使いやすくするために WSL の PATH が Windows のものと統合されています。

PATH から検索する負担を抑えるため /etc/wsl.conf に設定を追加して Windows の PATH を統合しないようにします。 Windowsのホームディレクトリにある .wslconfig ではありません。

sudo /etc/wsl.conf

設定ファイルには [interop] の記述も必要です。

/etc/wsl.conf
[interop]
appendWindowsPath = false

次にコマンドプロンプトや PowerShell といった WSL ではない端末から WSL の終了コマンドを実行して WSL を再起動させます。
経験上"Ubuntu"などとディストリビューション単位で終了させると Docker や VSCode の統合がおかしくなったことがあるので、すべてのディストリビューションに対して終了させます。

wsl --shutdown

(根本的な解決ではありませんが)WSL を再び立ち上げると Prezto を有効にしても Tab キーの補完で時間がかからなくなりました!

VSCode, Docker Desktop for Windows との統合を維持する

PATH の統合を無効にすると WSL から code コマンドで VSCode が開けなくなったり docker-compose でコンテナが立ち上がらなったり不便になります。
WSL から which コマンドを使うとわかりますが、Windows の PATH を使って Windows 側の実行ファイルを使っています。

PATH の統合を無効にしつつ、この便利さを残すには .zshrc などに PATH, エイリアスを設定しておきます。
やみくもに PATH を追加すると元通りに問題が起きるため、使うコマンドが一つの場合はエイリアスを使います。

エイリアスの時だけ"Program Files"を含むパスを '' で囲みます。
PowerShellを含むパスを PATH に追加しないとStorybookが自動でブラウザを開く処理でコケます(2020/12/30)

.zshrc
# Windows Intergration
function open() { /mnt/c/Windows/system32/cmd.exe /c start $(wslpath -w $1) }
alias explorer="/mnt/c/Windows/explorer.exe"
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"
export PATH="/mnt/c/Windows/System32/WindowsPowerShell/v1.0:$PATH" # for Storybook

これで WSL 側から Windows の VSCode を呼び出したり、Docker を操作することができました😁

ついでに macOS ユーザーで好評(?)な open コマンドを使えるようにしました。open に関しては次の記事を参考にしました。

WSL でも open コマンドを使えるようにする | R.Takakura Portfolio
https://www.iplab.cs.tsukuba.ac.jp/~takakura/blog/20200715

カスタムの open コマンドを実行するたびに(Windows の cmd.exe の仕様で)次のエラーメッセージが表示されます。
単純に cmd.exe にすると WSL のファイルが開かなくなる一方で、 wslpath を入れるこの方法だとエラーメッセージが出ながら開くのは謎です。

'\wsl\$\Ubuntu\home\yoshida-m'
上記の現在のディレクトリで CMD.EXE を開始しました。
UNC パスはサポートされません。Windows ディレクトリを既定で使用します。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6