Open31

Mac 環境構築2026

mizchimizchi

新しいMacマシンを手に入れた時は環境を引き継がずにゼロから環境を育てつつ、色々と試したい。
しばらくメインがデスクトップの Win/WSL2 だったので、色々刷新したい。

2023年版
https://zenn.dev/mizchi/scraps/8969fe29a27e21

新しく試したいものリスト

継続して採用

  • zsh
    • パッケージマネージャどうしよう
  • mise
  • homebrew
  • eza
  • starship
  • vscode
  • uv
  • ty
  • jj
julian45julian45

ff外の上に日本語は私の第二言語なので失礼しますが、いくつかのお勧めしたいものがあります。

zsh

zsh

  • パッケージマネージャどうしよう

パッケージやテーマの問題ならZim Framework aka zimfwをお勧めします!コマンドの実行やターミナル起動が速くて使いやすいと思います。
私のdotfilesには既にchezmoiとzimfwを一緒に使っています。リポジトリへのリンクは以下:
https://github.com/julian45/dotfiles
実はzshrcはリポジトリの最古のコミットより古くてほぼ無視しては大丈夫けど、以下の部分はzimfwの活用のために大事:
https://github.com/julian45/dotfiles/blob/main/dot_zshrc#L1-L14

そして、zimrcの内容はzshで使いたいこと次第ですが、作り方は取扱説明書のコマンド部分にて書いてあります。

履歴管理

何かしらの履歴管理

今のデバイスだけの場合にはmcflyをお勧めします。
https://github.com/cantino/mcfly
全てのデバイスを一緒にシンクロして管理したい場合にはatuinが役に立てるかもしれません。
https://github.com/atuinsh/atuin
*私は現在、atuinのようなツールは必要ありませんが、友達はatuinを長い間に使っていて私に勧められたのでここに置いておきます。

mizchimizchi

ありがとうございます。
zimfw 面白そうなので調べてみます!

mizchimizchi

変な手グセがつく前に、IME周りからセットアップしていきたい。

IME

最速でDvorak を有効化する。

Karabiner Elements でCmd左を英数、Cmd右をかなに割り当てる。
azookey 試した。 現状、Dvorak が使えないので後回し。最新版をビルドすればいけるらしい。
=> 最新ビルド動いたので採用。かなり良い。

Raycast

設定の入力ソースからCtrl-Spaceを無効化して、Ctrl-Space をRaycastに当てる。

初期化時、
Settings - Advanced - Auto Switch Input Source で Dvorak にしておく
https://phys-edu.net/wp/?p=42562

プラグインで入力からの翻訳やAI周りを有効にしたいが...あとで


Terminal

基本VSCode Terminal を採用してるが、最近Claude Code が負荷でぶっ壊れるので、Ghostty + Zellij でいきたい。zsh の補完設定をサボりがちなので、有効にしたい。

自分は brew をローカルに入れる派なので、とりあえずこれだけ入れる。

# なんか初回のGit実行でMacの開発者ツールを有効化する
$ git clone https://github.com/Homebrew/brew.git
$ ./brew/bin/brew install --cask ghostty
$ curl -sS https://starship.rs/install.sh | sh

Starship + Ghostty だけ入れておく

この状態から最低限のZsh設定を書く。Cargoとかまだ入ってないけど、あとで

PATH="$HOME/brew/bin:$HOME/.cargo/bin:$HOME/bin:$PATH"

HISTFILE=$HOME/.zsh_history
HISTSIZE=100000
SAVEHIST=100000
setopt share_history
setopt hist_ignore_dups
setopt hist_ignore_all_dups
setopt auto_pushd
setopt auto_cd
autoload -Uz compinit
compinit

eval "$(starship init zsh)"
# rustup. Rust 系の依存を入れるため
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 最初から入れておく
$ brew install direnv

# miseも最初から念頭にしたい
$ curl https://mise.run | sh
mizchimizchi

Chezmoi

最初から設定を sync する前提で、chezmoi をセットアップする(ただ自分はゼロからセットアップするので、使わない可能性もあるが...)

kawamata さんの設定を参考にする

https://zenn.dev/ryo_kawamata/articles/introduce-chezmoi

$ brew install chezmoi

使ってみる

$ chezmoi init
$ chezmoi add ~/.zshrc
$ cchezmoi apply

# ここに入ってそう
# cat ~/.local/share/chezmoi/dot_zshrc

❯ chezmoi cd
❯ pwd
/Users/mz/.local/share/chezmoi

リポジトリだけ作った。
https://github.com/mizchi/chezmoi-dotfiles

git push しようとしたら github の認証をしてなかったので、やる。

$ brew install gh
$ gh auth login

この過程でトークンが取得されて設定される(管理画面からPAT発行するより楽)

mizchimizchi

VCS周り

GitConfig

https://blog.gitbutler.com/how-git-core-devs-configure-git

# This is Git's per-user configuration file.
[user]
	# name = mizchi
	# email = miz404@gmail.com
[column]
        ui = auto
[branch]
        sort = -committerdate
[tag]
        sort = version:refname
[init]
        defaultBranch = main
[diff]
        algorithm = histogram
        colorMoved = plain
        mnemonicPrefix = true
        renames = true
[push]
        default = simple
        autoSetupRemote = true
        followTags = true
[fetch]
        prune = true
        pruneTags = true
        all = true

# why the hell not?

[help]
        autocorrect = prompt
[commit]
        verbose = true
[rerere]
        enabled = true
        autoupdate = true
[core]
        excludesfile = ~/.gitignore
[rebase]
        autoSquash = true
        autoStash = true
        updateRefs = true

# a matter of taste (uncomment if you dare)

[core]
        fsmonitor = true
        untrackedCache = true
[merge]
        # (just 'diff3' if git version < 2.3)
        conflictstyle = zdiff3
[pull]
        # rebase = true

# この辺は手癖
[alias]
	s = status
	co = commit

Difftastic

tree sitter ベースで diff をハイライトするツール。前に使って結構気に入ったので、試しにデフォルトにしてみる。

https://difftastic.wilfred.me.uk/installation.html

[diff]
    external = difft

JJ

https://github.com/jj-vcs/jj

全然使いこなせてないが、もう一度入れてみる。

$ brew install cargo-binstall
$ cargo binstall --strategies crate-meta-data jj-cli

試しに、 chezmoi で dotfile 事態を jj の git 互換モードで操作してみる

$ jj config set --user user.name "mizchi"
$ jj config set --user user.email "miz404@gmail.com"

$ jj git init

# 履歴
$ jj log

## 作業に名前をつける
$ jj new -m "add dot_gitconfig"

作業開始点がコミットされてて、あとは自動で追跡されてる。
結構悪くない。あとで別途使い心地をまとめたい。

mizchimizchi

helix editor をターミナルのデフォルトエディタにする

最初は brew から入れたが、これだと色々とリソースが不足して微妙だった。HEADでビルドした。

$ ghq get -u helix-editor/helix
$ cd ~/ghq/github.com/helix-editor/helix
$ cargo install \
   --profile opt \
   --config 'build.rustflags="-C target-cpu=native"' \
   --path helix-term \
   --locked
$ hx --health

これだけだとテーマやシンタックス定義が入ってない状態になる

環境変数で、 helix/runtime を指定すると、この辺りが動くようになる

export HELIX_RUNTIME=~/ghq/github.com/helix-editor/helix/runtime
$ hx --health

設定

デフォルトテーマがあまりに紫すぎる
:theme で色々と選べるのだが、適当に darcula-solid を選んでみた

theme = "darcula-solid"

[editor]
# line-number = "relative"
mouse = true

[editor.cursor-shape]
insert = "bar"
normal = "block"
select = "underline"

[editor.file-picker]
hidden = false

参考

https://docs.helix-editor.com/languages.html#languagestoml-files

環境変数にEDITOR=hx を指定した。これで git commitなどで helix が起動するようになる。

export EDITOR=hx

dd が xd だったり vim っぽいくせにそうでない部分が多いが、体を慣らしていく

mizchimizchi

Atuin

$ brew install
$ brew services start atuin
$ atuin sync

$ echo 'eval "$(atuin init zsh)"' >> ~/.zshrc

Ctrl-R または 単に↑で、補完が起動する。

mizchimizchi

履歴をさかのぼる上移動が奪われるのが不便だったが、これで解決した。

eval "$(atuin init zsh --disable-up-arrow)"

mizchimizchi

sheldon

~/.zshrc

eval "$(sheldon source)"
shell = "zsh"

[plugins]
[plugins.zsh-autosuggestions]
github = "zsh-users/zsh-autosuggestions"

[plugins.fast-syntax-highlighting]
github = "zdharma/fast-syntax-highlighting"
mizchimizchi

zoxide

https://github.com/ajeetdsouza/zoxide

cd を上書きして、よくジャンプするディレクトリを学習する。

cdi foo

で、よくいくディレクトリを列挙してくれるそうだが、 fzf のインストールが必要だった。いつもだったら入れてたが、今回はなかった

brew install fzf
mizchimizchi

mise python node

node は周りは mise, python 周りは uv で管理させる

https://mise.jdx.dev/getting-started.html

curl https://mise.run | sh
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc

毎回悩んでたのが、brew が依存で勝手に python/node を持ってきて依存がぐちゃぐちゃになることだったのだが、HOMEBREW_FORBIDDEN_FORMULAE を指定して止めることができるらしい。

https://x.com/ippachi1018/status/2008858757267374235

export HOMEBREW_FORBIDDEN_FORMULAE="node python python3 pip npm pnpm yarn claude"

https://github.com/Homebrew/brew/issues/19939

❯ brew install node
✔︎ JSON API cask.jws.json                                                         Downloaded   15.3MB/ 15.3MB
✔︎ JSON API formula.jws.json                                                      Downloaded   32.1MB/ 32.1MB
==> Fetching downloads for: node
✔︎ Bottle Manifest node (25.2.1)                                                  Downloaded   24.0KB/ 24.0KB
Error: The installation of node was forbidden by you
in `$HOMEBREW_FORBIDDEN_FORMULAE`.

便利...

node

mise use --global node@24

uv & python

$ curl -LsSf https://astral.sh/uv/install.sh | sh
$ uv python install
Installed Python 3.14.2 in 1.10s
 + cpython-3.14.2-macos-aarch64-none (python3.14)

claude code

 curl -fsSL https://claude.ai/install.sh | bash
mizchimizchi

でも AWS CLI はこれがないと動かないらしい

mizchimizchi

podman

docker 入れたくないので、podman

$ brew install podman
$ podman machine init
$ podman machine start

$ podman pull nginx
$ podman run -d -p 8080:80 --name test_nginx nginx

$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

$ podman stop test_nginx

動いた。lima よりは楽

が、この window が消えない...(再起動すれば消えるだろうけど)

mizchimizchi

UDevGothic を導入

https://github.com/yuru7/udev-gothic/releases/tag/v2.1.0

Ghostty の設定 Cmd+, を次のように編集する。

theme = xcodedarkhc
font-family = "UDEV Gothic JPDOC"
font-feature = -dlig
keybind = ctrl+m=text:\n
keybind = ctrl+enter=text:\n
keybind = ctrl+i=text:\t

リガチャが暴発するので、 -dlig が必要っぽい

mizchimizchi

Apple純正の軽量コンテナ

$ ghq get apple/container
# cd ...
$ make release

この bin/container にパスを通しておく

$ container run -d nginx
$ container ls
| ID          | IMAGE        | STATE   | ADDR         |
|-------------|--------------|---------|--------------|
| 3e98aedc... | nginx:latest | running | 192.168.64.2 |
$ container stop 3e98aedc-f444-49ae-aede-cc2c1813168c
mizchimizchi

Raycast 周り

ChatGPT Plugin と Claude Code プラグインを入れた。
GoogleTranslateはデフォルトで入っていた。

mizchimizchi

Devbox

nix のラッパーらしいので、これをそのまま使う

# https://www.jetify.com/docs/devbox/quickstart
$ curl -fsSL https://get.jetify.com/devbox | bash

## 使いたいリポジトリ

$ devbox init
$ devbox add node
$ devbox shell

ちゃんと nix の勉強したほうがいいと思うが、後で
使って思ったが mise と役割が被る

mizchimizchi

Aerospace

Mission Control に頼らず、仮想ウィンドウを管理する。
使いこなすとキーボード操作だけでウィンドウを行き来できるようになる。

概念が大きくて、むずい。

~/.config/aerospace/aerospace.toml に設定を書く。デフォルトをコピペする。

https://nikitabobko.github.io/AeroSpace/guide

自分はdvorak用に色々書き換えたが、ベストプラクティスとは言えないし一般化できないので、設定はまだ公開しない。

  • 起動するとウィンドウ配置管理を Aerospace が握る
  • accordion モードの場合、ウィンドウを追加すると右側に水平分割で
    • alt-, alt+ でサイズを変更できる

全然使いこなせなかったが、これらを認識すると便利さを感じるようになった

  • Alt-[1-9a-z] に仮想ウィンドウがある
  • Alt-Shift-[1-9a-z] に現在フォーカスしてるアプリケーションを送れる
  • Alt-[hjkl] で相対位置のウィンドウに飛べる

参考になったもの
https://qiita.com/showchan33/items/b08b7b0f6feb6a47c70f

自分は使ってみるが、デフォルトの MissionControl に不満がないなら不要かもしれない。

mizchimizchi

VSCode

言語ごとの拡張は必要になったときに入れていけばいいのだが、vscode-comment-translate が本当に便利だった。

https://marketplace.visualstudio.com/items?itemName=intellsmi.comment-translate

https://github.com/intellism/vscode-comment-translate/tree/e22a324286ca9f3dce0e7fcac834b19c8ed5b6fe

settings.json

{
    "github.copilot.nextEditSuggestions.enabled": true,
    "security.workspace.trust.untrustedFiles": "open",
    "editor.minimap.enabled": false,
    "containers.containerClient": "com.microsoft.visualstudio.containers.podman",
    "containers.orchestratorClient": "com.microsoft.visualstudio.orchestrators.podmancompose",
    "commentTranslate.targetLanguage": "ja",
    "commentTranslate.browse.mode": "inplace"
}

OSSとして使ってもらいたいのでコメントも英語で書くが、自分が読めなくなる(読めなくはないが、遅くなる)パターンが頻発していたので、助かる。。。

mizchimizchi

Nix & Devbox

追記: nix は教養として学ぶ程度にして、devbox を高水準ラッパーとして普段使いする、でよさそう。

https://zenn.dev/asa1984/books/nix-hands-on

ここでは、環境構築というよりプログラミング言語としてちゃんと向き合ってみた

これはなんというかメモ

  • nix 自体は純粋関数型言語のサブセットみたいなもの
    • nix repl で一通り動かして動作確認
  • node.js で例えるなら flake.nix = package.json みたいなやつ

これ自体は流行る気があんまりしない。

Devbox

実体として nix のラッパー。

こういうのはメンテされるかが心配。また、自分でパッケージを追加したければnixを覚える必要はありそう。AIがやってくれそうではあるが。

これは devbox add ... で面白半分で適当に突っ込んだ devbox.json

{
  "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.16.0/.schema/devbox.schema.json",
  "packages": [
    "go@latest",
    "python@latest",
    "postgresql@latest",
    "bun@latest",
    "zig@latest",
    "lean4@latest",
    "zls@latest"
  ]
}

GitHub Actions

そのままテスト環境設定に流用できる

.github/workflows/test.yaml

name: Testing with devbox
on: push
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install devbox
        uses: jetify-com/devbox-install-action@v0.12.0
      - run: devbox run -- python --version
      - run: devbox run -- go version
      - run: devbox run -- bun test

これは便利

追記:

色々と突っ込みすぎたせいもあるが、初回実行が2m40s として、すでに冪等でキャッシュを参照してるので、これ以上速くならない。

個人のライブラリだとこれ自体がオーバーヘッドになるので、常に使うという感じにはならなさそう。

mizchimizchi

homebrew 作者の mise 的なやつ。

pkgx node@18 --version のように、一時的にパスを通して明示的に実行する。

$ brew install pkgxdev/made/pkgx

https://github.com/pkgxdev/pkgx