Hyprland 配置(Lua)

Hyprland 我用 Lua 写(hyprland.lua),从老的 .conf 迁过来。Lua 的价值在重复结构——显示器、动画、循环绑定用函数表达,比一行行 monitor=... 清楚。但这份配置里对我最有用的其实是注释:把每块屏的硬件坑都记在旁边了。

三台 27" 按 EDID 描述匹配(desc:),换接口不用改配置,各自带物理旋转:

hl.monitor({ output="desc:LG Electronics LG HDR 4K ...",  -- 左上,物理 180° 倒装
             mode="3840x2160@60", position="0x0", scale=1.5, transform=2 })
hl.monitor({ output="desc:ASUSTek ... XG27UCS ...",       -- 左下主屏,4K@160
             mode="3840x2160@160", position="0x1440", scale=1.5, vrr=1 })
hl.monitor({ output="desc:CGC S27UHDIPSSR ...",           -- 右,竖屏,顺时针 90°
             mode="3840x2160@60", position="2560x0", scale=1.5, transform=1 })

旁边记着的坑都是真摔出来的:VRR 配 direct_scanout 在 AMD 上切全屏会黑屏,所以 VRR 按屏开;右边竖屏走 HDMI 最高只能 4K@30,要 60Hz 得换 HDMI 2.1 线或改走 DP(还得避开 DP-2/DP-3 撞 CRTC)。这些写下来,下次换线或重装不用再踩一遍——配置文件兼当硬件笔记。

键位主修饰键是 SUPER,大部分是常规的(T 终端、Q 关窗、F 全屏、M 启动器、SUPER+hjkl 切焦点、SUPER+SHIFT+hjkl 把工作区搬到那个方向的屏)。有两处是我特意改的:

hl.bind("ALT + Tab", hl.dsp.focus({ workspace = "m+1" }))  -- 切"当前这块屏"的工作区,不跨屏
hl.bind(mainMod.." + V", hl.dsp.exec_cmd(
  "cliphist list | fuzzel --dmenu | cliphist decode | wl-copy"))  -- 剪贴板历史

ALT+Tab 多屏下我宁可切当前屏的工作区,而不是满桌面找窗口;经典的切窗口挪去了 ALT+\``。SUPER+V` 调 cliphist 存的剪贴板历史,用 fuzzel 选一条贴回去。

窗口规则和动画也走 Lua 的表来写,比一行行 windowrulev2 = ... 清楚。规则按 class/title 匹配,把特定应用钉到固定行为上:计算器、文件选择框这类设成浮动并居中,某些应用强制丢到指定工作区,聊天软件透明度调一档。动画我留了一套偏快的曲线(bezier 自定缓动 + 较短时长)——平铺切换要"顺"但不能"慢",拖尾太长反而碍事;配合开了 VRR 的那几屏,观感是跟手优先。圆角、边框、模糊这些 decoration 也压在这层,所以 Ghostty 那种应用能自己光秃秃、装饰全由合成器统一加。

还有个小坑也记一下:Chrome 的绑定走的是 ~/.local/bin/google-chrome-stable 绝对路径,因为 Hyprland 的 PATH 不含 ~/.local/bin,裸名调不到;wrapper 里顺手钉了核显的 renderD 节点。配色由 matugen 注入。