Xmodmap

Xmodmap

我正在尝试使用 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

(当然,你可以将它们结合起来。)

相关内容