如何在 X 上将修饰键与字符键交换?

如何在 X 上将修饰键与字符键交换?

我正在尝试将左键Windows<>|键交换。这在 vterm 上使用可以做到这一点的键盘映射文件效果很好。但是,我无法在 X 上使用它(在 KDE 和 Mate 上都试过了 - 两者都表现出相同的行为)

无论我使用xmodmap还是 xkb 符号配置来执行此操作,结果都是一样的:该<>|键停止工作,左键仍为该键,但在按下时Windows还会发出一个。<

xev确定我的<>|钥匙上的代码是 94,而我的左Windows钥匙上的代码是 133,因此我尝试了这个:

xmodmap -e "keycode 133 = less greater bar NoSymbol U0149 brokenbar U266A NoSymbol"
xmodmap -e "keycode 94 = Super_L"

我尝试过的 xkb 符号配置如下所示,并且具有与上面描述相同的效果:

partial alphanumeric_keys
xkb_symbols "defoo" {
  include "de(basic)"
  name[Group1] = "German (foo)";
  key <LWIN> { [ less, greater, bar, NoSymbol, U0149, brokenbar, U266A, NoSymbol ] };
  key <LSGT> { [ Super_L ] };
};

现在怎么办?我真的需要交换这些钥匙。

编辑:我在 Ubuntu 18.04 上

编辑:也尝试摆弄修饰键。xmodmap -pm说我的超级键被分配给 mod4,所以:

xmodmap -e "clear mod4"

然而,这没有任何效果,即Windows按键的功能与之前完全一样。

答案1

尽管我想避免这种情况,但我最终还是将 keycodes 文件中的键替换为 evdev,这达到了预期的效果。

优点:

  • 它可以透明地与任何布局和应用程序配合使用,因为它会更改按键的事件代码

缺点:

  • 适用于所有 evdev 键盘
  • 更改已应用于系统文件(稍后可能会中断)

差异:

$ diff /usr/share/X11/xkb/keycodes/evdev{,.bak}
8c8
<         <LWIN> = 94;
---
>         <LSGT> = 94;
74c74
<   <LSGT> = 133;
---
>   <LWIN> = 133;

相关内容