この記事は「株式会社オープンストリーム "小ネタ" 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]
の記述も必要です。
[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)
# 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 ディレクトリを既定で使用します。