首先,请原谅我对 X 和 XKB 的无知;我一直在尝试拼凑一个解决方案,希望能够实现我想要的而不需要详细掌握它。
我正在尝试在 Ubuntu 12.04 上创建一个 XKB 键盘映射,以便我规定两个 Shift 键中的哪一个构成 Level2 修饰键。具体来说,该4键应仅$
在按住右 Shift 键时产生,而不是按住左 Shift 键时产生。
我目前的阅读:
- http://www.charvolant.org/~doug/xkb/html/node5.html
- http://people.uleth.ca/~daniel.odonnell/Blog/custom-keyboard-in-linuxx11
- http://www.x.org/releases/X11R7.5/doc/input/XKB-Enhancing.html
- 大量搜索!
我尝试定义一个自定义类型,然后在符号映射中明确引用它:
/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
)。