3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

私の最強のMac開発環境 2026: Nixとmiseで育てる🐱

3
Posted at

要約

  • 2026年5月時点で運用している、Mac向けの開発環境をスナップショットとして紹介します
  • 環境の土台はNix、GUIアプリはHomebrew、プロジェクトごとの開発者ツールはmiseで分担しています
  • ツール単体の良さだけでなく、どう組み合わせて日々の開発効率を上げているかまでまとめます

はじめに

開発環境は、気が付くと少しずつ育っていくものだと思います。

私もここしばらく、ターミナル、エディタ、ウィンドウ管理、入力補助、パッケージ管理を少しずつ見直してきました。その結果、2026年5月時点で満足度の高いMac開発環境ができてきたので、ひとつのスナップショットとして紹介します。

この記事は、単なるツール一覧ではありません。

  • どのツールを使っているか
  • なぜその組み合わせにしているか
  • どうやって再現可能な状態で育てているか

この3点をまとめて書きます。

特に最近は、「全部Nixでやる」よりも、Nixとmiseの役割を分けたほうが開発しやすいと感じています。そのあたりも含めて、実運用ベースで紹介します。

対象読者

  • Macでの開発効率を上げたい人
  • ターミナル、エディタ、ウィンドウ管理をまとめて見直したい人
  • Nixやmiseに興味がある人
  • ツールをどう組み合わせているか知りたい人

環境

項目 詳細
時点 2026年5月
OS macOS 26.5
ハードウェア MacBook Pro
SoC Apple M2 Pro
メモリ 16GB

全体像

まずは全体像です。

私のMac環境は、ざっくり次のように役割を分けています。

  • Nix / Home Manager / nix-darwin: OS全体で再現したい基盤を管理する
  • Homebrew: macOSの権限まわりでNixと相性が悪いGUIアプリ本体を入れる
  • mise: プロジェクトごとに変わる開発者ツールや、アップデートが頻繁なツールを管理する

その上に、日常的に使うツールを積んでいます。

  • ターミナル: Ghostty
  • マルチプレクサ: Zellij
  • シェル: Nushell
  • 便利ツール: zoxide, bat, eza, carapace, starship
  • エディタ: Nixvim
  • ウィンドウ管理: AeroSpace + borders
  • キーボードカスタマイズ: Karabiner-Elements
  • 入力環境: Google IME + Espanso
  • ファイラ: Yazi
  • バージョン管理: Git + Jujutsu + LazyGit + LazyJJ
  • ツールチェイン管理: mise

この記事ではMac前提で話を進めます。LinuxやWindowsでも似た考え方は使えますが、今回はMacでの実践に絞ります。

WSLを活用すれば、Windowsでも再現可能な部分もあります。Windowsの皆さんもぜひ見ていってください

まず紹介したいツールたち

ここからは、日常の開発効率に効いているツールを順番に紹介します。

AeroSpace

AeroSpace は、Macでタイル型ウィンドウ管理をしたい人や、マウスによるウィンドウ操作に疑問を感じている人におすすめです。

ウィンドウを毎回手で並べる必要がなくなり、キーボードだけで移動・リサイズ・ワークスペース切り替えができます。作業のたびにウィンドウ配置へ意識を割かなくてよくなるので、体感の集中力が変わります。

私の環境では、単に導入するだけではなく、ワークスペースとアプリの対応をある程度固定しています。たとえば、以下のようなイメージです。

  • T: Ghostty
  • O: Obsidian
  • D: Discord
  • M: Music
  • B: ブラウザ系
  • 1-5: メインディスプレイの汎用作業用
  • 6-0: サブディスプレイの汎用作業用

アプリの置き場を決めておくと、「あのウィンドウどこだっけ」がかなり減ります。

私は設定をNixで生成していて、実際にはこんな形でワークスペースと app-id を対応させています。

apps.aerospace.workspaces = {
  B.appIds = [
    "app.zen-browser.zen"
    "company.thebrowser.dia"
  ];
  D.appIds = [ "com.hnc.Discord" ];
  O.appIds = [ "md.obsidian" ];
  T.appIds = [ "com.mitchellh.ghostty" ];
  M.appIds = [ "com.apple.Music" ];
};

borders

borders は、アクティブウィンドウの外周を強調表示してくれるツールです。私の環境では AeroSpace とセットで使っています。

Macは、ウィンドウが多くなると「今どこにフォーカスがあるか」が一瞬分かりにくくなることがあります。特にタイル型で運用していると、境界線があるだけで視線移動がかなり楽になります。

私は AeroSpace の after-startup-command から起動していて、アクティブ時と非アクティブ時で色を変えています。AeroSpace単体でも十分便利ですが、borders を足すと見た目以上に実用的です。

Homebrew の式名は borders ですが、プロジェクト名は JankyBorders です。AeroSpace や yabai の周辺でよく使われる定番ツールです。

Ghostty

Ghostty は、今のところ気に入っているターミナルです。おしゃれさで選んでいる節はあります。

まあ、正直別のターミナルでも全然良いですが、Alacritty、WezTermなどとくらべて、軽快で、ほどよくリッチで、見た目もよく、キーバインド周りも扱いやすいです。Macで日常使いするターミナルとしてかなりバランスが良いと感じています。

私はターミナル本体をHomebrewで管理しつつ、設定ファイルはNixから配る形にしています。こうしておくと、アプリのインストール事情と設定管理を分離できます。

Zellij

Zellij は、ターミナルマルチプレクサです。

tmuxほど構えずに使いやすく、現在のAIエージェント開発時代のような、セッションを張りっぱなしにする運用と相性が良いです。ターミナルを複数開くより、まずZellijの中で整理するほうが、作業の文脈を保ちやすいと感じています。

特に気に入っているのは、Zellij公式でも案内されている Unlock-First (non-colliding) プリセット です。普段は locked モードにしておき、必要なときだけ Ctrl-g でアンロックして pane や tab の操作に入ります。

これが結構良くて、普段のシェル入力やCLIツール操作を邪魔しません。tmux系の prefix を常に意識する感覚より、通常時は完全に作業へ集中できます。キーバインド衝突を避けたいユーザー向けの正式なプリセットなので、Vim系やCLI中心の運用と相性が良いです。

一度Zellij側で設定してから、Nixに持っていきました。

あと、テーマカラー変えるとワクワクしてよいです。デフォルトの無骨な緑はあんまり好きじゃありませんでした…。

image.png

コレは "gruvbox-dark" というテーマカラーです。

Nushell

Nushell は、クロスプラットフォームなPOSIX互換ではないシェルです。AI時代、WindowsでもMacでも同じコマンドで動くことは大切だと思っていて、今後来るシェルだと勝手に思ってます。

モダンな再設計されたコマンド群、見やすさ、データ指向の操作など、地味ですが毎日効く改善が多いです。私はここに zoxidestarshipcarapacemise、必要に応じて direnv を組み合わせています。

zoxide は、よく使うディレクトリへの移動を高速化するツールです。cd を賢くしたような感覚で使えます。

starship は、シェルプロンプトを見やすく整理してくれるツールです。Git状態やランタイム情報が自然に目に入るようになります。

carapace は、CLI補完をまとめて強化するツールです。細かい入力ミスやオプション確認の回数を減らしてくれます。

mise は、言語処理系やCLIのバージョン管理ツールです。複数の開発ツールを1つの仕組みで揃えられるのが便利です。

direnv は、ディレクトリに入ったときだけ環境変数やツールチェインを切り替えたい場面で便利です。ただ、私の運用では常用というより、依存が深いプロジェクトで必要なときに採用する寄りです。

Nixvim

私はNeovimを Nixvim で管理しています。

良いのは、再現可能な状態で維持できることです。プラグインやオプション、Neovim自体のバージョンまでNix側で持てるので、新しいマシンでも同じ環境を再現できます。Neovimでありがちな、作業のための作業を人生で一度だけ行えば良くなります。もちろん、継続的な改善で時間は取られていますが…。

最近の私の用途だと、特に Snacks.nvim を活用しています。

  • file picker
  • grep
  • explorer
  • terminal
  • diagnostics
  • LazyGit 呼び出し

このあたりが軽快でモダンなUIなので、重たいIDEを開かずに済む場面が多いです。

特に Codex のようなCLIエージェントを使う開発では、エディタが主役というより、ターミナル中心で流れるほうが気持ち良いと感じています。重量級のIDEのプロジェクトモデルに作業を寄せるより、ターミナル、Zellij、Neovim、CLIツールが素直につながる構成のほうが今の自分には合っています。

Yazi

Yazi は、CLI中心の作業と相性が良いファイラです。

ripgrepfd などと組み合わせると、ファイル探索やプレビューがかなり快適になります。GUIファイラが悪いというより、開発中はキーボードから離れずに済む恩恵が大きいです。

私はYaziを単体で使うだけでなく、Nixvimにも組み込んでいます。ファイル位置やカレントディレクトリから Yazi を開けるので、エディタとファイラの往復も滑らかです。

Karabiner-Elements

Karabiner-Elements は、Macのキーボード体験を根本から変えられるツールです。

私の環境では、英数・かなキーをレイヤーとして使い、入力モード切り替えとショートカット操作の両方を扱えるようにしています。単なるリマップではなく、「手の移動を減らすための設計」として効いています。

このKarabinerのマッピング自体も設定ファイルとして管理しています。複雑なルールをコードとして持てるので、キーボードカスタマイズも再現しやすいです。

Google IME + Espanso

入力体験という意味では、Google 日本語入力と Espanso の組み合わせがかなり強いです。

Google 日本語入力で日本語変換を快適にしつつ、Espansoで定型文・記号・コマンド断片を補います。この役割分担がかなりしっくり来ています。

Espanso は、単なるスニペット展開より広く効きます。たとえば、以下のようなものを展開しています。

  • 日付やISO形式の日時
  • Markdownのコードブロック
  • Git commitメッセージの雛形
  • よく使うファイル名
  • AIへの指示文
  • 遠い配置の記号

記号系は地味ですが、毎日効きます。私の設定だと、たとえばこうです。

- trigger: ";;"
  replace: "_"
- trigger: ";-"
  replace: "|"
- trigger: ";."
  replace: "/"
- regex: ";cb(?P<lang>\\w*) "
  replace: "```{{lang}}\n{{clipboard}}\n```"

_|/ のような記号を、手の遠い位置まで取りに行かずに済むのは思った以上に快適です。さらに、コードブロック展開やコミット文雛形まで揃えておくと、開発以外の文章入力も速くなります。

Git + Jujutsu + LazyGit + LazyJJ

Gitは当然使いますが、最近は Jujutsu も使うようにしています。

Gitの上に乗せる形で扱えるので導入しやすく、履歴編集や作業途中の整理がしやすいです。そこに LazyGitLazyJJ を組み合わせると、CLIでもエディタ内でも操作しやすくなります。

「履歴をきれいに保ちたいが、操作が重いのは嫌だ」という人にはかなり良い組み合わせだと思います。

Nixとmiseの役割分担がしっくり来ている

この記事で一番共有したいのはここです。

私はNixが好きですが、全部をNixで管理するのが最適だとは思っていません。

今のところ、次の分担がよさそうです。

Nixが担当するもの

Nixでは、Mac全体で再現したい基盤を管理しています。

  • シェル
  • エディタ
  • CLIツール
  • 設定ファイル配布
  • macOSのシステム設定の一部
  • Homebrewとの接続部分

要するに、「このMacで開発するなら、これであってほしい」土台をNixで固めています。

Homebrewが担当するもの

一方で、macOSでは権限周りの都合があります。

その中心にあるのが TCC です。TCC は macOS のプライバシー・権限管理の仕組みで、アクセシビリティ、入力監視、画面収録などの許可を扱います。

ここでNixと少し相性が悪いことがあります。Nixは同じアプリでもバージョン違いごとに別パスへ配置します。たとえば /nix/store/...-ghostty-1.2.3/.../nix/store/...-ghostty-1.2.4/... は別物です。

そして、TCCはアプリや実行ファイルをある程度パス単位で見ています。つまり、バージョン更新で実体パスが変わると、権限の再許可や挙動差分が発生しやすいです。

そのため、以下のようなGUIアプリ本体はHomebrewで入れています。

  • AeroSpace
  • Ghostty
  • Karabiner-Elements
  • Espanso

ただし、設定ファイルはNixから配るようにしています。

この分離をすると、Macで現実的に運用しやすいです。アプリ本体の事情と設定の再現性を分けて考えられるからです。

「何でもNixに寄せる」より、「どこまでNixに寄せると運用が楽か」を考えたほうが、長く使える構成になりやすいと感じています。

miseが担当するもの

そして、プロジェクトごとに変わる開発者ツールはmiseに寄せています。

開発者ツールは更新頻度が高く、プロジェクトごとの差も大きく、Nixで厳密に閉じなくても十分なことが多いです。むしろ、そこまで全部Nixで面倒を見ると、変化への追従が重くなる場面があります。

そのため、私は以下のようなものをmiseで管理することが多いです。

  • Node.js
  • aube
  • uv
  • Java
  • Go
  • Codexのような更新頻度が高いツール
  • just や lefthook などの DevOps系ツール

特に、Flakesで inputs を増やしすぎると運用が重くなりがちです。

  • バージョン更新のたびに inputs を上げる手間がある
  • lock の差分が大きくなりやすい
  • キャッシュに当たりにくい input を増やすとビルドがつらい

もちろん Flakes は強力ですが、日々更新されるCLIや言語処理系まで全部そこへ寄せると、気軽さが落ちると感じています。

その点、miseは対応範囲が広く、導入が軽く、必要なツールだけを素直に管理できます。私の運用では、direnv と密接に組み合わせるというより、ほとんどは mise 単体で十分です。依存が深いプロジェクトだけ direnv を追加するくらいがちょうど良いです。

つまり、今の私の感覚ではこうです。

  • Nix: 土台を安定して再現する
  • mise: プロジェクト単位の道具を素早く切り替える

この分担にしてから、「環境はちゃんと管理したいが、変化には重くなりたくない」という悩みがかなり減りました。

どうやって再現しているか

ここまで紹介した環境は、リポジトリとして管理しています。

構成としては、ざっくり次の2層です。

  • core: 再利用しやすい共通設定
  • dotfiles: 実際にこのMacへ適用するための設定

coredotfiles を分けている

共通化しやすいものは core に置いています。

  • Nushell
  • Nixvim
  • AeroSpaceの基本構成
  • Ghostty
  • Karabiner
  • Espanso
  • Yazi
  • Git / Jujutsu
  • Zellij

一方で、このMac固有の差分や個人設定は dotfiles 側に置いています。

  • 実際のホスト構成
  • ユーザー情報
  • ワークスペースごとの追加ルール
  • 個人用の展開文字列
  • Homebrewの追加パッケージ

この分離にしておくと、設定が増えても見通しを保ちやすいです。

coreConfig で個人差分を流し込む

実際には、consumer側から coreConfig という形で差分を流し込んでいます。

たとえば、以下のようなものです。

{
  system = {
    desktop = true;
    fonts = true;
    devLevel = 2;
    extended = true;
  };

  apps.aerospace.workspaces.B.appIds = [
    "app.zen-browser.zen"
    "company.thebrowser.dia"
  ];

  shell.nushell.shellAliases = {
    cx = "codex";
  };
}

この方式にすると、共通部は共通部として保ちながら、実利用マシンの差分だけを素直に書けます。

日常で特に効いている運用

ツール単体の紹介より、組み合わせてどう効いているかのほうが実際には重要です。

今の環境で特に効いているのは次の3つです。

1. AeroSpaceで作業場所を固定する

アプリの置き場をある程度固定すると、視線も思考も散りにくくなります。

  • Terminalは T
  • ブラウザは B
  • Obsidianは O
  • Discordは D

2. miseでプロジェクトごとの道具を切り替える

プロジェクトごとのツールはmiseに寄せているので、Mac全体の設定と、各リポジトリで必要な道具を切り分けやすいです。

「このリポジトリではNodeのこの版、このリポジトリではPythonとuv、このリポジトリではJavaも必要」といった差分を、Flakesのinput追加や大きなlock更新なしで扱えます。

3. Google IME + Espansoで入力の摩擦を消す

コードを書く時間だけが開発ではありません。Issueを書く、PRを書く、AIに依頼する、コミットを書く、日付を書く、ファイル名を書く。そういう細かい入力の効率化の積み重ねが、開発速度にじわじわ効きます。

まとめ

2026年5月時点の私のMac開発環境は、次の3層で成り立っています。

  • Nixで土台を再現可能にする
  • HomebrewでMac固有のGUIアプリ本体を扱う
  • miseでプロジェクトごとの開発者ツールを柔軟に管理する

そして、その上で AeroSpace、borders、Ghostty、Zellij、Nixvim、Karabiner、Google IME、Espanso、Yazi、Jujutsu などを組み合わせています。

特に、全部を1つの仕組みに押し込めるのではなく、Nixとmiseを役割分担させたことで、再現性と身軽さのバランスが取りやすくなりました。

Macでの開発環境を見直したい方は、全部を一気に変えなくてもよいので、まずは気になったところから試してみてください。AeroSpace、borders、Espanso のように、導入直後から効果を実感しやすいものも多いです。

参考

3
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?