我如何单独映射左、右 Shift 键?

我如何单独映射左、右 Shift 键?

首先,请原谅我对 X 和 XKB 的无知;我一直在尝试拼凑一个解决方案,希望能够实现我想要的而不需要详细掌握它。

我正在尝试在 Ubuntu 12.04 上创建一个 XKB 键盘映射,以便我规定两个 Shift 键中的哪一个构成 Level2 修饰键。具体来说,该4键应仅$在按住右 Shift 键时产生,而不是按住左 Shift 键时产生。

我目前的阅读:

我尝试定义一个自定义类型,然后在符号映射中明确引用它:

/usr/share/X11/xkb/types/mbfisher

default xkb_types "mbfisher" {
  type "RIGHT_SHIFT" {
    modifiers = None+Shift_R;
    map[None] = Level1;
    map[Shift_R] = Level2;
  };
}

/usr/share/X11/xkb/symbols/mbfisher

default
partial alphanumeric_keys
xkb_symbols "basic" {

  name[Group1]= "mbfisher";

  key <AE04> {
    type= "RIGHT_SHIFT",
    symbols[Group1]= [ 4,  dollar ]
  };

};

然后我使用 Ubuntu 键盘布局 GUI 选择地图。

这显然会禁用除键之外的字母数字键盘4,但仍可以使用任一 Shift 键输入美元符号。

我意识到我写了一个包含大量无用信息的庞大问题,所以我将在这里停下来;请询问我遗漏的任何东西。

有任何想法吗?

答案1

这就是最终奏效的方法!我使用了xmodmap文件~/.Xmodmap而不是 xkb 配置。

~/.Xmodmap

clear Shift

! Key Shift+Key mode_switch+Key mode_switch+Shift+Key AltGr+Key AltGr+Shift+Key
! Key Shift_L+Key Shift_R+Key Shift_R+Shift_L+Key AltGr+Key AltGr+Shift_L+Key

keycode 10 = 1 1 exclam 1
keycode 11 = 2 2 at 2
keycode 12 = 3 3 numbersign 3
keycode 13 = 4 4 dollar 4
keycode 14 = 5 5 percent 5

keysym Shift_R = Mode_switch
add Shift = Shift_L

2 行注释(以 开头!)显示了我更改前后的列标题。这使我能够将列 2 指定为 Shift_L,将列 3 指定为 Shift_R,因为我已将 shift_R 映射为 Mode_switch。

通过运行以下命令进行更改:

 # setxkbmap us
 # xmodmap ~/.Xmodmap

setxkbmap us设置默认的美国地图,以便您从头开始工作,并将xmodmap自定义更改附加到其中。

实现后!@#$%字符只能用右 Shift 键输入,而^&*(只能)用左 Shift 键输入。

我现在可以继续将键盘左侧的所有键映射到仅由右 Shift 键修改(即字母字符及其大写修改)反之亦然;此解决方案意味着我只需要重新映射左侧。

在此过程中发现的其他有用链接:

非常感谢@Trudbert 为我提供了大部分答案!

答案2

我不知道这是否是你想要的解决方案,但禁用左移键的一种可能性是使用 xmodmap。创建一个文件,~/.Xmodmap内容如下

clear shift
add shift = Shift_R

然后运行xmodmap ~/.Xmodmap


查看评论/聊天:

如果其他程序对您的 xkbmap 进行了其他修改,您可能会遇到问题,因此setxkbmap us可能需要使用类似的方法重置为默认 xkbmap。

如果你想让一些键只对一个 Shift 键作出反应,你可以使用 来获取当前键盘布局,xmodmap -pke > .Xmodmap它为你提供了一个 ,.Xmodmap其中列出了所有键,形式为keycode XX = functions。在这个分配中,每个键代码在右侧可以有多个功能。每个都对应不同的修饰符+ 该键。然后您可以插入上面的 clear + add 并添加类似 的内容add mod5 = Shift_L。右移键将对应于 mod2,而左移键将对应于 mod5。然后您可以继续将您想要使用左移键调用的键的 mod2 函数移动到 mod5,只需插入NoSymbol和空格直到到达右列(keycode 57 = n N-> keycode 57 = n NoSymbol NoSymbol NoSymbol N)。

相关内容