この記事の対象読者
- 「dotfiles」という言葉を聞いたことがあるけど、よく分からない人
- 開発環境を整えたいけど、何から始めればいいか分からない人
- Vim/Neovim、tmuxに興味があるけど、敷居が高いと感じている人
この記事では、dotfilesの基本概念から、僕が実際に使っているツール、そしてなぜこの構成を選んだのかという仕事の流儀まで解説します。
dotfilesとは何か?
一言で言うと
dotfiles(ドットファイル) とは、Unix/Linux/macOSで使われる 設定ファイル のことです。
ファイル名が .(ドット)で始まるため、dotfilesと呼ばれます。
具体例
~/.bashrc → シェル(Bash)の設定
~/.zshrc → シェル(Zsh)の設定
~/.vimrc → Vimエディタの設定
~/.gitconfig → Gitの設定
~/.tmux.conf → tmuxの設定
なぜ「隠しファイル」なのか?
Unix系OSでは、. で始まるファイルは デフォルトで非表示 になります。
ls # 通常のファイルのみ表示
ls -a # dotfiles(隠しファイル)も表示
設定ファイルは普段触らないので、邪魔にならないよう隠されています。
なぜdotfilesを管理するのか?
メリット
| メリット | 説明 |
|---|---|
| 環境の再現 | 新しいPCでも同じ環境をすぐ構築できる |
| バックアップ | 設定を失う心配がない |
| バージョン管理 | Gitで変更履歴を追える |
| 共有 | チームで設定を共有できる |
一般的な管理方法
# 1. dotfilesをGitリポジトリで管理
~/dotfiles/
├── .vimrc
├── .tmux.conf
├── .zshrc
└── install.sh # シンボリックリンクを張るスクリプト
# 2. ホームディレクトリにシンボリックリンクを作成
ln -s ~/dotfiles/.vimrc ~/.vimrc
dotfiles管理のワークフロー
flowchart LR
Create["📝 設定ファイル作成<br/>━━━━━━<br/>.vimrc<br/>.tmux.conf<br/>.zshrc"] --> Repo["📁 Gitリポジトリ化<br/>━━━━━━<br/><code style='color: white'>~/dotfiles/</code><br/><br/><code style='color: white'>git init</code><br/><code style='color: white'>git add .</code><br/><code style='color: white'>git commit</code>"]
Repo --> Remote["☁️ GitHub/GitLab<br/>にプッシュ<br/>━━━━━━<br/>バックアップ<br/>どこからでもアクセス"]
Repo --> Link["🔗 シンボリックリンク<br/>━━━━━━<br/><code style='color: white'>ln -s ~/dotfiles/.vimrc</code><br/><code style='color: white'> ~/.vimrc</code><br/><br/>ホームディレクトリから<br/>dotfilesを参照"]
Link --> NewPC["💻 新しいPC<br/>━━━━━━<br/>1. <code style='color: white'>git clone</code><br/>2. <code style='color: white'>./install.sh</code><br/><br/>3秒で環境再現!"]
Remote -.->|clone| NewPC
Update["🔄 設定を更新"] --> Repo
Repo -.-> Remote
style Create fill:#e3f2fd
style Repo fill:#fff3e0
style Remote fill:#e8f5e9
style Link fill:#fff3e0
style NewPC fill:#e8f5e9
style Update fill:#e3f2fd
僕の開発環境の全体像
flowchart TB
subgraph WezTerm["🖥️ WezTerm(ターミナルエミュレータ)"]
WT["作業場の「建物」<br/>━━━━━━<br/>・GPU加速<br/>・Lua設定<br/>・クロスプラットフォーム"]
end
subgraph Tmux["📦 tmux(ターミナル多重化)"]
TM["作業机の「配置」<br/>━━━━━━<br/>・セッション管理<br/>・画面分割<br/>・永続化"]
end
subgraph Apps["🛠️ アプリケーション"]
direction LR
NV["📝 Neovim<br/>━━━━━━<br/>メインの「道具」<br/><br/>・テキスト編集<br/>・LSP<br/>・プラグイン"]
ZSH["⚡ zsh<br/>━━━━━━<br/>コマンドを打つ「場所」<br/><br/>・ログ監視<br/>・コマンド実行<br/>・Git操作"]
end
WezTerm --> Tmux
Tmux --> Apps
Note["💡 レイヤー構造<br/>━━━━━━<br/>外側ほど「入れ物」<br/>内側ほど「作業内容」<br/><br/>壊れても各層で復旧可能"]
style WezTerm fill:#e3f2fd
style Tmux fill:#fff3e0
style Apps fill:#e8f5e9
style NV fill:#c8e6c9
style ZSH fill:#c8e6c9
style Note fill:#fffde7
| ツール | 役割 | 一言で |
|---|---|---|
| WezTerm | ターミナルエミュレータ | 「作業場の建物」 |
| tmux | ターミナル多重化 | 「作業机の配置」 |
| Neovim | テキストエディタ | 「メインの道具」 |
| zsh | シェル | 「コマンドを打つ場所」 |
各ツールの解説
1. WezTerm(ターミナルエミュレータ)
ターミナルとは?
ターミナル(端末) は、コマンドを入力してコンピュータを操作するためのアプリです。
Windowsの「コマンドプロンプト」、macOSの「ターミナル.app」のようなものです。
WezTermを選んだ理由
| 特徴 | 説明 |
|---|---|
| 軽量 | 起動が速く、メモリ消費が少ない |
| 安定 | 落ちない、固まらない |
| Lua設定 | 設定ファイルがLuaで書ける(プログラマブル) |
| クロスプラットフォーム | Windows/Mac/Linux対応 |
設定例(~/.wezterm.lua)
local wezterm = require 'wezterm'
local config = {}
config.font = wezterm.font 'JetBrains Mono'
config.font_size = 14.0
config.color_scheme = 'Tokyo Night'
-- 透過設定
config.window_background_opacity = 0.95
return config
公式サイト: https://wezfurlong.org/wezterm/
2. tmux(ターミナル多重化ツール)
tmuxとは?
tmux は、1つのターミナル内で 複数の画面を管理 できるツールです。
何がうれしいのか?
通常のターミナル:
┌──────────────┐
│ │ ← 1画面だけ
│ シェル │
│ │
└──────────────┘
tmuxを使うと:
┌──────────┬──────────┐
│ │ │
│ エディタ │ ログ │ ← 分割できる
│ │ │
├──────────┴──────────┤
│ コマンド実行 │
└─────────────────────┘
tmuxの主要概念
| 概念 | 説明 |
|---|---|
| セッション | 作業全体のまとまり(プロジェクト単位) |
| ウィンドウ | タブのようなもの |
| ペイン | 画面の分割 |
セッション・ウィンドウ・ペインの階層構造
flowchart TB
subgraph Session["📁 セッション(work)"]
Note1["プロジェクト全体のまとまり<br/>SSHが切れても生き続ける"]
subgraph Window1["📑 ウィンドウ1(editor)"]
W1["タブのようなもの<br/><code style='color: white'>Ctrl+b c</code> で作成"]
subgraph Panes1["画面分割"]
direction LR
P1["📝 ペイン1<br/>━━━━━━<br/>Neovim<br/>エディタ"]
P2["⚡ ペイン2<br/>━━━━━━<br/>シェル<br/>コマンド実行"]
end
end
subgraph Window2["📑 ウィンドウ2(server)"]
W2["<code style='color: white'>Ctrl+b n</code> で切り替え"]
subgraph Panes2["画面分割"]
direction LR
P3["🖥️ ペイン1<br/>━━━━━━<br/>サーバー起動<br/><code style='color: white'>npm run dev</code>"]
P4["📊 ペイン2<br/>━━━━━━<br/>ログ監視<br/><code style='color: white'>tail -f app.log</code>"]
end
end
end
Detach["🔌 セッションから離脱<br/><code style='color: white'>Ctrl+b d</code><br/><br/>→ 作業は続行中"]
Attach["🔗 セッションに再接続<br/><code style='color: white'>tmux attach -t work</code><br/><br/>→ 作業の続きから"]
Session -.-> Detach
Detach -.-> Attach
Attach -.-> Session
style Session fill:#e3f2fd
style Window1 fill:#fff3e0
style Window2 fill:#fff3e0
style Panes1 fill:#e8f5e9
style Panes2 fill:#e8f5e9
style Detach fill:#ffebee
style Attach fill:#c8e6c9
最大のメリット:セッションの永続化
# SSHで接続中に回線が切れても...
# tmuxのセッションは生き続ける
tmux attach # 再接続すれば、作業の続きからできる
これが「安心に近い感覚」の正体です。
基本的な使い方
tmux # 新しいセッションを開始
tmux new -s work # "work"という名前でセッション開始
tmux ls # セッション一覧
tmux attach -t work # "work"セッションに接続
キーバインド(デフォルト)
| キー | 動作 |
|---|---|
Ctrl+b % |
縦分割 |
Ctrl+b " |
横分割 |
Ctrl+b o |
ペイン移動 |
Ctrl+b d |
セッションから離脱 |
Ctrl+b c |
新しいウィンドウ |
公式サイト: https://github.com/tmux/tmux
3. Neovim(テキストエディタ)
VimとNeovimの違い
| Vim | Neovim | |
|---|---|---|
| 歴史 | 1991年〜 | 2014年〜(Vimからフォーク) |
| 設定言語 | Vimscript | Vimscript + Lua |
| プラグイン | 豊富 | 豊富 + モダンなエコシステム |
| 非同期処理 | 後から追加 | 最初から対応 |
Neovimは、Vimをモダンに書き直したプロジェクトです。
なぜVim系エディタを使うのか?
VS Codeではなく、あえてVim系を使う理由:
| 理由 | 説明 |
|---|---|
| キーボード完結 | マウスに手を伸ばす必要がない |
| 起動が一瞬 | 0.1秒で立ち上がる |
| どこでも使える | SSH先のサーバーでも同じ操作感 |
| 思考が止まらない | 「操作」ではなく「編集」に集中できる |
起動速度の比較
Neovim: ~0.05秒
VS Code: ~3-5秒(プロジェクトによる)
これは設計思想の違いです:
- Neovim: 必要最小限で起動 → 後から機能を読み込む
- VS Code: 全部準備してから起動
モード(Vimの基本概念)
Vimには「モード」という概念があります:
| モード | 用途 | 切り替え |
|---|---|---|
| ノーマル | 移動・編集コマンド | Esc |
| インサート | 文字入力 | i, a, o |
| ビジュアル | 選択 | v, V |
| コマンド | 保存・終了など | : |
Vimのモード遷移
flowchart TB
Normal["⚙️ ノーマルモード<br/>━━━━━━<br/>移動・編集コマンドを実行<br/><br/><code style='color: white'>dd</code> - 行削除<br/><code style='color: white'>yy</code> - 行コピー<br/><code style='color: white'>p</code> - 貼り付け<br/><code style='color: white'>u</code> - 元に戻す"]
Insert["✏️ インサートモード<br/>━━━━━━<br/>文字を入力する<br/><br/>普通のエディタと同じように<br/>タイピングできる"]
Visual["📋 ビジュアルモード<br/>━━━━━━<br/>テキストを選択する<br/><br/><code style='color: white'>v</code> - 文字選択<br/><code style='color: white'>V</code> - 行選択"]
Command["💻 コマンドモード<br/>━━━━━━<br/>ファイル操作<br/><br/><code style='color: white'>:w</code> - 保存<br/><code style='color: white'>:q</code> - 終了<br/><code style='color: white'>:wq</code> - 保存して終了"]
Normal -->|"<code style='color: white'>i</code> - カーソル位置から<br/><code style='color: white'>a</code> - カーソル後ろから<br/><code style='color: white'>o</code> - 新しい行"| Insert
Insert -->|"<code style='color: white'>Esc</code>"| Normal
Normal -->|"<code style='color: white'>v</code> - 文字選択<br/><code style='color: white'>V</code> - 行選択"| Visual
Visual -->|"<code style='color: white'>Esc</code>"| Normal
Normal -->|"<code style='color: white'>:</code>"| Command
Command -->|"<code style='color: white'>Enter</code> or <code style='color: white'>Esc</code>"| Normal
Note["💡 ポイント<br/>━━━━━━<br/>・すべての道はノーマルモードに通ず<br/>・迷ったら <code style='color: white'>Esc</code> を連打<br/>・ノーマルモードが基準地点"]
style Normal fill:#e3f2fd
style Insert fill:#fff3e0
style Visual fill:#e8f5e9
style Command fill:#ffe0b2
style Note fill:#fffde7
最初は戸惑いますが、慣れると**「書く」と「動かす」を分離**できることの快適さが分かります。
公式サイト: https://neovim.io/
4. LazyVim(Neovimの設定フレームワーク)
LazyVimとは?
LazyVimは、Neovimの 設定済みフレームワーク です。
昔は .vimrc を何百行も書いて育てていましたが、今はLazyVimを使っています。
なぜLazyVimか?
| 特徴 | 説明 |
|---|---|
| すぐ使える | インストールするだけで実用的な環境 |
| 遅延ロード | 必要になるまでプラグインを読み込まない(高速) |
| モジュール式 | 必要な機能だけ有効化できる |
| 更新が安定 | 破壊的変更が少ない |
LazyVimに含まれる主要機能
- LSP(Language Server Protocol): コード補完、定義ジャンプ
- Treesitter: シンタックスハイライト
- Telescope: ファイル検索、文字列検索
- Git連携: 差分表示、blame
- ファイラー: Neo-tree
「全部を自分で作らない」という判断
以前は設定を一から書くのが楽しかった。
でも今は、メンテナンスコストを考えて、土台は既存のものを使い、カスタマイズは最小限にしています。
これは「過剰設計を避ける」という仕事観とも一致しています。
カスタマイズレベルの比較
flowchart LR
subgraph Full["🔧 フルスクラッチ<br/>━━━━━━<br/>全部自分で作る"]
F1["⏱️ セットアップ時間<br/><code style='color: white'>数週間〜数ヶ月</code>"]
F2["🎯 自由度<br/><code style='color: white'>100%</code>"]
F3["💰 メンテナンスコスト<br/><code style='color: white'>高い</code><br/><br/>プラグイン更新で壊れる<br/>新しい機能は自分で実装"]
F4["📚 学習コスト<br/><code style='color: white'>高い</code><br/><br/>Vimscript/Lua<br/>プラグイン仕様"]
end
subgraph Framework["📦 フレームワーク<br/>━━━━━━<br/>LazyVim等を使う"]
W1["⏱️ セットアップ時間<br/><code style='color: white'>数時間</code>"]
W2["🎯 自由度<br/><code style='color: white'>70-80%</code>"]
W3["💰 メンテナンスコスト<br/><code style='color: white'>低い</code><br/><br/>フレームワークが更新<br/>カスタマイズのみ管理"]
W4["📚 学習コスト<br/><code style='color: white'>中程度</code><br/><br/>フレームワークの思想<br/>カスタマイズ方法"]
end
subgraph Default["🎨 デフォルト<br/>━━━━━━<br/>そのまま使う"]
D1["⏱️ セットアップ時間<br/><code style='color: white'>即座</code>"]
D2["🎯 自由度<br/><code style='color: white'>0%</code>"]
D3["💰 メンテナンスコスト<br/><code style='color: white'>なし</code><br/><br/>更新は自動<br/>設定ファイル不要"]
D4["📚 学習コスト<br/><code style='color: white'>低い</code><br/><br/>基本操作のみ"]
end
Note["💡 僕の選択<br/>━━━━━━<br/><b>フレームワーク(LazyVim)</b><br/><br/>・実用まで早い<br/>・メンテナンス楽<br/>・カスタマイズも可能<br/>・仕事で使い続けられる"]
Full -.->|"以前はこれ"| Framework
Framework -.->|"今はこれ"| Note
style Full fill:#ffebee
style Framework fill:#e8f5e9
style Default fill:#e3f2fd
style Note fill:#fff3e0
公式サイト: https://www.lazyvim.org/
僕のdotfiles構成
~/dotfiles/
├── .config/
│ ├── nvim/ # Neovim設定(LazyVim)
│ │ └── lua/
│ │ └── plugins/ # カスタムプラグイン
│ └── wezterm/ # WezTerm設定
├── .tmux.conf # tmux設定
├── .zshrc # シェル設定
└── install.sh # セットアップスクリプト
設定のポイント
- 最小限のカスタマイズ: デフォルトを尊重し、本当に必要なものだけ変える
- ポータビリティ: 新しい環境でも動くように依存を減らす
- ドキュメント化: なぜその設定にしたかをコメントで残す
dotfilesに現れる仕事の流儀
ここまでツールの説明をしてきましたが、本当に伝えたいのは 「なぜこの構成なのか」 です。
速さより「戻れること」
- すぐ再現できる
- 他の環境でも使える
- 壊れたら戻せる
- 説明できる
僕のdotfilesは「最強」ではありません。 でも、仕事で使い続けられる形にはなっています。
dotfilesを見れば、その人が分かる
- 何を面倒だと感じているか
- どこで妥協しているか
- 何を自動化し、何を残しているか
- 他人が触れることを想定しているか
派手さはないけど、仕事の姿勢は確実に滲み出る。
まとめ
| ツール | 何をするもの | 僕が選んだ理由 |
|---|---|---|
| WezTerm | ターミナル | 軽い、安定、Lua設定 |
| tmux | 画面分割・セッション管理 | 作業が途切れない安心感 |
| Neovim | テキスト編集 | 思考を止めずに手を動かせる |
| LazyVim | Neovimの土台 | メンテナンスコストを下げる |
dotfilesは、単なる設定ファイルではなく、自分がどう考えて仕事をしているかの履歴です。
始め方(初心者向け)
- まずはターミナルに慣れる: 普段使いのターミナルでコマンドを打つ
- Vimtutor:
vimtutorコマンドで基本操作を学ぶ(30分) - tmuxを触る:
tmuxで起動、Ctrl+b %で分割 - LazyVimを試す: 公式のインストール手順に従う
初心者向け学習ロードマップ
flowchart TB
Start["🎯 スタート<br/>━━━━━━<br/>開発環境を整えたい!"]
Week1["📅 Week 1<br/>━━━━━━<br/>🖥️ ターミナルに慣れる<br/><br/><code style='color: white'>cd</code> - ディレクトリ移動<br/><code style='color: white'>ls</code> - ファイル一覧<br/><code style='color: white'>cat</code> - ファイル表示<br/><code style='color: white'>grep</code> - 検索"]
Week2["📅 Week 2<br/>━━━━━━<br/>📝 Vimの基礎<br/><br/><code style='color: white'>vimtutor</code> で30分学習<br/>・<code style='color: white'>i</code> で入力、<code style='color: white'>Esc</code> で戻る<br/>・<code style='color: white'>:wq</code> で保存終了<br/>・簡単な編集を試す"]
Week3["📅 Week 3<br/>━━━━━━<br/>📦 tmuxの基礎<br/><br/><code style='color: white'>tmux</code> - 起動<br/><code style='color: white'>Ctrl+b %</code> - 縦分割<br/><code style='color: white'>Ctrl+b d</code> - 離脱<br/><code style='color: white'>tmux attach</code> - 再接続"]
Week4["📅 Week 4<br/>━━━━━━<br/>🚀 LazyVimを試す<br/><br/>公式手順でインストール<br/>・既存プロジェクトで使う<br/>・わからない操作は調べる<br/>・少しずつ慣れる"]
Practice["🎓 実践フェーズ<br/>━━━━━━<br/>実際の仕事で使う<br/><br/>・小さいタスクから<br/>・エラーを恐れない<br/>・dotfilesをGit管理"]
Master["✅ 習熟<br/>━━━━━━<br/>自分のスタイル確立<br/><br/>・必要なカスタマイズ追加<br/>・チームに共有<br/>・継続的に改善"]
Start --> Week1
Week1 --> Week2
Week2 --> Week3
Week3 --> Week4
Week4 --> Practice
Practice --> Master
Note1["💡 焦らない<br/>━━━━━━<br/>一度に全部<br/>覚える必要なし"]
Note2["💡 実践重視<br/>━━━━━━<br/>読むより<br/>触って覚える"]
Note3["💡 挫折OK<br/>━━━━━━<br/>戻ってきたら<br/>また続ければいい"]
Week1 -.-> Note1
Week3 -.-> Note2
Practice -.-> Note3
style Start fill:#e3f2fd
style Week1 fill:#fff3e0
style Week2 fill:#fff3e0
style Week3 fill:#fff3e0
style Week4 fill:#fff3e0
style Practice fill:#e8f5e9
style Master fill:#c8e6c9
style Note1 fill:#fffde7
style Note2 fill:#fffde7
style Note3 fill:#fffde7
いきなり全部を変える必要はありません。 一つずつ、必要になったら足していくのがおすすめです。
Dotfilesをもっとラクにする管理ツール
ここまで「シンボリックリンクを手動で張る」方法を紹介しましたが、実は専用の管理ツールを使うとさらに楽になります。
手動管理 vs ツール管理:何が違うのか
| 項目 | 手動(ln -s) | 管理ツール |
|---|---|---|
| 学習コスト | ゼロ | ツールの使い方を覚える |
| 柔軟性 | 完全に自由 | ツールの設計に従う |
| 複数マシン対応 | スクリプトを自作 | 標準機能で対応 |
| 秘密情報の暗号化 | 自前で実装 | 一部ツールで対応 |
| メンテナンス | シンプル | ツールのアップデート |
結論から言うと:
- 1台のマシンだけ: 手動で十分
- 複数マシン、または秘密情報を含む: ツールを検討する価値あり
Dotfiles管理ツール4選
1. chezmoi(チェズモイ)
特徴: Go製の高機能ツール。テンプレート・暗号化・複数マシン対応を標準装備。
| 項目 | 内容 |
|---|---|
| 強み | テンプレート機能が強力、1Passwordなど外部シークレット連携 |
| 使うべき人 | 複数マシンを運用、秘密情報を安全に管理したい |
| 学習コスト | 中程度(独自の概念を理解する必要あり) |
最小セットアップ手順
# インストール(macOS)
brew install chezmoi
# 初期化(新規)
chezmoi init
# 既存のdotfilesをchezmoiに追加
chezmoi add ~/.zshrc
chezmoi add ~/.config/nvim
# 状態確認
chezmoi status
# 変更を適用
chezmoi apply
# GitHubにプッシュ
chezmoi cd
git add .
git commit -m "Initial dotfiles"
git remote add origin https://github.com/yourname/dotfiles.git
git push -u origin main
新しいマシンでのセットアップ
# 1コマンドで環境構築(超便利)
chezmoi init --apply https://github.com/yourname/dotfiles.git
テンプレート例(マシンごとの条件分岐)
# ~/.local/share/chezmoi/dot_zshrc.tmpl
# 共通設定
export EDITOR=nvim
# マシン固有の設定
{{ if eq .chezmoi.hostname "work-macbook" }}
# 会社マシン用
export PATH="$HOME/work-tools/bin:$PATH"
{{ else if eq .chezmoi.hostname "home-desktop" }}
# 自宅マシン用
export PATH="$HOME/personal/bin:$PATH"
{{ end }}
運用のコツ
chezmoi diffで適用前に差分確認chezmoi edit ~/.zshrcで編集(ソースディレクトリを自動で開く).chezmoiignoreで管理対象外ファイルを指定
⚠️ 注意: chezmoiは「コピー方式」。シンボリックリンクではなく、ファイルをホームディレクトリにコピーする。既存のシンボリックリンク運用とは異なる点に注意。
公式ドキュメント: https://www.chezmoi.io/
2. GNU Stow
特徴: 最も軽量でシンプル。シンボリックリンクの管理に特化。
| 項目 | 内容 |
|---|---|
| 強み | 依存なし、学習コスト最小、Unix哲学に忠実 |
| 使うべき人 | シンプルを好む、1-2台のマシン運用 |
| 学習コスト | 低い |
最小セットアップ手順
# インストール(macOS)
brew install stow
# ディレクトリ構造を作成
mkdir -p ~/dotfiles/zsh
mkdir -p ~/dotfiles/nvim/.config
mkdir -p ~/dotfiles/tmux
# ファイルを移動(ディレクトリ構造を維持)
mv ~/.zshrc ~/dotfiles/zsh/
mv ~/.config/nvim ~/dotfiles/nvim/.config/
mv ~/.tmux.conf ~/dotfiles/tmux/
# シンボリックリンクを作成
cd ~/dotfiles
stow zsh # ~/.zshrc が作成される
stow nvim # ~/.config/nvim が作成される
stow tmux # ~/.tmux.conf が作成される
ディレクトリ構造
~/dotfiles/
├── zsh/
│ └── .zshrc # → ~/.zshrc
├── nvim/
│ └── .config/
│ └── nvim/ # → ~/.config/nvim
│ └── init.lua
├── tmux/
│ └── .tmux.conf # → ~/.tmux.conf
└── git/
└── .gitconfig # → ~/.gitconfig
運用のコツ
- パッケージ(ディレクトリ)単位で管理できる
stow -D パッケージ名でリンク解除stow -R パッケージ名で再リンク(更新時)
⚠️ 注意: Stowは「ホームディレクトリからの相対パス」でリンクを張る。dotfilesディレクトリの場所を変えると壊れる。
公式ドキュメント: https://www.gnu.org/software/stow/
3. Dotbot
特徴: Python製。YAML設定ファイルで宣言的に管理。
| 項目 | 内容 |
|---|---|
| 強み | 設定が読みやすい、シェルコマンド実行可能 |
| 使うべき人 | YAML好き、セットアップスクリプトを整理したい |
| 学習コスト | 低〜中程度 |
最小セットアップ手順
# dotfilesリポジトリにサブモジュールとして追加
cd ~/dotfiles
git submodule add https://github.com/anishathalye/dotbot
# 設定ファイル作成
touch install.conf.yaml
# インストールスクリプト作成
cp dotbot/tools/git-submodule/install .
chmod +x install
設定ファイル例(install.conf.yaml)
# install.conf.yaml
# デフォルト設定
- defaults:
link:
relink: true # 既存リンクを上書き
create: true # 親ディレクトリを自動作成
# シンボリックリンク
- link:
~/.zshrc: zsh/.zshrc
~/.tmux.conf: tmux/.tmux.conf
~/.config/nvim: nvim/.config/nvim
~/.gitconfig: git/.gitconfig
# シェルコマンド実行
- shell:
- [git submodule update --init --recursive, Installing submodules]
- command: brew bundle --file=Brewfile
description: Installing Homebrew packages
stdin: true
stdout: true
運用のコツ
./installでセットアップ実行- 冪等性がある(何度実行しても同じ結果)
- シェルコマンドでパッケージインストールも自動化
公式ドキュメント: https://github.com/anishathalye/dotbot
4. yadm(Yet Another Dotfiles Manager)
特徴: Gitのラッパー。ホームディレクトリ自体をGit管理。
| 項目 | 内容 |
|---|---|
| 強み | Gitコマンドがそのまま使える、学習コスト最小 |
| 使うべき人 | Git操作に慣れている、シンプルに始めたい |
| 学習コスト | 低い(Gitを知っていれば即使える) |
最小セットアップ手順
# インストール(macOS)
brew install yadm
# 初期化
yadm init
# ファイルを追加
yadm add ~/.zshrc
yadm add ~/.tmux.conf
yadm add ~/.config/nvim
# コミット
yadm commit -m "Initial dotfiles"
# リモートリポジトリに接続
yadm remote add origin https://github.com/yourname/dotfiles.git
yadm push -u origin main
新しいマシンでのセットアップ
# クローン(ホームディレクトリに展開される)
yadm clone https://github.com/yourname/dotfiles.git
運用のコツ
yadm status,yadm diff,yadm logなど、全てGitと同じyadm encryptで秘密情報を暗号化(GPG使用).gitignoreならぬ.yadm/encryptで暗号化対象を指定
⚠️ 注意: ホームディレクトリ直下に
.gitが作られる(正確には~/.local/share/yadm/repo.git)。既存の~/.gitがあると衝突する可能性あり。
公式ドキュメント: https://yadm.io/
ツール比較表
| 項目 | chezmoi | GNU Stow | Dotbot | yadm |
|---|---|---|---|---|
| 軽量性 | △(Go製バイナリ) | ◎(Perl、依存なし) | ○(Python) | ◎(Bashスクリプト) |
| 学習コスト | 中 | 低 | 低〜中 | 低 |
| 複数マシン対応 | ◎(テンプレート) | △(手動分岐) | ○(プロファイル) | ○(alt files) |
| 暗号化対応 | ◎(age, GPG, 1Password等) | × | × | ○(GPG) |
| リンク方式 | コピー | シンボリックリンク | シンボリックリンク | 直接管理 |
| Git依存 | 必須 | 不要 | 必須(サブモジュール) | 必須 |
どのタイプのエンジニアに向いているか
| タイプ | おすすめツール | 理由 |
|---|---|---|
| ミニマリスト | GNU Stow | 最もシンプル、依存なし |
| Git大好き | yadm | Gitコマンドがそのまま使える |
| 複数マシン運用 | chezmoi | テンプレート機能が強力 |
| セットアップ自動化重視 | Dotbot | YAML宣言、シェル実行可能 |
| 秘密情報も管理したい | chezmoi / yadm | 暗号化機能あり |
初学者がハマるポイントと回避策
1. シンボリックリンクとコピーの違いを理解していない
# シンボリックリンク(Stow, Dotbot)
~/.zshrc → ~/dotfiles/zsh/.zshrc # 参照
# コピー(chezmoi)
~/.zshrc # 実体がここにある
回避策: chezmoiは chezmoi edit で編集する。直接 ~/.zshrc を編集すると、次の chezmoi apply で上書きされる。
2. 既存ファイルとの衝突
# エラー例
stow zsh
# ERROR: stow: CONFLICT: .zshrc already exists
回避策: 既存ファイルをバックアップしてから削除、またはツールのオプションで上書き許可。
# Stowの場合
mv ~/.zshrc ~/.zshrc.backup
stow zsh
# chezmoiの場合
chezmoi apply --force
3. .gitignoreを忘れる
秘密情報を含むファイルを誤ってコミットしてしまう。
回避策: 最初に .gitignore を設定。
# ~/dotfiles/.gitignore
.envrc
*.local
.secrets/
【危険】やってはいけないDotfiles運用
⚠️ 警告: 以下はセキュリティリスクを招く
⚠️ APIキー・パスワードを平文でコミット
# 絶対にやってはいけない
export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"
正しい対応:
.gitignoreで除外- chezmoi の暗号化機能を使う
- 1Password CLI /
passなどの外部ツール連携
⚠️ パブリックリポジトリに秘密情報を含むdotfilesを公開
一度コミットすると、履歴から完全に消すのは困難。
正しい対応:
- 秘密情報は最初からリポジトリに入れない
- 入れてしまった場合は
git filter-branchまたはbfgで履歴から削除し、キーをローテーション
⚠️ 実行権限のあるスクリプトをそのまま実行
他人のdotfilesを git clone して即 ./install.sh は危険。
正しい対応:
- 実行前に中身を確認する
- 信頼できるソースからのみ取得
僕がツールを使わない理由(シンプル派の選択肢)
ここまでツールを紹介しておいて何ですが、僕自身は管理ツールを使っていません。
理由はシンプルで:
- 1台のマシンで完結している
- シンボリックリンクで困っていない
- 覚えることを増やしたくない
手動で ln -s を張る install.sh を書いて、それで十分回っています。
#!/bin/bash
# install.sh
DOTFILES="$HOME/dotfiles"
ln -sf "$DOTFILES/.zshrc" "$HOME/.zshrc"
ln -sf "$DOTFILES/.tmux.conf" "$HOME/.tmux.conf"
ln -sf "$DOTFILES/.config/nvim" "$HOME/.config/nvim"
echo "Done!"
「必要になったら導入する」——これもdotfiles管理の一つの正解です。
Dotfiles管理ツールの選び方フローチャート
flowchart TB
Start["🤔 Dotfiles管理ツール<br/>使うべき?"]
Q1{"複数マシンで<br/>同じdotfilesを使う?"}
Q2{"秘密情報(APIキー等)を<br/>リポジトリに含めたい?"}
Q3{"Gitの操作に<br/>慣れている?"}
Q4{"シンプルさを<br/>最優先したい?"}
Manual["📝 手動管理<br/>━━━━━━<br/><code>ln -s</code> + install.sh<br/><br/>シンプルで十分"]
Stow["🔗 GNU Stow<br/>━━━━━━<br/>シンボリックリンク特化<br/>依存なし・最軽量"]
Yadm["📦 yadm<br/>━━━━━━<br/>Gitラッパー<br/>学習コスト最小"]
Chezmoi["🚀 chezmoi<br/>━━━━━━<br/>テンプレート + 暗号化<br/>複数マシン最強"]
Dotbot["⚙️ Dotbot<br/>━━━━━━<br/>YAML宣言的管理<br/>セットアップ自動化"]
Start --> Q1
Q1 -->|No| Q4
Q1 -->|Yes| Q2
Q4 -->|Yes| Manual
Q4 -->|No| Stow
Q2 -->|Yes| Chezmoi
Q2 -->|No| Q3
Q3 -->|Yes| Yadm
Q3 -->|No| Dotbot
style Manual fill:#e3f2fd
style Stow fill:#e8f5e9
style Yadm fill:#fff3e0
style Chezmoi fill:#fce4ec
style Dotbot fill:#f3e5f5