Make $HOME More Exquisite

September 14, 2025

前段時間看到「码农的自我修养之保持干净的 $HOME 目录」,瞭解到了 xdg-ninja 這個工具。

我也是一個賽博潔癖。我還另外使用 stow 配合 git 管理我的 .config。這樣可以做到版本管理和快捷複製(duplicate)到其他環境。

XDG Base Directory Specification

就是 XDG 基本目錄規範,概念來自 freedesktop

具體都有這些細分。也就是我在 .zprofile 中 export 的路徑。

XDG_CONFIG_HOME = "$HOME/.config"
XDG_DATA_HOME   = "$HOME/.local/share"
XDG_STATE_HOME  = "$HOME/.local/state"
XDG_CACHE_HOME  = "$HOME/.cache"
# MacOS 下沒有指定的 RUNTIME 目錄,CACHE 效果相同
XDG_RUNTIME_DIR = "$HOME/.cache"

xdg-ninja

xdg-ninja 是一個能夠檢測你 $HOME 下不符合 XDG 基本目錄規範的檔案,然後給出對應的解決方案。當然也會有類似 .trash.yarn 或者 .anydesk 這類檢測到無法解決的目錄。

透過 Brew 安裝後,執行 xdg-ninja 檢測不合規範的目錄,然後根據對應的提示修改。我會同時安裝 glow ,讓輸出的內容顯示為渲染後的 Markdown 格式。

其中一個比較特殊的配置項就是 zsh,需要在 /etc/zshenv 中 export 對應的 $ZDOTDIR 路徑。

echo 'export ZDOTDIR="$HOME"/.config/zsh' | sudo tee -a /etc/zshenv

我將 zsh 目錄放置在 $HOME/.config/zsh,也就是上述的指令碼。

同時我也會使用外掛管理器 antidote,所以需要把 $HOME 下的 .zsh_plugins.txt 也手動放置在 $ZDOTDIR

遷移完配置檔案到 XDG 的標準目錄下後,我還需要版本管理。

stow

我第一次認識到這個工具是在 Dreams of Autonomy 頻道下的影片。但是我的管理方式會與他略有不同,我會把 .config 下的文件直接放置在 ~/dotfiles 內。

首先在 %HOME 下創建一個目錄 ~/dotfiles

因為我會把最終由 stow 管理的檔案上傳到 Gholts/dotfiles,所以不能把所有 .config 下的檔案全扔進 ~/dotfiles

挑選完沒有隱私資訊的配置文件後,就可以直接嘗試開始符號鏈接。前提是保證 .config 下沒有對應的文件,不然會連接失敗。

cd dotfiles

stow -t ~/.config .

配置就會被鏈接到 ~/.config。 如果需要編輯某一個受管理的配置檔案,直接打開原路徑即可,比如 nvim ~/.config/xxx/xxx.json

除此之外,我還需要使用 git 進行版本管理。

可以根據 4.2 Types And Syntax Of Ignore Lists 得知 stow 會預設屏蔽 git 產生的檔案。

可我需要創建 README,或是不想 .DS_Store 也被到處鏈接,需要一定的設定。

可以在 $HOME 下創建 .stow-global-ignore,將要排除的檔案名稱放進去。但十分遺憾,這個檔案本身並不支援 XDG 基本目錄規範。

取消 stow 的符號鏈接透過下面的程式碼。

cd dotfiles

stow -D .

在這些都完成之後,不僅 $HOME 目錄下整潔不少,關鍵的配置檔案也可以進行版本管理和遠端存儲。

最後我的 dotfiles 置在了 Gholts/dotfiles