dotfiles再構築 in 2026

January 12, 2026

巷では chezmoi が流行ってますが乗っかることもなく。

方針

mise 推しなので mise と、薄い shell,symlink だけで一旦再整理しました。

  • homebrew/linuxbrew は遅いので大部分を mise に乗り換え。
  • brewBrewfile, mise~/.config/mise/config.toml で宣言的に管理。
  • macosでの brew cask は当然継続。

mise はrust製で動作が速く、バージョンの切り替えがしやすいのがよいです。

brew

惰性で使ってるものも多く、もうちょっと削るかも。

Brewfile.common

brew "coreutils"
brew "curl"
brew "git"
brew "tree"
brew "watch"
brew "wget"

brew "fzy"
brew "git-secrets"
brew "llvm"
brew "nkf"
brew "tig"
brew "universal-ctags"

brew "mise"

Brewfile.mac

brew "duckdb"
brew "kind"
brew "kubectl"
brew "kubectx"
brew "kubernetes-helm"
brew "lima"
brew "ncurses"
brew "openssl"
brew "reattach-to-user-namespace"
brew "trash"
brew "util-linux"
brew "zsh"

cask_args appdir: "/Applications"

tap "homebrew/cask"
cask "alt-tab"
cask "appcleaner"
cask "clibor-for-mac"
cask "flux"
cask "karabiner-elements"
cask "kindle"
cask "linearmouse"
cask "macgesture"
cask "raycast"
cask "rectangle"
cask "vagrant"
cask "virtualbox"
cask "visual-studio-code"

Brewfile.ubuntu

brew "trash-cli"

mise

miseaqua のregistryも参照可能なのでカバー範囲が広い。 registry参照に当たり aqua を実行するのではなく参照部分を自前実装しているので安定している。

また python のバージョン管理だけは uv でやったほうがdir毎の venv との関係で都合が良いのでそちらで行う。 どっかで適当に uv python pin --global 3.13 しておけば雑な普段遣いも困らない。

config.toml

[tools]
# Language runtimes (Python managed by uv)
nodejs = "lts"
go = "1.25"
bun = "latest"

# Language tools
ruff = "latest"
pnpm = "latest"
golangci-lint = "latest"
uv = "latest"

# Editor
neovim = "latest"

# CLI tools (version switchable)
ripgrep = "latest"
fzf = "latest"
fd = "latest"
bat = "latest"
eza = "latest"
gh = "latest"
ghq = "latest"
delta = "latest"
jq = "latest"
glow = "latest"
xh = "latest"
buf = "latest"
tmux = "latest"
pinact = "latest"

# CLI tools (aqua/github backend)
"aqua:Wilfred/difftastic" = "latest"
"aqua:peco/peco" = "latest"
"aqua:ynqa/jnv" = "latest"
"aqua:sxyazi/yazi" = "latest"
"aqua:rossmacarthur/sheldon" = "latest"
"github:dalance/procs" = "latest"

# npm tools
"npm:diff-so-fancy" = "latest"
"npm:@google/gemini-cli" = "latest"
"npm:@anthropic-ai/claude-code" = "latest"

[settings]
# Allow .python-version files to set python version
idiomatic_version_file_enable_tools = ["python"]

miseでのosごとの分岐には色々仕組みがあるのでそれに乗っかればOK

.config/mise/
├── conf.d/*.toml             # User fragments, loaded alphabetically
├── config.toml               # Global user config
├── config.<env>.toml         # Env-specific user config
├── config.local.toml         # User-local overrides
└── config.<env>.local.toml   # Env-specific user-local overrides

zshenv

エディタのPATHにも影響するのでbrew,miseのpathまわりはzshenvにセットしておく。

# mise
export PATH="$HOME/.local/bin:$HOME/.local/share/mise/shims:$PATH"

# homebrew
if [[ -d /opt/homebrew ]]; then
  # from eval "$(/opt/homebrew/bin/brew shellenv)"
  export HOMEBREW_PREFIX="/opt/homebrew"
  export HOMEBREW_CELLAR="/opt/homebrew/Cellar"
  export HOMEBREW_REPOSITORY="/opt/homebrew"
  export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"
  export MANPATH="/opt/homebrew/share/man:$MANPATH"
  export INFOPATH="/opt/homebrew/share/info:$INFOPATH"
elif [[ -d /home/linuxbrew/.linuxbrew ]]; then
  # from eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
  export HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew"
  export HOMEBREW_CELLAR="/home/linuxbrew/.linuxbrew/Cellar"
  export HOMEBREW_REPOSITORY="/home/linuxbrew/.linuxbrew/Homebrew"
  export PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH"
  export MANPATH="/home/linuxbrew/.linuxbrew/share/man:$MANPATH"
  export INFOPATH="/home/linuxbrew/.linuxbrew/share/info:$INFOPATH"
fi

おわり

あとはdirほってsymlinkはるだけにして、極力複雑なことはせず。 LLMに書かせたせいかやや仰々しい install script になってしまったがやってることは単純なので手入れは楽かな。 認知負荷最小化しつつ大部分を宣言的にできたのでよかったです。

成果物はこちら:



Recent blog posts



(c) Copyright 2026 Kotaro Yoshimatsu