川獺の外部記憶

なんでも残しておく闇鍋みたいな備忘録

Windows TerminalとWSLとzshとOh My Zshでcmd.exeを卒業する(予定)

タイトルのとおりなのですが、Windowsで"イケてない"とよく言われる cmd.exe からの卒業を目指した環境設定です。

主に「充実したシェルにはあんまり興味がなかったけど、作ってみたら思っていた以上に簡単で便利じゃん」というポエム兼備忘録として書き残します。 設定手順等は先人の方々が情報を残してくれているので、細かい部分が必要でしたらググってみてください。

環境はWindows 10, 21H2です。

背景

「今更 cmd.exe から卒業かよ」という声が聞こえてきそうですが、今まで cmd.exe を使っていた理由は下記のような場合でした。

  1. シェル拡張に興味がなく、あまり充実したシェルを触ったことがなかった。 cmd.exe で必要十分に感じていた。
  2. Windowsのファイルエクスプローラから容易に起動可で、カレントディレクトリ引き継ぎが軽快。
    → 「ちょっとコマンド一つ」のときに、アドレスバーに "cmd" で手軽に立ち上げることができるのが便利。
  3. タブ切り替え型のターミナルはなんか慣れなかった。せっかくWindowsの優秀なウィンドウシステムがあるので、ウィンドウで分けて使いたい。
  4. Windows OSのネイティブシェルの動作を確認したい場合があった。
    → .batを書くときなど、動作検証用に使いたいケース

上記の 4. の場合はcmd.exeをシェルとして使うのは仕方がないケースもあるので、今回は 1. ~ 3. の解決を目指したものです。

充実したシェルの作成

上記 1. の解決のため、充実したシェルを作りました。

まず環境はWSL2で、ディストリビューションUbuntuのLTS(22)で作りました。Microsoft StoreからCanonicalの公式アプリとして配布されているので、詳説は省略。

次に、シェルをzshにしました。 aptでzshを入れて、 chsh -s $(which zsh) で標準シェルを変更ですね。
zsh入れたてでももともとのcmd.exeと比べたら好みなのですが、移行の強い動機になるかは怪しかったので、追加でデザインや機能を強化します。

まず、 "Oh My Zsh"*1 という環境*2 をインストールしました。Oh My ZshNerdフォントが必要になるので、「HackGenNerd」をインストールしておきます。他のNerdフォントでも構いません。

次に、"powerlevel10k" というテーマを適用しました。

ここまでで、WSLのシェルでgitのブランチをターミナルに表示したり、前のコマンドの実行結果(終了コードや実行時間)を表示したりと非常に便利になりました。

Windowsから軽快に切替可能なターミナルの設定

  1. , 3. の解決のため、Windoes Terminalの設定を色々変えていきます。このあたりは私が知らなかっただけで、今更な設定かもしれません。

ここまでの操作で Windows Terminal にUbuntuのプロファイルが自動で追加されていると思いますが、これは使いません。
理由としては、ここで追加されたプロファイルでは「ubuntuXXXX.exe」というランチャを間にかましてWSLが実行されるのですが、これだと別プロセスから開いたときにカレントディレクトリがうまく引き継がれませんでした。

まず最初に、wslのデフォルトに今作ったUbuntuの環境を設定しました。ここは好みでかまわないと思います。

次に、Windows Terminalのプロファイルに、下記設定したものを追加しました。

あとのプロファイル設定は適当で良いのですが、外観のフォントに前述の HackGenNerd Console を指定しました。(フォントはNerdフォントであればなんでも構いません)

プロファイルを作ったら、Windows Terminalのスタートアップ設定に今作ったプロファイルを指定しました。

続けて、Windows Terminalの全体設定で下記を設定していきます。好みと思いますので、あくまで私の設定です。

  • 新しいインスタンスの操作 「新しいウィンドウを作成する」
  • 常にタブを表示する「オフ」
  • タイトルバーを非表示にする 「オフ」

設定は以上です。

見た目など

以下のような見た目になります。

使い方は基本的にこれまで「cmd」を打っていたところを「wt」に変更するだけで、移行性も高くて結構気に入りました。

機能面では、終了コード表示は地味に嬉しく、これまでスクリプトを書くなど必要になったときに各コマンドの終了コードを調べていたのですが、日頃から意識できるようになったことで効率が上がりそうです。
また、gitのリモートがどこにあるかを表示できるのも非常に良くて、どこのリモートにpushするコミットなのかを意識しながらの操作は安全性を高めそうです。

あとはしばらく使ってみて馴染むかどうかを試してみようと思います。

以上です。

*1:zshの機能拡張には他にも色々あり、Oh My Zsh は古いという話も見かけたのですが、枯れてて良いかなと… 他に良いのもあるかもしれません。

*2:「環境」でよいのでしょうか。フレームワーク