将组合键重新映射到 Wayland 下的另一个组合,例如 AltGr+C -> Ctrl+C

Ras*_*mus 7 keyboard-layout shortcut-keys wayland remapping

长话短说

\n

在 Wayland 下,我可以以某种方式绑定AltGr + C到吗Ctrl + C

\n

细节

\n

我基本上想问这个问题但针对的是 Wayland 上的 GNOME。这意味着涉及AutoKeyxbindkeys 的答案将不起作用,因为在 Wayland 下两者都不起作用。

\n

背景

\n

我想重新映射一些键以最终更好地利用CapsLock.

\n

我的计划是映射CapsLockAltGr,然后按照获取类似 vim 的键绑定。在 Wayland 上,可以通过 XKB 文件完成此重新映射(请参阅链接)。

\n

但是,我也想用于CapsLock复制/粘贴。目前,我已将其映射到Ctrl(使用 XKB 文件)。这使得CapsLock + C整个系统工作顺利,我想保留这一点。

\n

所以:CapsLock映射到 后AltGr,我想Capslock (= AltGr) + C充当Ctrl + C

\n

我的问题

\n

在 Wayland 下,我可以以某种方式绑定AltGr + C到吗Ctrl + C

\n

(不只是重新绑定AltGrCtrl,因为这会达不到目的)

\n

使用 Q 的替代示例

\n

在 latin 的 XKB 文件中/usr/share/X11/xkb/symbols/latin,为我的密钥定义了以下行为Q

\n
key <AD01>  { [ q, Q, at, Greek_OMEGA ] };\n
Run Code Online (Sandbox Code Playgroud)\n

这表明该密钥有四种可能的输出:

\n
    \n
  1. 单独压制,它会产生q
  2. \n
  3. 按下去Shift,就产生了Q
  4. \n
  5. 按下去AltGr,就产生了@
  6. \n
  7. 按下去AltGr + Shift,就产生了\xce\xa9
  8. \n
\n

本质上我想要实现的是,当Q按下 时AltGr,它不会产生@but Ctrl + Q

\n

Ras*_*mus 6

有几个工具可以执行此操作,例如KMonadInterception Toolskeyd

keyd在 Wayland 的领导下取得了巨大的成功,所以我描述了我对此所做的事情。我建议阅读简短的自述文件以获取灵感。守护进程可以做的事情比这里使用的要多得多。

目前的解决方案满足了我的要求,但避免了绕道而行AltGr。它在任何地方都被视为CapsLock除了Controlh ,j ,k , l它更改为箭头键。

1. 安装

keyd从源代码构建,因为这很容易。下一行首先安装依赖项(包括 C 编译器),下载源代码,构建并安装它,并将其作为服务启用,然后启动它并在启动时运行它。

完成后,它会告诉您安装了什么内容,以便您可以将其删除以进行卸载。安装后可以删除源代码。

sudo apt install cmake libudev-dev
git clone https://github.com/rvaiya/keyd
cd keyd
make && sudo make install
sudo systemctl enable keyd && sudo systemctl start keyd
Run Code Online (Sandbox Code Playgroud)

2.找到您要重新映射的键盘的名称

您可以跳过此步骤并重新映射默认键盘,请参阅下文default.conf

您应该找到键盘的名称,以便我们可以为此进行重新映射。跑步

sudo keyd -m
Run Code Online (Sandbox Code Playgroud)

并按一些键。它将显示键盘的名称和按下的键。记下名字。我的是AT Translated Set 2 keyboard

提示:keyd -m通过按下按键来查找按键名称非常有用。keyd -l列出了您可以映射到的键名称。

3. 制作配置文件

无论在哪里,创建一个名为whatever的配置文件。我们稍后会移动它。假设您使用~/my_keyboard.conf.

在其中输入以下内容。#'ed 是解释定义的行为的注释:

[ids]

*

[main]
### MAIN LAYER
    
# Make capslock activate the second layer:

capslock = layer(movement_layer)

### SECOND LAYER (called "movement_layer")

# Define the new layer, which while active
# by default treats every key as if Control was pressed,
# (":C" means the layer should inherit the Control layer),
# and overrides this default for only h, j, k and l, which
# are mapped to directions.

[movement_layer:C]

h = left
j = down
k = up
l = right

# In sum, in the main default layer, everything is standard, except
# when CapsLock is pressed, then the second layer is activated.
# When the second layer is activate, everything but h, j, k, l
# acts as if Control is held---e.g., c copies and v pastes,
# which we want, as we are holding down CapsLock.)
Run Code Online (Sandbox Code Playgroud)

4. 复制并重命名配置文件并重新启动 KEYD

接下来,我们将配置复制到正确的位置并正确命名,即根据我们要重新映射的键盘命名。

sudo cp ~/my_keyboard.conf /etc/keyd/AT\ Translated\ Set\ 2\ keyboard.conf
Run Code Online (Sandbox Code Playgroud)

笔记:default.conf。您还可以复制配置文件以/etc/keyd/default.conf使其适用于所有键盘。但如果你弄乱并重新映射你的 Enter 键,你就无法插入另一个键盘来撤消更改......

然后我们重新启动,keyd以便它加载新配置:

sudo systemctl restart keyd
Run Code Online (Sandbox Code Playgroud)

您现在已启动并运行:)

5. 创建别名来复制配置并重新启动 KEYD

我最终对配置文件进行了很多修改。我在主文件夹的子目录中编辑了它们,然后将它们复制并重新启动 keyd。

为了减少麻烦,~/.bash_aliases我在 中添加了

alias rekeyd='sudo cp ~/my_keyboard.conf /etc/keyd/AT\ Translated\ Set\ 2\ keyboard.conf && sudo systemctl restart keyd'
Run Code Online (Sandbox Code Playgroud)

  • 这非常有效。有时你不知道某个键的名称,有两种方法可以找到 - 1) 使用 `keyd list-keys | 列出所有可用的键。sort`,以及 2) 使用 `sudo keyd monitor` 按下按键时显示按键。 (2认同)