剪贴板历史面板 — 快捷键集成说明
剪贴板历史面板 — 快捷键集成说明
本文档说明 iamcheyan.clipboard 插件的快捷键触发机制,以及曾经遇到的
问题与解决过程,供后续维护参考。
调用链路
用户按下 fn+v
→ keyd(muhenkan 层)将其转换为 Ctrl+Alt+V
→ Labwc(rc.xml)检测到 A-C-v,执行
→ ~/.config/labwc/scripts/clipboard-history
→ quickshell ipc --pid <pid> call iamcheyan.clipboard toggleAtCursor
→ 顶栏剪贴板历史面板弹出
各组件的配置位置
| 组件 | 文件 | 关键内容 |
|---|---|---|
| keyd 键盘映射 | modules/keyd.nix |
settings.muhenkan.v = "C-M-v" |
| Labwc 快捷键绑定 | modules/labwc/labwc/rc.xml |
<keybind key="A-C-v"> → clipboard-history |
| 触发脚本 | modules/labwc/labwc/scripts/clipboard-history |
查找 quickshell PID,通过 IPC 调用插件 |
| 插件 IPC 接口 | ClipboardPanel.qml |
ipc function toggleAtCursor() |
触发脚本详解
文件:modules/labwc/labwc/scripts/clipboard-history
# 确保 Wayland 环境变量存在(Labwc Execute 动作继承的环境可能缺失)
export WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-wayland-0}"
export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
QS=/run/current-system/sw/bin/quickshell
# 从进程列表中找到带有 -p 参数的 quickshell 实例
pid="$(ps -eo pid=,args= | awk '/[q]uickshell/ && / -p / { print $1; exit }')"
if [[ -n "$pid" ]]; then
exec "$QS" ipc --pid "$pid" call iamcheyan.clipboard toggleAtCursor
fi
关键点:
- 用绝对路径
/run/current-system/sw/bin/quickshell调用,不依赖PATH里有qs - quickshell 以
quickshell -p /path/to/config启动,IPC 必须用--pid指定 实例,直接quickshell ipc call ...会报Could not find "default" config directory
问题历史与根因分析
问题现象(2026-09 遇到)
Ctrl+Alt+V可以正常弹出剪贴板面板 ✓fn+v没有任何反应 ✗
排查过程
第一阶段:怀疑脚本路径问题
clipboard-history 脚本用 exec qs ipc ... 调用,但 Labwc 通过
rc.xml Execute 动作触发脚本时,继承的环境 PATH 可能不包含
/run/current-system/sw/bin,导致 qs 命令找不到。
修复:将 qs 改为绝对路径 /run/current-system/sw/bin/quickshell,
同时补充 WAYLAND_DISPLAY / XDG_RUNTIME_DIR 的兜底导出。
结果:Ctrl+Alt+V 依然工作,但 fn+v 仍无反应。
第二阶段:定位到 F13 keysym 问题
原始设计是 fn+v → keyd 发出 F13 → Labwc <keybind key="F13"> 触发。
验证发现:
- PID 提取正确(
ps -eo pid=,args=awk 能匹配到正确的进程) quickshell ipc --pid <pid> call iamcheyan.clipboard toggleAtCursor执行成功(exit 0)Ctrl+Alt+V(A-C-v)绑定工作正常- 但 F13 绑定完全没有触发
根本原因:Labwc 对 F13 keysym 的识别不可靠。keyd 将 f13
转换为 xkb keysym 后,Labwc 未能将其匹配到 <keybind key="F13">。
(具体原因可能是 xkb keysym 大小写、或 Labwc 对非标准功能键的处理差异)
最终修复:绕开 F13 中间层,直接在 keyd 层映射:
# keyd.nix — muhenkan 层
v = "C-M-v"; # 直接发出 Ctrl+Alt+V,跳过 F13
Ctrl+Alt+V 绑定已验证可靠,fn+v 现在走同一条路径,问题彻底解决。
可用快捷键汇总
| 快捷键 | 描述 |
|---|---|
fn+v |
弹出/关闭剪贴板历史面板(MINILA-R 键盘专用) |
Ctrl+Alt+V |
同上(通用,任意键盘均可用) |
Win+v |
直接粘贴(wtype,不经过剪贴板历史) |