【完全版】WSL2代替!WindowsにMSYS2でLinuxライクな最強ターミナル環境を構築する手順

「WindowsでもMacやLinuxのように、zshやtmuxを使った快適なターミナル環境が欲しい」と考えたことはないでしょうか。

WSL2(Windows Subsystem for Linux)は強力ですが、メモリリソースを大量に消費したり、Windows側のファイルシステムとの連携でパーミッションエラーに悩まされたりすることがあります。一方、標準のPowerShellでは、慣れ親しんだLinuxコマンドやツールチェインがそのまま動かず、もどかしい思いをすることも多いはずです。

そこでこの記事では、「MSYS2」というツールを利用した解決策を紹介します。MSYS2を知らない方のために簡単に説明すると、Windows上に軽量なLinux風のコマンド環境を提供するシステムです。

この記事を読めば、WSL2を使わずWindowsネイティブの軽快さを保ちながら、zsh、tmux、Neovimという王道のCUI環境を構築し、AIアシスタント(Gemini CLI)まで統合した「最強のローカル開発環境」を構築できます。MSYS2に初めて触れる方でも迷わないよう、全手順を詳細に解説します。

この記事で行うこと

  • MSYS2のインストールと最新化
  • Neovim、tmux、zsh、fzfのインストール
  • Windows TerminalへのMSYS2プロファイルの統合
  • パス競合を回避したNode.jsとGemini CLIの導入
  • Oh My Zshを用いたプロンプトのカスタマイズ
  • tmuxとNeovim、Geminiを一発起動するコマンドの設定

前提条件

  • 対象OS:Windows 11またはWindows 10
  • 必要なツール:Windows Terminalがインストール済みであること

手順1:MSYS2のインストールとシステム更新

まずはベースとなる「MSYS2」をインストールし、システムを最新状態にします。

インストーラーの実行

  1. MSYS2の公式サイト(https://www.msys2.org/) へアクセスします
  2. ページ内にあるインストーラー(msys2-x86_64-xxxxxxxx.exe)をダウンロードして実行します
  3. インストール画面が進んだら、インストール先はデフォルトの C:\msys64 のまま進めるのがおすすめです
  4. インストールが完了したら「Run MSYS2 now」のチェックを入れたまま完了し、黒いターミナル画面を開きます

パッケージの更新(重要)

MSYS2では pacman というコマンドを使ってソフトを管理します。まずはシステム全体を最新化します。 開いたターミナル(またはスタートメニューから「MSYS2 MSYS」を起動)で、以下のコマンドを入力してEnterキーを押します。

pacman -Syyu

途中で Proceed with installation? [Y/n] と聞かれたら、そのままEnterキーを押すか y を入力して進めます。

注意:コアシステムの更新がある場合、途中で「ターミナルを閉じてください(To complete this update all MSYS2 processes must be closed)」という警告が出ます。その場合は右上の「×」ボタンでターミナルを一度閉じ、スタートメニューから再度「MSYS2 MSYS」を起動してから、もう一度 pacman -Syyu を実行して完走させてください。

手順2:必須ツールとNeovimのインストール

システムが最新になったら、開発に必要なコマンド群をインストールします。 引き続き「MSYS2 MSYS」のターミナル上で、以下のコマンドを順番に実行してください。

# Cコンパイラ(gcc)のインストール
pacman -S mingw-w64-ucrt-x86_64-gcc

# 基本ツール(git, curl, zsh, tmux)とfzfのインストール
pacman -S git curl zsh tmux mingw-w64-ucrt-x86_64-fzf

# Neovim(UCRT64ネイティブ版)のインストール
pacman -S mingw-w64-ucrt-x86_64-neovim

インストール時に 404 Not Found エラーが出る場合は、パッケージリストが古いことが原因です。再度 pacman -Syyu を実行してから試してください。

手順3:Windows Terminalへの統合

MSYS2の標準ターミナル(mintty)ではなく、透過背景や美しいフォントが使えるWindows Terminalに統合します。

  1. Windows Terminalを開き、「設定」> 左下の「JSON ファイルを開く」をクリックします
  2. "profiles": { "list": [ ... ] } の配列の中に、以下のMSYS2用プロファイルを追加します
{
    "name": "MSYS2 (zsh)",
    "commandline": "C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -ucrt64 -use-full-path -shell zsh",
    "icon": "C:\\msys64\\msys2.ico",
    "startingDirectory": "%USERPROFILE%",
    "font": 
    {
        "face": "HackGen Console NF"
    },
    "opacity": 90
}

ここで重要なのが -use-full-path オプションです。これを入れることで、MSYS2内からWindows側にインストールされているプログラムを直接呼び出せるようになります。

フォントと背景の透過度に関する補足:

  • HackGen Console NF はプログラミング用フォント(Nerd Fonts)の指定例です。ご自身のPCにインストールされているお好みのNerd Fonts(CaskaydiaCove Nerd Font や MesloLGS NF など)に変更してください。ターミナルやNeovimでアイコンを文字化けさせずに表示するためには、Nerd Fonts対応のフォントを指定することを強くおすすめします。
  • opacity: 90 は背景の透明度(90%)を指定しています。透明にする必要がない場合は、この行を削除して構いません。

手順4:Node.js と Gemini CLI の導入

Gemini CLIなどのAIツールを動かすためにNode.jsが必要ですが、MSYS2のパッケージマネージャ(pacman)からインストールするとパスの解釈違いでエラーが頻発します。 ここではWindows公式のNode.jsを使用するのがベストプラクティスです。

  1. Windows Terminalで「PowerShell」のタブを開き、以下を実行してNode.jsをインストールします
winget install OpenJS.NodeJS
  1. Windows Terminalを一度すべて閉じ、先ほど作った「MSYS2 (zsh)」を起動します
  2. 以下のコマンドでWindows側のNode.jsが認識されているか確認します
node -v
npm -v
  1. Gemini CLIをグローバルインストールします
npm install -g @google/gemini-cli@latest

手順5:Zshのカスタマイズ (Oh My Zsh + プラグイン)

ターミナルを使いやすくするために「Oh My Zsh」を導入します。

Oh My Zshのインストール

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

「デフォルトシェルをzshに変更するか?」と聞かれたら Y を押します。

便利プラグインのクローン

入力補完(autosuggestions)と構文ハイライト(syntax-highlighting)を導入します。

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

手順6:.zshrc の総仕上げ(プロンプト・tmux連携)

ホームディレクトリの ~/.zshrc をエディタ(nano ~/.zshrc など)で開き、以下のように設定します。 Ubuntuで使っていたような美しいプロンプトと、tmux一発起動コマンドを仕込みます。

# プラグインの有効化
plugins=(
  git
  z
  fzf
  zsh-autosuggestions
  zsh-syntax-highlighting
)

# NeovimにMSYS2内の設定フォルダを見に行かせる(WindowsのAppDataを回避)
export XDG_CONFIG_HOME="$HOME/.config"

# カスタムエイリアス
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gd='git diff'
alias gb='git branch'
alias ..='cd ..'
alias ...='cd ../..'
alias -g G='| grep'
alias -g L='| less'

bindkey "^N" history-beginning-search-forward
bindkey "^P" history-beginning-search-backward

HISTSIZE=100000

# Zsh 標準のバージョン管理情報取得機能を有効化
autoload -Uz vcs_info
setopt PROMPT_SUBST
precmd() { vcs_info }
zstyle ':vcs_info:git:*' formats ' * %b '

# プロンプトの定義(Powerlineフォント対応)
PROMPT='%K{cyan}%F{black} %n@%m %K{yellow}%F{cyan}%K{yellow}%F{black} %~ %K{red}%F{yellow}%K{red}%F{white}${vcs_info_msg_0_}%k%F{red}%f
%F{cyan}➜%f '

# tmux + Neovim + Gemini を一括起動する dev 関数
function dev() {
  if [ -n "$TMUX" ]; then
    echo "すでに tmux の中にいます!"
    return
  fi

  local session_name=$(basename "$PWD" | tr '.' '_')
  tmux has-session -t "$session_name" 2>/dev/null
  if [ $? != 0 ]; then
    tmux new-session -d -s "$session_name"
    local left_top_pane=$(tmux display-message -p -t "$session_name:0" '#{pane_id}')
    local right_pane=$(tmux split-window -h -t "$left_top_pane" -P -F '#{pane_id}')
    local left_bottom_pane=$(tmux split-window -v -t "$left_top_pane" -P -F '#{pane_id}')

    tmux send-keys -t "$left_top_pane" 'nvim $(pwd)' C-m
    tmux send-keys -t "$right_pane" 'gemini' C-m
    tmux select-pane -t "$left_top_pane"
  fi
  tmux attach -t "$session_name"
}

保存したら source ~/.zshrc を実行して設定を反映させます。

手順7:Neovim設定ファイルの配置

.zshrc に export XDG_CONFIG_HOME="$HOME/.config" を追記したことで、NeovimはLinux側と同じパスを読みに行くようになります。

mkdir -p ~/.config/nvim
nvim ~/.config/nvim/init.lua

ここに普段使用している init.lualazy.nvim の設定やキーバインド等)を配置すれば、Ubuntuと全く同じ感覚でNeovimが利用可能です。

設定例(nvim-treeの導入):

-- lazy.nvim の自動インストール
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    "git", "clone", "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath,
  })
end
vim.opt.rtp:prepend(lazypath)

-- プラグインのインストールと設定 (nvim-treeの例)
require("lazy").setup({
  {
    "nvim-tree/nvim-tree.lua",
    dependencies = { "nvim-tree/nvim-web-devicons" },
    config = function()
      require("nvim-tree").setup()
      -- Ctrl + n でツリーを開閉するキーバインド
      vim.keymap.set('n', '<C-n>', ':NvimTreeToggle<CR>', { silent = true })
    end
  }
})

うまくいかない場合の確認ポイント

  • Node.jsのパスが通らない
    MSYS2側のpacmanでインストールしたNode.jsと競合している可能性があります。pacman -Rns nodejs で削除し、Windows側(winget)でインストールしたものが node -v で呼ばれるか確認してください。
  • 404 Not Foundでインストールできない
    MSYS2のパッケージリストが古くなっています。再度 pacman -Syyu を実行して最新化してください。
  • フォントが文字化けする
    Windows Terminalの設定で指定した HackGen Console NF などのNerd FontsがWindowsにインストールされているか確認してください。

まとめ

これで、適当な作業フォルダで dev と打ち込むだけで、「左側にNeovim、右側にGemini CLI」というtmuxセッションが立ち上がり、すぐにAIバイブコーディングを開始できる最強のWindowsローカル環境が完成しました。

WSL2のメモリ消費やファイル同期の遅さに悩んでいた方は、ぜひMSYS2を使ったこのアプローチを試してみてください。

MSYS2ではなくPowerShellで同じような環境を構築する場合は以下の記事を参考にしてください。

Ubuntuで同様の環境構築をする手順は以下の記事を参考にしてください。