我在安裝與設置 arch linux 相關套件與配置檔時,透過 AI 助手查詢經常都會出現 "XDG" 這個字眼。好奇之餘再請 AI 詳加介紹,原來它最主要是用來規範 Linux 的使用者配置檔案的目錄結構。
這太棒了!我一直都覺得 home 根目錄下的 ".' 開頭的設定檔案相當繁雜凌亂,能有一種統一的規範標準 (但這不是強制),可以做好有效組織這些配置檔,讓其井然有序,這肯定是喜聞樂見的。
由於我的 SHELL 都是使用 zsh + zinit + powerlevel10k (p10k),這些相關的配置就已經挺繁多的,所以就先從 Zsh 符合 XDG 規範開始。以下就分享如何逐步讓 Zsh 遷移到 XDG 規範的目錄結構設置,首先就先簡單說明下什麼是 XDG。
XDG 規範簡介
XDG 基本目錄規範(XDG Base Directory Specification)是由 freedesktop.org(原名 X Desktop Group,簡稱 XDG)組織制定的標準,旨在統一 Linux/Unix 系統中使用者檔案的存放位置。該規範定義了幾個關鍵環境變數,指導應用程式將設定檔、快取資料和資料檔案存放在特定位置:
$XDG_CONFIG_HOME(預設為~/.config):存放使用者特定的應用程式設定檔$XDG_DATA_HOME(預設為~/.local/share):存放使用者特定的資料檔案$XDG_CACHE_HOME(預設為~/.cache):存放非必要的快取資料$XDG_STATE_HOME(預設為~/.local/state):存放應用程式狀態資料
這套規範的主要目的是減少家目錄中的雜亂,讓應用程式的設定檔和資料有組織地存放在特定目錄中,而不是直接散落在家目錄的根目錄下。雖然 freedesktop.org 組織已改名,但 "XDG" 這個前綴仍被保留在相關的規範、環境變數和工具名稱中,成為促進桌面環境互操作性和標準化的重要標誌。
設置步驟
建議的XDG目錄結構
先瞧下將 Zsh 與相關插件依照 XDG 規範後的主要目錄結構框架如下:
~/.config/zsh/
├── zshrc
├── p10k.zsh
└── plugins/
└── zinit/
~/.local/state/zsh/ # 用於 zcompdump 等快取
~/.cache/zsh/ # 用於插件快取
~/.zshenv (負責設定 XDG 路徑,這檔案要放在 $HOME 下)
# ~/.zshenv
# XDG paths
export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}"
export XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
export XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
# XDG for zsh
export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
# zsh will load $ZDOTDIR/.zshrc automatically
~/.config/zsh/.zshrc
.zshrc 是 Zsh shell 的主要配置檔案,每次啟動互動式 shell 時會被讀取,用於設定環境變數、定義別名和函數、配置 shell 選項、設定命令提示符、載入插件和主題,以及自定義 shell 的整體行為和外觀。
我因為安裝了 Zinit 許多的插件與 p10k (以及 alias 別名,使用另一檔案配置),所以該配置檔案內容眾多,在此就不一一敘述,其實這可以將以下內容複製後交給 AI 解析然後列出條列說明就很容易理解。
### Powerlevel10k 即時提示(放在文件頂部)
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/zsh/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/zsh/p10k-instant-prompt-${(%):-%n}.zsh"
fi
### 基本 Zsh 配置
HISTFILE="${XDG_STATE_HOME}/zsh/history"
HISTSIZE=1000
SAVEHIST=1000
bindkey -e
# 自動補全配置
export ZSH_COMPDUMP="${XDG_CACHE_HOME}/zsh/zcompdump-${ZSH_VERSION}"
autoload -Uz compinit
compinit -d "$ZSH_COMPDUMP"
# 其他基本設置
zstyle ':completion:*' menu select
setopt AUTO_CD
setopt EXTENDED_GLOB
# 設置 Neovim 為預設編輯器
export EDITOR=nvim
export VISUAL=nvim
### Added by Zinit's installer (modified for XDG)
export ZINIT_HOME="${XDG_DATA_HOME}/zinit/zinit.git"
if [[ ! -f $ZINIT_HOME/zinit.zsh ]]; then
print -P "%F{33} %F{220}Installing %F{33}ZDHARMA-CONTINUUM%F{220} Initiative Plugin Manager (%F{33}zdharma-continuum/zinit%F{220})…%f"
command mkdir -p "${XDG_DATA_HOME}/zinit" && command chmod g-rwX "${XDG_DATA_HOME}/zinit"
command git clone https://github.com/zdharma-continuum/zinit "$ZINIT_HOME" && \
source "$ZINIT_HOME/zinit.zsh"
else
source "$ZINIT_HOME/zinit.zsh"
fi
autoload -Uz _zinit
(( ${+_comps} )) && _comps[zinit]=_zinit
### 使用 Zinit 安裝插件
zinit ice depth=1
zinit light romkatv/powerlevel10k
zinit light zdharma-continuum/fast-syntax-highlighting
zinit light zsh-users/zsh-autosuggestions
zinit light zsh-users/zsh-completions
zinit light agkozak/zsh-z
### 使用 Zinit 安裝插件
# Powerlevel10k 主題
zinit ice depth=1
zinit light romkatv/powerlevel10k
# 語法高亮
zinit light zdharma-continuum/fast-syntax-highlighting
# 自動建議
zinit light zsh-users/zsh-autosuggestions
# 補全
zinit light zsh-users/zsh-completions
# 設定 zsh-z 資料檔案位置
export ZSHZ_DATA="${XDG_STATE_HOME}/zsh/z"
# 自動跳轉
zinit light agkozak/zsh-z
# To customize prompt, run `p10k configure` or edit p10k.zsh.
[[ ! -f "${ZDOTDIR}/p10k.zsh" ]] || source "${ZDOTDIR}/p10k.zsh"
# 加載別名
if [ -f "${ZDOTDIR}/aliases.zsh" ]; then
source "${ZDOTDIR}/aliases.zsh"
fi
遷移或重新配置設定檔
可以查看下目前 Home 根目錄與 Zsh 有關的配置檔案,例如 p1k.zsh、.z、.histfile 等,如想沿用就可以直接使用 mv 指令搬移到 ~/.config/zsh 目錄下。我是為了省事,直接就刪除掉重新再建立即可。另外注意除了 .zshrc 檔案仍需要檔名前加上 "."(否則 .zshenv 無法辨識) 外,其它配置檔案就可以不用前綴再加上 "." 。
至於如果有安裝 Zinit 管理插件,最好是重新 Clone 到 XDG 的目錄下
mkdir -p ~/.config/zsh/plugins/zinit
git clone https://github.com/zinit-zsh/zinit.git ~/.config/zsh/plugins/zinit/zinit.git
最後,若測試正常,就可以刪除到原來位於根目錄下相關的 Zsh 配置檔案了。
rm ~/.zshrc ~/.zprofile ~/.zsh_history ~/.p10k.zsh
