---
title: Hyprland 配置(Lua)
url: https://doc.liz6.com/tools/hyprland/02-hyprland
locale: zh
area: tools
tags:
- tools
- hyprland
date: null
modified: 2026-06-30
description: 用 Lua 写的 Hyprland —— 三屏按 EDID 认、把硬件坑写进注释,以及几个改过的键位。
---

# Hyprland 配置(Lua)

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

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

```lua
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` 把工作区搬到那个方向的屏)。有两处是我特意改的:

```lua
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](../ghostty.md) 那种应用能自己光秃秃、装饰全由合成器统一加。

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