3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsメインの開発環境でBash / Zshっぽい操作感がほしいとき

Posted at

最近Windows前提の開発環境で作業するプロジェクトが結構あったのですがそのときにつらいのがGitを中心とするコンソール作業。Windows TerminalとPowerShellの組み合わせは昔と比べるとはるかに快適ではあるものの。MacやLinuxでバキバキにカスタムしたZshに慣れている自分としては苦行に近いものがあります。

そんなときにまず思いつくのはWSL2です。もちろん使ってます…がWindows側のドライブ (/mnt/c/...) においてあるGitレポジトリを触ると耐えがたいレベルで遅いことが発覚。WSL2はWSL2内のドライブで完結する場合は問題ないもののWindows側へのアクセスにパフォーマンス問題があるようです。

VMを利用していないWSL1なら良いかもしれませんが、すでにWSL2は別で利用しているので触りたくない、ということで第三の選択肢MSYS2を試してみました。

MSYS2とは

Windowsアプリケーションを開発するための開発環境というコンセプトだそうです。CygwinのようにPOSIX環境を完全再現することは目指しておらず、Windowsのツールセットと混ぜて使いやすいらしいです。パッケージシステムとしてはArch LinuxのようにPacmanを利用していて主要なUNIX的ツールをインストールできます。

MSYS2インストール

以降は執筆時点の最新のWindows 11の場合です。
MSYS2を普通にインストールします。最近のWindowsならWingetが最初から入っているのでPower Shellで

> winget install MSYS2.MSYS2

そのあとはMSYS2 / MSYS2をスタートメニューから開いて各種ツールをインストールします。ただし割とクセがありvimを入れてもviがaliasされないなどがある、そこは各自で直す必要がある。

$ pacman -S zsh vim ruby

.zshrcに追記する例

alias vi=vim

Windows Terminal

MSYS2のはminttyというterminalがデフォルトで付属しているのですがWindows Terminalのほうが使いやすいです。Windows Terminalの設定画面左したにOpen JSON fileというボタンがあるのでそこから設定ファイルを開き以下を追加。Zshの箇所とかフォントはお好みで。

    "profiles": 
    {
...
        "list": 
        [
            {
                "antialiasingMode": "cleartype",
                "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -msys -shell zsh",
                "font": 
                {
                    "face": "Cascadia Mono"
                },
                "guid": "{71160544-14d8-4194-af25-d05feeac7233}",
                "icon": "C:/msys64/msys2.ico",
                "name": "MSYS / MSYS2",
                "startingDirectory": "C:/msys64/home/%USERNAME%"
            },
...

Git

個人的に最重要なGitです。MSYS2のGitも(WSL2とは別のなんらかの理由により)かなり遅いです。Git For Windowsを利用しましょう。まだ入ってない場合は入れておいてください。

PowerShell

> winget install Git.Git

さて、MSYS2ではデフォルトではsymlinkを作成できないため(オプションで複数の実装、挙動でのsymlinkが利用できるようです)、 /usr/bin/git をこんなshell scriptにしたところ動作しました。

#!/usr/bin/sh

exec /c/Program\ Files/Git/bin/git.exe "$@"

MSYS2

$ chmod +x /usr/bin/git

Zshなどのプロンプトでbranch名や状態(clean / dirty)を表示している場合も問題なく動作してます。

~ $ cd /c/foo/bar/repo
repo git:(branch-name)$ 
                       ↑ has changes

余談

Git For Windows自体はMSYS2のForkであり、MSYS2にGit For Windowsをインストールする手段というものが存在するようなのですが、無保証であり、自分が試したときにはうまくビルドできませんでした。そのため普通にWindowsにインストールされたものを利用しています。

余談2

WSL2と違いVMではないのでサーバーを建ててLAN内から参照できるようにすることも簡単で、設定の変更も不要です。例えばRubyの場合、以下で指定したディレクトリ内のファイルを公開できます。

$ gem install webrick
$ ruby -run -e httpd . -p 9000
# ここでUAC的なポップアップが出るので許可

結論

MSYS2を利用することでWindowsのディレクトリ、Windowsのワークフローを利用している場合でも快適にZshを利用しつつネイティブのツールを利用することができました。他の使えそうな選択肢は試していないのでこれがベストかは不明ですがすべてが快適に動作しているのでしばらくはこの構成のまま使う予定です。

試していないやつ↓

  • WSL2からGit For Windowsを実行
  • Git Bash (Git For WindowsについてくるBash)を使う
    • MSYS2のforkであるためほぼ同じ操作感が得られそう
    • PacmanがついてこないためZshやその他の追加インストールは難しいらしい。vimとBashくらいしか使わない人はいいかも
  • WSL1とWSL2併用
    • WSL1の将来性どうなんでしょうか。WSL1ベースのWindows Subsystem for Androidは終わるし
  • Cygwin
3
0
0

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
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?