如何解析Hyprland配置以在AGSv2/Astal GUI中使用?
Hyprland快捷键可视化实现方案(适配AGSv2/Astal)
需求概述
我计划用TypeScript解析Hyprland的快捷键配置,在Aylur's Gtk Shell 2(简称AGSv2/Astal)中实现类似按下Super+/唤起的快捷键展示窗口——窗口会清晰显示每个快捷键对应的功能。
已完成的配置提取步骤
我已经写出单行Shell命令,可从Hyprland快捷键配置文件中提取所有bind=条目:
cat ~/.config/hypr/config/keybindings/default.conf | grep "^bind.*=" | sed 's/#.*//; s/.*= //; s/[ \t]*$//'
该命令的示例输出如下:
$mainMod, 1, workspace, 1 $mainMod, 2, workspace, 2 $mainMod, 3, workspace, 3 $mainMod, 4, workspace, 4 $mainMod, 5, workspace, 5 $mainMod, 6, workspace, 6 $mainMod, 7, workspace, 7 $mainMod, 8, workspace, 8 $mainMod, 9, workspace, 9 $mainMod, 0, workspace, 10 , XF86MonBrightnessUp, exec, brightnessctl -q s +10% , XF86MonBrightnessDown, exec, brightnessctl -q s 10%-
参考配置文件示例
# ----------------------------------------------------- # Key bindings # name: "Default" # ----------------------------------------------------- # Super key $mainMod = SUPER # 设置Windows键为主修饰键 # 工作区切换 bind = $mainMod, 1, workspace, 1 # 切换到工作区1 bind = $mainMod, 2, workspace, 2 # 切换到工作区2 bind = $mainMod, 3, workspace, 3 # 切换到工作区3 bind = $mainMod, 4, workspace, 4 # 切换到工作区4 bind = $mainMod, 5, workspace, 5 # 切换到工作区5 bind = $mainMod, 6, workspace, 6 # 切换到工作区6 bind = $mainMod, 7, workspace, 7 # 切换到工作区7 bind = $mainMod, 8, workspace, 8 # 切换到工作区8 bind = $mainMod, 9, workspace, 9 # 切换到工作区9 bind = $mainMod, 0, workspace, 10 # 切换到工作区10 # 亮度调节 bind = , XF86MonBrightnessUp, exec, brightnessctl -q s +10% # 亮度增加10% bind = , XF86MonBrightnessDown, exec, brightnessctl -q s 10%- # 亮度减少10%
目标需求
需要将提取到的内容转换为TypeScript可直接解析的格式,或者可被TypeScript读取的Shell变量,以便在Hyprland/AGSv2启动时自动映射这些快捷键,用于展示窗口的渲染。
实现方案
方案1:Shell命令输出JSON格式(直接供TypeScript解析)
调整提取命令,将输出转换为标准JSON数组,同时保留配置中的注释作为描述字段:
cat ~/.config/hypr/config/keybindings/default.conf | grep "^bind.*=" | sed 's/^\(bind = .*\)# \(.*\)$/\1|||\2/; s/#.*//; s/.*= //; s/[ \t]*$//' | jq -R 'split("|||") | .[0] | split(", ") | {modifier: .[0], key: .[1], action: .[2], args: .[3:], description: (.[-1] // "")}' | jq -s '.'
输出示例:
[ { "modifier": "$mainMod", "key": "1", "action": "workspace", "args": ["1"], "description": "切换到工作区1" }, { "modifier": "", "key": "XF86MonBrightnessUp", "action": "exec", "args": ["brightnessctl -q s +10%"], "description": "亮度增加10%" } ]
在TypeScript中,可通过child_process.exec调用该命令,解析JSON后用hyprctl getoption mainMod获取$mainMod的实际值完成变量替换。
方案2:TypeScript中直接解析原始输出
在AGSv2的TypeScript代码中直接执行提取命令,逐行解析并处理变量替换、描述生成:
import { exec } from 'child_process'; // 获取Hyprland配置中的变量值(如$mainMod) const getHyprVar = async (varName: string): Promise<string> => { return new Promise((resolve, reject) => { exec(`hyprctl getoption ${varName} | awk '/value/ {print $2}'`, (err, stdout) => { if (err) reject(err); resolve(stdout.trim()); }); }); }; // 解析Hyprland快捷键配置 export const parseKeybinds = async () => { const mainMod = await getHyprVar('mainMod'); return new Promise<Array<{ modifier: string; key: string; action: string; description: string; }>>((resolve, reject) => { exec(`cat ~/.config/hypr/config/keybindings/default.conf | grep "^bind.*=" | sed 's/^\(bind = .*\)# \(.*\)$/\1|||\2/; s/#.*//; s/.*= //; s/[ \t]*$//'`, (err, stdout) => { if (err) reject(err); const keybinds = stdout.trim().split('\n').map(line => { const [rawBind, description = ''] = line.split('|||'); const [mod, key, action, ...args] = rawBind.split(', '); // 替换变量 const resolvedMod = mod === '$mainMod' ? mainMod : mod; // 自动生成描述(如果配置中无注释) let autoDesc = description; if (!autoDesc) { if (action === 'workspace') autoDesc = `切换到工作区 ${args[0]}`; else if (action === 'exec' && args[0].includes('brightnessctl')) { autoDesc = args[0].includes('+') ? '亮度增加10%' : '亮度减少10%'; } else autoDesc = `${action} ${args.join(' ')}`; } return { modifier: resolvedMod, key, action, description: autoDesc.trim() }; }); resolve(keybinds); }); }); }; // 使用示例:在AGSv2组件中调用 parseKeybinds().then(keybinds => { // 将keybinds传递给展示窗口的UI组件 console.log('解析完成的快捷键列表:', keybinds); });
内容的提问来源于stack exchange,提问作者Spring
相关产品推荐
相关产品推荐

