当前位置: 首页 > news >正文

Mac 党转 Linux 必看:用 keyd 复刻你最熟悉的快捷键习惯

Linux 下用 keyd 把 Super 键改成 Mac 风格的 Cmd# Linux Wayland 下把 Super 键改成 Mac 风格的 Cmd(keyd 全流程)

本文记录一次完整的键位改造:把Super(也称 Cmd/Win 键)映射为 macOS 的Command,覆盖复制粘贴 / 启动应用 / 关闭窗口等高频操作。最终效果是按住Super+C/V/X/Z/A/Q/W/S/T/M就等于Ctrl+...,按住Super+Tab切换应用,点按Super触发活动概览,且Super+R完全屏蔽。

适用系统:Ubuntu 22.04+ / GNOME Wayland(其他 Wayland 桌面类似,X11 方案更简单,文末会提)。


一、背景与方案选型

我平时用 Mac 习惯了Cmd+C/Cmd+V,切到 Linux GNOME 很不顺手。一开始想用xbindkeys + xdotool做键位翻译,踩了一堆坑:

方案问题
GNOME 自带快捷键 (Settings → Keyboard)改不了应用级快捷键(复制/粘贴/撤销/全选)
xbindkeys + xdotoolWayland 下对 Chrome / IDEA 这种 XWayland 应用经常抓不到合成键事件
keyd(内核层 evdev 重映射)✅ 任何 session、任何应用都生效,本次最终方案

keyd的核心优势:在内核输入子系统层就改键,不依赖 X11/Wayland 协议,所有应用通吃


二、安装 keyd

sudoaptinstall-ykeyd

Ubuntu 仓库里就有(v2.5.0+)。装完会自动启动 systemd 服务/lib/systemd/system/keyd.service,二进制在/usr/bin/keyd.rvaiya

验证:

systemctl status keyd# 应该看到 active (running)

三、配置文件结构

主配置:/etc/keyd/default.conf。所有要重映射的键都写在这里。

我们的目标:

行为按键
点按 Super触发 GNOME 活动概览
按住 Super + C复制
按住 Super + V粘贴
按住 Super + X剪切
按住 Super + Z撤销
按住 Super + A全选
按住 Super + Q退出应用
按住 Super + W关闭窗口
按住 Super + S保存
按住 Super + T打开 gnome-terminal
按住 Super + M打开 marktext
按住 Super + Tab应用切换器
按住 Super + Space输入源切换
按住 Super + R无动作

四、最终配置文件

[ids] * [main] # Hold Super: activates [mac] layer (Super behaves as Ctrl) # Tap Super: emits a leftmeta keypress (mutter triggers activities overview) leftmeta = overload(mac, leftmeta) rightmeta = overload(mac, rightmeta) # Composite layer inheriting Ctrl base (Super+letter acts like Ctrl+letter) [mac:C] # Launch apps (need the helper script — see section 5) t = command(/usr/local/bin/keyd-launch /usr/share/applications/org.gnome.Terminal.desktop) m = command(/usr/local/bin/keyd-launch /usr/share/applications/marktext.desktop) # Pass-through Meta combinations tab = M-tab space = M-space r = noop escape = M-escape # Letter keys -> Ctrl + same key c = C-c v = C-v x = C-x z = C-z a = C-a q = C-q w = C-w s = C-s

加载并启用:

sudosystemctl restart keydsudokeyd.rvaiya reload

五、关键语法解读

1.overload(<layer>, <tap_action>)

这是整个方案的灵魂:

leftmeta = overload(mac, leftmeta)

含义:

  • 按住Super 时:激活[mac]层(在这个层里所有按键都被重新映射)
  • 点按Super 时:执行 tap action,也就是发一个leftmeta按键事件给 mutter

mutter 看到 Super 就触发「活动概览」,所以点按 Super = 活动概览,按住 = 进[mac]层。

注意:

  • <tap_action>必须是合法键名。用meta会报错,正确是leftmeta/rightmeta
  • keyd.rvaiya list-keys可以看所有合法键名

2. 复合层[mac:C]

[mac:C]

冒号:C表示「继承 Ctrl 作为基修饰键」。意思是:

  • 显式映射的键(如c = C-c)按映射执行
  • 没显式映射的字母键(比如ef)自动加上 Ctrl 前缀,即Ctrl+ECtrl+F

这正是 macOS 的语义:Cmd+字母在 macOS 里很多就是Ctrl+字母的快捷键。

3. 修饰键前缀

keyd 的修饰键语法用单字母前缀:

写法含义
C-cCtrl + C
M-tabSuper + Tab
A-f4Alt + F4
S-insertShift + Insert
C-S-aCtrl + Shift + A

4.noop—— 让某个键完全失效

r = noop

按住 Super+R 时什么也不发,不映射到任何应用行为。

5.command()—— 启动外部应用

t = command(/usr/bin/gnome-terminal)

但是有坑:keyd 以 root 运行,没有用户会话环境(Wayland socket、DBus 都是用户私有的),直接command(/usr/bin/xxx)启动 GUI 应用会失败。详见下一节。


六、桥接脚本:让 command() 能启动 GUI 应用

keyd作为 systemd 服务以 root 跑,root 默认访问不到:

  • /run/user/1000/wayland-0—— Wayland 显示 socket(jun 私有)
  • /run/user/1000/bus—— 用户 DBus
  • /run/user/1000/.mutter-Xwaylandauth.XXX—— Xwayland 鉴权文件

所以command(/usr/bin/gnome-terminal)直接调用会立即退出,没有 GUI 窗口。

解决方案:写一个桥接脚本,切到 jun 用户身份 + 注入环境变量,用gio launch走 GNOME 应用激活通道。

创建/usr/local/bin/keyd-launch

#!/bin/bash# keyd 调用 GUI 应用时的桥接脚本# keyd 以 root 跑,没有用户会话环境 — 通过这里切到 jun 并加载 Wayland/DBus 环境execsudo-ujunenv\WAYLAND_DISPLAY=wayland-0\DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus\XDG_RUNTIME_DIR=/run/user/1000\XDG_SESSION_TYPE=wayland\gio launch"$@"

加上可执行权限:

sudochmod+x /usr/local/bin/keyd-launch

然后在 keyd 配置里这样用:

t = command(/usr/local/bin/keyd-launch /usr/share/applications/org.gnome.Terminal.desktop) m = command(/usr/local/bin/keyd-launch /usr/share/applications/marktext.desktop)

几个关键点

  • sudo -u jun:root 用 sudo 默认免密,可以直接切到普通用户
  • WAYLAND_DISPLAY=wayland-0:对应/run/user/1000/wayland-0
  • DBUS_SESSION_BUS_ADDRESS:对应/run/user/1000/bus
  • gio launch <desktop>:对DBusActivatable=true的应用(如 gnome-terminal)特别稳,会走标准的 DBus 激活机制;如果应用不是 DBus activatable,gio launch也会按 desktop 文件的Exec=字段启动

注:把环境变量硬编码成wayland-0/run/user/1000在单用户机器上没问题。如果用户 ID 不同需要相应调整。


七、本次踩过的所有坑

记录一下,方便后来人。

坑 1:行尾#注释导致解析失败

c = C-c # 复制 ← 这样写会让 keyd 报 "invalid key or action" c = C-c ← 必须把注释挪到独立行

keyd 的解析器不支持 inline 注释,所有#注释必须独占一行。

坑 2:合法的 Meta 键名是leftmeta/rightmeta,不是meta

leftmeta = overload(mac, meta) ← ❌ "invalid key or action" leftmeta = overload(mac, leftmeta) ← ✅

查合法名:keyd.rvaiya list-keys | grep meta

坑 3:exec()不存在,要用command()

keyd 命名习惯不同:

t = exec(/usr/bin/xxx) ← ❌ t = command(/usr/bin/xxx) ← ✅

坑 4:复合层语法是[name:base]

[mac] ← ❌ 在里面用 C-c 会报 invalid [mac:C] ← ✅ 继承 Ctrl 基修饰键

:C中的C是修饰键代码之一(C = Ctrl, M = Meta, A = Alt, S = Shift)。

坑 5:overload的第二参数必须是合法键名

不是任意 action,是键名

overload(mac, meta) ← ❌ meta 不是键名 overload(mac, leftmeta) ← ✅ overload(mac, esc) ← ✅ (capslock 示例)

坑 6:root 跑 keyd,启动 GUI 应用要桥接

直接command(/usr/bin/gnome-terminal)不会出错但会立即退出,没有窗口。要用第六节的桥接脚本。


八、调试与维护

查看当前生效配置

sudokeyd.rvaiya reload# 热加载(修改配置后用)journalctl-ukeyd-n20# 看解析日志和错误sudokeyd.rvaiya monitor# 实时打印所有按键事件

调试桥接脚本是否正常

直接手动跑:

/usr/local/bin/keyd-launch /usr/share/applications/org.gnome.Terminal.desktop

应该立刻弹出 gnome-terminal。

改完配置热加载

sudonano/etc/keyd/default.confsudokeyd.rvaiya reload

不需要注销、不需要重启 daemon。

添加更多 Super+键 启动应用

# 1. 找应用的 desktop 文件ls/usr/share/applications/|grep-i应用名# 2. 在 [mac:C] 段加一行x=command(/usr/local/bin/keyd-launch /usr/share/applications/xxx.desktop)# 3. 热加载sudokeyd.rvaiya reload

临时禁用整套映射

sudosystemctl stop keyd

恢复:

sudosystemctl start keyd

九、X11 用户怎么办?

如果你用的是 X11 会话(echo $XDG_SESSION_TYPE显示x11),方案更简单:

sudoaptinstall-yxbindkeys xdotool

~/.xbindkeysrc

"xdotool key --clearmodifiers ctrl+c" Super + c "xdotool key --clearmodifiers ctrl+v" Super + v "xdotool key --clearmodifiers ctrl+x" Super + x "xdotool key --clearmodifiers ctrl+z" Super + z "xdotool key --clearmodifiers ctrl+a" Super + a "xdotool key --clearmodifiers ctrl+q" Super + q "xdotool key --clearmodifiers ctrl+w" Super + w "xdotool key --clearmodifiers ctrl+s" Super + s

自启动~/.config/autostart/xbindkeys.desktop

[Desktop Entry] Type=Application Name=xbindkeys Exec=xbindkeys X-GNOME-Autostart-enabled=true

缺点:xdotool 合成事件偶尔被应用吞掉,且对 Wayland/XWayland 混合场景不友好。所以本文主推 keyd。


十、参考

  • keyd GitHub
  • keyd 自带示例
    • macos.conf—— Mac 风格映射参考
    • nav-layer.conf—— 层修饰键用法
    • capslock-escape-with-vim-mode.conf——overload三态用法
  • GNOME Mutter 文档:gsettings set org.gnome.mutter overlay-key ''—— 关闭 mutter 自带的 Super 单键活动概览(keyd 接管后通常不需要)

最后提醒Super+Q会让应用立即退出(多数不弹确认框),跟 macOS 行为一致。如果不喜欢可以换成noop或映射到C-w(只关窗口不退出应用)。

http://www.jsqmd.com/news/1099909/

相关文章:

  • Sa-Token:48,800+ Star 的背后让鉴权变得简单优雅
  • open harmony 项目实战:给语文学习 App 做一个高端精致的沉浸式界面
  • OpenCV VideoCapture 类
  • 无人机合速度和航捷转速度分量
  • 大数据志愿填报冲稳保如何搭配院校梯度
  • 龙芯3B6000服务器手动安装Docker 29.5.1实战指南
  • PHP+VUE医疗预约系统毕业设计:全栈开发实战与部署指南
  • MultiFunPlayer完整指南:设备同步与媒体播放的终极解决方案
  • 新店起店怎么查抖音小店对标数据?蝉妈妈拆解头部4要点
  • Element Plus 级联选择器实战:仿学科网教材多级选择的完整方案
  • Java计算机毕设之基于 SpringBoot+Vue 的 4S 店客户跟进与购车管理系统的设计与实现 基于 SpringBoot+Vue 的汽车门店车辆(完整前后端代码+说明文档+LW,调试定制等)
  • 专访大晓机器人王飞:世界模型是“进化型基础设施”
  • 基于51/STM32单片机温度控制系统 恒温箱 水温控制 温度采集 成品1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • HarmonyOS律愈实战02:ArkTS五音数据模型设计
  • esp32s3+ws2812灯条控制
  • 公开课紧张到忘词?老教师都在用的3个临场应对方法
  • LeetCode 热题 100 —— 7.接雨水(Javascript解法)
  • 别再盲目试用了!AI编程助手采购决策树:按团队规模、语言栈、安全等级自动匹配最优组合(含SaaS/私有化/混合部署ROI计算表)
  • 2026 年有哪些真正适合学生写开题的 AI 辅助写作工具,实测无套路分享
  • 【VMware磁盘扩容终极指南】:20年运维专家亲授5种零宕机扩容方案,99%的人不知道第3种!
  • Antigravity Manager:把多个 AI 账号管明白的桌面工具
  • Debian 12 编译安装网讯网卡驱动详细教程
  • Dism++深度解析:现代化Windows系统维护架构与技术实现
  • SCI投稿AI绘图避坑全攻略:AI打草稿+人工转矢量,彻底告别撤稿风险!
  • 从H100的异步执行和线程块集群,聊聊如何榨干GPU的每一分算力
  • 2026年技术方向怎么选?机器视觉、PLC、AI大模型、嵌入式深度对比
  • 宝塔面板部署 Spring Boot 项目全流程
  • Python爬虫经典案例018:爬虫性能优化与调优——从慢到快的全面优化指南
  • VisualCppRedist AIO:终极Windows运行库一体化智能管理解决方案深度解析
  • 【open harmony/harmonyos】HarmonyOS 应用中的数据模型分层:以星图节点 Store 为例