個人 Hyprland + Omarchy 環境自訂腳本
這組腳本用於自動化設定我的個人 Linux 環境。基於 Omarchy + Hyprland,主題是「把 macOS 的操作手感移植到 Arch Linux」。
- 個人用途:不是通用的安裝腳本,是為了自己每次重灌後能快速恢復工作環境
- 自動化:所有設定都透過 script 完成,不依賴 GUI 工具或互動精靈
- 可重複:可以隨時還原/重新安裝,不會汙染系統
| 分類 | 腳本 | 功能 |
|---|---|---|
| 系統設定 | setup-fonts.sh |
字體 + Chromium scale 修復 |
| 系統設定 | setup-looknfeel.sh |
Hyprland Look & Feel (圓角、陰影、動畫、漸層邊框 |
| 輸入法 | setup-input.sh |
fcitx5-rime + 快速倉頡 |
| 鍵盤 | setup-macos-input.sh |
鍵盤/觸控板 macOS 行為 |
| 鍵盤 | setup-keyboard-swap.sh |
交換內建鍵盤 Super/Alt (Optional) |
| 快捷鍵 | setup-keybindings.sh |
截圖、錄影、剪貼簿自動貼上 |
| 遊戲相容 | setup-gaming.sh |
gamescope + 遊戲環境變數 + 視窗規則 |
| 容器工具 | setup-distrobox.sh |
Distrobox + DistroShelf + de alias |
| 修復工具 | fix-chrome-keyring.sh |
Chrome keyring 密碼彈窗修復 |
| 修復工具 | fix-spotify-scale.sh |
Spotify 1080p 縮放修復 |
| 相容包裝 | setup-rime-scj.sh |
[舊版] 字體 + 輸入法組合(已拆分) |
# 互動選單(預設)
./setup-all.sh
# 一鍵安裝所有
./setup-all.sh -i
# 檢查所有設定狀態
./setup-all.sh -s
# 單獨執行特定腳本
./setup-fonts.sh -i # 安裝
./setup-fonts.sh -u # 還原
./setup-fonts.sh -s # 檢查狀態目標: 統一顯示環境,避免 HiDPI UI 過大的問題
- GTK 字體:MiSans 10
- 為什麼:支援 CJK、個人覺得耐看
- Chromium scale:設定為 1
- 為什麼:Hyprland 已經處理 HiDPI,Chromium 再縮放會造成 UI 過大
目標: 自訂 Hyprland 的 Look & Feel,讓視覺更現代化且動畫更流暢
- 漸層邊框:橘紅色漸層 (f38d70 → fd6883)
- 為什麼:比預設的青藍色更有溫度
- 視窗圓角:10px 圓角
- 為什麼:更現代的視覺風格
- 陰影 & 毛玻璃:強化版 blur + shadow
- 為什麼:增加視覺層次感
- 未聚焦視窗暗化:dim_inactive + dim_strength = 0.25
- 為什麼:更容易分辨哪個視窗是焦點
- 流暢動畫曲線:自訂 Bezier 曲線 + 精心調整的速度
- 為什麼:比預設更細緻順暢的動畫體驗
- 邊框拖曳調整大小:resize_on_border = true
- 為什麼:更直覺的視窗大小調整
目標: 在 Wayland 環境下使用順手的中文輸入法
- fcitx5 + rime
- 為什麼:Wayland 原生支援,rime 詞庫可同步、彈性高
- 快速倉頡 (scj6)
- 為什麼:比傳統倉頡學習成本低,重碼率低,適合日常使用
- 啟動時預設英文模式
- 為什麼:多數時候在打程式或英文,預設英文減少切換次數
- F4 切換輸入法方案(scj6 ↔ 倉頡五代)
- 右 Shift 切換中英文
- 自動部署:執行後會自動重啟 fcitx5 並等待部署完成(最長 10 秒)
直接寫入 fcitx5 profile 設定檔:不透過 GUI 精靈,避免卡住 script
目標: 把 macOS 的鍵盤/觸控板操作手感移植到 Hyprland
| 設定 | 值 | 為什麼 |
|---|---|---|
| repeat_rate | 60 | Arch 預設 25 太慢,macOS 約 60 |
| repeat_delay | 200ms | 比預設 660ms 短,更快開始重複 |
| natural_scroll | true | macOS muscle memory |
| tap-to-click | true | macOS trackpad 習慣 |
| scroll_factor | 0.7 | 滾輪速度更快 |
目標: 在主系統內隔離其他發行版,卻仍能整合使用
- Distrobox
- 為什麼:輕量、shared home、支援 Wayland socket 共享,直接用主系統的字體/主題
- DistroShelf
- 為什麼:圖形化管理容器內安裝的 GUI 程式
dealias- 為什麼:
de ubuntu比distrobox enter ubuntu少打很多字
- 為什麼:
目標: 將 Laptop 內建鍵盤的 Super 和 Alt 交換,適合外接鍵盤用 Mac 配置的使用者
- 交換時機:需要外接鍵盤使用 Mac 配置(Cmd=Alt, Alt=Super)但又不想要打擾內建鍵盤
- 實作方式:透過 Hyprland 的 per-device XKB options,只針對內建鍵盤應用
altwin:swap_alt_win - 互動式選單:執行時會顯示所有偵測到的鍵盤,讓使用者選擇要套用的鍵盤(內建鍵盤會被自動標記)
- Swap 效果:
- Alt 鍵 → 變成 Super 鍵(可拉視窗選單、Super+數字切換workspace)
- Super 鍵 → 變成 Alt 鍵(可當 Ctrl+Alt+T 之類的組合鍵)
目標: 截圖、螢幕錄影、剪貼簿的自訂快捷鍵
| 快捷鍵 | 功能 |
|---|---|
Alt+Shift+Q |
區域截圖 |
Alt+Shift+E |
視窗截圖 |
Alt+Shift+F |
全螢幕截圖 |
Alt+Shift+R |
螢幕錄影 |
Alt+Shift+A |
顏色選擇器 |
| `Ctrl+`` | 開啟剪貼簿管理員 |
- 自動貼上:選取剪貼項目後自動複製並貼上(透過
hyprctl dispatch sendshortcut) - Pin 功能:重要項目可固定在列表頂部
目標: gamescope 微合成器 + 遊戲視窗規則
- gamescope:微合成器,把遊戲包在獨立的 Wayland 視窗中
- 自訂視窗規則:針對特定遊戲的 float/center 規則
- Steam 啟動選項範本:
gamescope -W 1920 -H 1080 -f -- %command%
注意:Omarchy v3.7.0 已移除
SDL_VIDEODRIVER環境變數(它反而會搞壞 Proton 遊戲)。本腳本不再設定任何 X11 相關 env vars。
目標: 解決 Chrome/Chromium 每次啟動都詢問 keyring 密碼的問題
- 建立未加密的預設 keyring
- 移除多餘的 keyring 檔案
- 需要重新登入才能生效
- Omarchy Linux (Arch-based)
- Hyprland (Wayland)
- 需要有
yay或paru(AUR 助手) 或sudo可用
.
├── lib/
│ └── common.sh # 共用函式庫(顏色、紀錄函數、套件管理等)
├── setup-all.sh # 主程式,自動探索所有腳本 + 互動選單
├── setup-fonts.sh # 字體設定
├── setup-input.sh # 輸入法設定
├── setup-macos-input.sh # 鍵盤/觸控板設定
├── setup-keyboard-swap.sh # 交換內建鍵盤 Super/Alt
├── setup-keybindings.sh # 截圖/錄影/剪貼簿快捷鍵
├── setup-gaming.sh # 遊戲相容性設定
├── setup-distrobox.sh # Distrobox 容器工具
├── fix-chrome-keyring.sh # Chrome keyring 密碼彈窗修復
├── fix-spotify-scale.sh # Spotify 1080p 縮放修復
├── test-idempotency.sh # 冪等性測試工具
└── setup-rime-scj.sh # [舊版] 相容包裝
所有腳本都支援一致的命令列參數:
| 參數 | 功能 |
|---|---|
-i, --install |
安裝/套用設定 |
-u, --uninstall |
還原設定 |
-s, --status |
顯示目前狀態 |
-h, --help |
顯示說明 |
新增任何會修改設定檔的腳本之前,請務必先通過這份清單:
- 冪等性測試: 連續執行
-i兩次,確認第二次執行後設定檔內容完全不變 - sed 安全性: 所有
sed取代字串中的&都必須跳脫為\& - grep 安全性: 所有包含
\s的 grep 都必須使用-Eflag - 狀態檢查:
-s參數能正確判斷是否已安裝 - 移除功能:
-u能完全清理所有新增的內容 - 無重複: 連續執行兩次不會在設定檔中產生重複行
只要在開頭加上 metadata 註解,就會自動出現在 setup-all.sh 選單中:
#!/bin/bash
# my-new-script.sh
# 我的新腳本功能說明
# Category: 系統設定
# Description: 腳本功能描述(會顯示在選單中)
SCRIPT_NAME="$(basename "$0")"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 載入共用函式庫
source "$SCRIPT_DIR/lib/common.sh"
# 實作標準函數
install() { info "安裝中..." }
uninstall() { info "還原中..." }
show_status() { info "顯示狀態..." }
# 主程式
main() {
case "${1:-}" in
-u|--uninstall) uninstall ;;
-s|--status) show_status ;;
-h|--help) usage ;;
-i|--install|"") install ;;
esac
}
main "$@"自動驗證所有腳本的冪等性,確保執行兩次後設定檔內容完全相同:
# 測試所有腳本
./test-idempotency.sh
# 測試單一腳本
./test-idempotency.sh setup-keybindings.sh為什麼需要? 這個專案的核心設計原則是「可重複執行」,但 bash 腳本很容易因為 sed 的 & 展開、echo >> 累加寫入、TOML section 解析等問題,導致每次執行都改變設定檔內容。這些 bug 不會立刻出錯,但會讓設定檔指數級膨脹或損壞(例如之前剪貼簿 command 欄位每次執行都重複堆疊的問題)。這個測試確保每次修改腳本後,不會意外引入堆疊 bug。
- 記錄函數:
info(),warn(),error(),detail(),header()- 自動套用顏色 - 套件管理:
check_package(),install_package()- 自動偵測 paru/yay/sudo - 工具函數:
config_contains(),ensure_dir(),create_backup()
曾造成的 bug: setup-keybindings.sh 剪貼簿設定指數級腐敗
# ❌ 錯誤寫法 - 會造成指數級堆疊腐敗!
sed -i 's/^command=.*$/command = "wl-copy && sleep 0.2"/' file
# ✅ 正確寫法
sed -i 's/^command=.*$/command = "wl-copy \&\& sleep 0.2"/' file為什麼: 在 sed 的取代字串中,& 代表「整個比對到的內容」,不是字面的 &。每次執行都會把舊內容塞進新字串中,指數級膨脹。
# ❌ 不可靠 - 基本 POSIX grep 不支援 \s
grep -q '^command\s*=' file
# ✅ 正確寫法
grep -Eq '^command\s*=' file任何會修改設定檔的腳本,跑兩次應該得到完全相同的結果:
| ✅ 正確做法 | ❌ 錯誤做法 |
|---|---|
| 先檢查是否已存在 → 才修改 | 永遠直接 append (>>) 不檢查 |
cat > file (覆蓋寫入) |
cat >> file (累加寫入) |
sed -i 's/old/new/' 有 guard check |
裸 sed -i 不檢查 |
修改後 cat 內容驗證 |
修改後就不管了 |
# 1. 檢查設定檔是否正常
grep '^command' ~/.config/elephant/clipboard.toml
# 應顯示: command = 'wl-copy && hyprctl dispatch sendshortcut "SHIFT, Insert,"'
# 2. 確認服務執行中
pgrep -a elephant && pgrep -a walker
# 3. 有問題就重啟
systemctl --user restart elephant
# 4. 驗證腳本冪等性
cd ~/omarchy-custom-scripts
./setup-keybindings.sh -i # 第一次
./setup-keybindings.sh -i # 第二次 → 設定檔內容必須完全相同MIT License