Может показаться, что xmodmap
дает ответ, но это не так, потому что коды клавиш, которыми он манипулирует, являются существующими клавишами на клавиатуре, а не измененными клавишами. Элемент управления A является модифицированным ключом.
xmodmap
может переназначать только существующие коды клавиш (или их имена), как указано на странице руководства:
keycode
NUMBER = KEYSYMNAME ...
keycode
any
= KEYSYMNAME ...
keysym
KEYSYMNAME = KEYSYMNAME ...
Чтобы увидеть коды клавиш, о которых знает xmodmap
, запустите
xmodmap -pk
который показывает что-то вроде этого (сокращено для ясности):
There are 4 KeySyms per KeyCode; KeyCodes range from 8 to 255.
KeyCode Keysym (Keysym) ...
Value Value (Name) ...
8 0x0061 (a) 0x0041 (A) 0x00e5 (aring) 0x00c5 (Aring)
9 0x0073 (s) 0x0053 (S) 0x00df (ssharp) 0x00cd (Iacute)
10 0x0064 (d) 0x0044 (D) 0x08ef (partialderivative) 0x00ce (Icircumflex)
11 0x0066 (f) 0x0046 (F) 0x08f6 (function) 0x00cf (Idiaeresis)
12 0x0068 (h) 0x0048 (H) 0x01ff (abovedot) 0x00d3 (Oacute)
13 0x0067 (g) 0x0047 (G) 0x00a9 (copyright) 0x01bd (doubleacute)
14 0x007a (z) 0x005a (Z) 0x07d9 (Greek_OMEGA) 0x00b8 (cedilla)
...
xev
показывает, что на самом деле происходит:
KeyPress event, serial 34, synthetic NO, window 0xc00001,
root 0x111, subw 0xc00002, time 2209364614, (27,43), root:(47,86),
state 0x4, keycode 8 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) "^A"
XmbLookupString gives 1 bytes: (01) "^A"
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0xc00001,
root 0x111, subw 0xc00002, time 2209364773, (27,43), root:(47,86),
state 0x4, keycode 8 (keysym 0x61, a), same_screen YES,
XLookupString gives 1 bytes: (01) "^A"
XFilterEvent returns: False
Модификатор управления - 0x4
в состоянии; XLookupString
(одна из нескольких связанных функций для комбинирования событий клавиш) преобразует ключевую фразу для "a" в ^A
(control/A).
Поскольку ни для одной из управляющих клавиш не используется keyym, переназначение кодов клавиш с помощью xmodmap
не будет возможным для проблемы OP.
Чтобы решить проблему OP, нужно было бы указать операционной системе (по существу) отказаться от предоставления отдельных событий для контроля и A - но Linux и X не работают таким образом. Ограничивая область действия определенным приложением (xterm) или набором приложений (программы на основе Gtk), можно обратиться к ним отдельно. Но решение, которое применяется в масштабе всей системы, не представляется выполнимым.