我正在尝试使用 Xmodmap 在键盘上添加一些德语变音符号/变音符号,但 Xmodmap 无法使用它们(但可以使用其他重新映射)。
我正在遵循本指南:X 中美式键盘上的德语变音符号 (Ubuntu 10.04)。
Xmodmap
我已将此添加到我的~/.Xmodmap
:
keysym a = a A adiaeresis Adiaeresis
keysym o = o O odiaeresis Odiaeresis
keysym u = u U udiaeresis Udiaeresis
keysym s = s S ssharp ssharp
西夫
然而它不起作用。这是xev
我按下o、按住AltGr、按下o、按下时的输出x:
KeyPress event, serial 34, synthetic NO, window 0x4e00001,
root 0x8e, subw 0x0, time 642618, (108,138), root:(173,190),
state 0x10, keycode 32 (keysym 0x6f, o), same_screen YES,
XLookupString gives 1 bytes: (6f) "o"
XmbLookupString gives 1 bytes: (6f) "o"
XFilterEvent returns: False
KeyRelease event, serial 37, synthetic NO, window 0x4e00001,
root 0x8e, subw 0x0, time 642644, (108,138), root:(173,190),
state 0x10, keycode 32 (keysym 0x6f, o), same_screen YES,
XLookupString gives 1 bytes: (6f) "o"
XFilterEvent returns: False
KeyPress event, serial 37, synthetic NO, window 0x4e00001,
root 0x8e, subw 0x0, time 643792, (108,138), root:(173,190),
state 0x10, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 37, synthetic NO, window 0x4e00001,
root 0x8e, subw 0x0, time 645365, (108,138), root:(173,190),
state 0x90, keycode 32 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 37, synthetic NO, window 0x4e00001,
root 0x8e, subw 0x0, time 645409, (108,138), root:(173,190),
state 0x90, keycode 32 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 37, synthetic NO, window 0x4e00001,
root 0x8e, subw 0x0, time 647660, (108,138), root:(173,190),
state 0x90, keycode 53 (keysym 0xd7, multiply), same_screen YES,
XLookupString gives 2 bytes: (c3 97) "×"
XmbLookupString gives 2 bytes: (c3 97) "×"
XFilterEvent returns: False
KeyRelease event, serial 37, synthetic NO, window 0x4e00001,
root 0x8e, subw 0x0, time 647722, (108,138), root:(173,190),
state 0x90, keycode 53 (keysym 0xd7, multiply), same_screen YES,
XLookupString gives 2 bytes: (c3 97) "×"
XFilterEvent returns: False
KeyRelease event, serial 37, synthetic NO, window 0x4e00001,
root 0x8e, subw 0x0, time 650223, (108,138), root:(173,190),
state 0x90, keycode 108 (keysym 0xfe03, ISO_Level3_Shift), same_screen YES,
XKeysymToKeycode returns keycode: 92
XLookupString gives 0 bytes:
XFilterEvent returns: False
您会注意到,按下AltGr被解释为ISO_Level3_Shift
,当x按下 和 时,我得到keysym 0xd7, multiply
,即×
,这被设置为 的第三级x。所以AltGr有效。
$ xmodmap -pke | grep 53
keycode 53 = x X x X multiply approximate
然而,当我按下时,o我得到了keysym 0x0, NoSymbol
,尽管我设置了第三级:
$ xmodmap -pke | grep 32
keycode 32 = o O odiaeresis Odiaeresis
当我尝试使用AltGr+ ( a| u| s) 时,也会发生同样的情况。
Xmodmap 适用于其他重新映射
由于我PgUp的笔记本电脑上的按键很小,因此我已将数字键盘重新映射+到我的 Page Up 中~/.Xmodmap
,效果很好。所以我的 XModmap 文件正在被(部分)读取。
为什么我对 o/a/u 的重新分配不起作用?
我正在使用 Ubuntu 14.0.1 和 Ubuntu Unity。
答案1
初步说明:最近似乎xmodmap
发生了变化;旧的设置将不起作用。
对于您的情况,请查看x X x X multiply approximate
有效的键码 53(6 个值:)的值的数量,以及o O odiaeresis Odiaeresis
无效的键码 32(4 个值:)的值的数量。
ISO_Level3_Shift
将选择第 5 个或第 6 个值,但在您的情况下,它们未设置为键码 32。于是就有了keysym 0x0, NoSymbol
结果。
你需要的是:
keysym a = a A a A adiaeresis Adiaeresis
keysym o = o O o O odiaeresis Odiaeresis
keysym u = u U u U udiaeresis Udiaeresis
keysym s = s S s S ssharp ssharp
但直接使用XKB可能会更好(例子)。
编辑:第三个和第四个值由 键选择Mode_switch
。对于每对值,Shift
选择该对的第二个值。请参阅ArchWiki xmodmap 页面。
答案2
要使正确的Alt
键发挥作用Alt Gr
,需要通过添加行将其映射到Mode_switch
而不是ISO_Level3_Shift
keycode 108 = Mode_switch
到~/.Xmodmap
:
keycode 108 = Mode_switch
keycode 38 = a A adiaeresis Adiaeresis
keycode 30 = u U udiaeresis Udiaeresis
keycode 32 = o O odiaeresis Odiaeresis
keycode 39 = s S ssharp
如果您想要德语键盘上的按键上的变音符号,请使用:
keycode 108 = Mode_switch
keycode 48 = apostrophe quotedbl adiaeresis Adiaeresis
keycode 47 = semicolon colon odiaeresis Odiaeresis
keycode 34 = bracketleft braceleft udiaeresis Udiaeresis
keycode 20 = minus underscore ssharp
(当然,你可以将它们结合起来。)