You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:50:54