讓 Zsh 符合 XDG 規範在 Arch Linux 上的設置

我在安裝與設置 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

留下第一條留言