Я купил необычно выглядящую механическую клавиатуру в Корее. В целом это работает действительно хорошо за исключением одной вещи - даже при том, что это имеет клавиши Alt и клавиши Ctrl на ее правой стороне, эти ключи не генерируют те же коды как "обычная" клавиатура.
Короче говоря, Правильный Высокий звук является ключом Хангыля (изменения между латинскими и корейскими буквами), и Ctrl является Hanja (преобразовывает между Хангылем и "старыми" корейскими символами). Я хотел использовать несколько разметок - корейский язык и мое локальное одно (польский язык) и сохранить лучший из обоих миров - который означает заставлять Правильный Высокий звук испустить код клавиши для Высокого звука при вводе польского языка и для Хангыля при вводе на корейском языке.
Корейский язык работал из поля (так как коды клавиши корректны там), но польские необходимые тонкие настройки. Я изменил расположение (/usr/share/X11/xkb/symbols/pl
) путем добавления следующих строк в активном xkb_symbols
раздел:
key <HNGL> { [ ISO_Level3_Shift ] };
key <HJCV> { [ Control_R ] };
И я прокомментировал строки, связанные с HNGL
и HJCV
в "inet" расположении, так как они перезаписывали мои изменения.
После этих изменений я получил Высокий звук, работающий отлично, но была все еще проблема с клавишей Ctrl, не работающей правильно. В целом это работает, но при редактировании текста, я должен смочь, например, удалить одно слово при помощи комбинации Ctrl+Backspace, и я не могу сделать так.
Я выполнился xset -r 131
для отключения ключевого повторения для этого ключа Ctrl/Hanja, но это все еще не работает как реальный Ctrl
Вот xev
вывод повторно отображенных Hanja
:
KeyPress event, serial 34, synthetic NO, window 0x1000001,
root 0x13f, subw 0x0, time 49086462, (88,89), root:(3928,141),
state 0x10, keycode 131 (keysym 0xffe4, Control_R), same_screen YES,
XKeysymToKeycode returns keycode: 105
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
И вот обычный Ctrl (с другой клавиатуры):
KeyPress event, serial 39, synthetic NO, window 0x1000001,
root 0x13f, subw 0x0, time 49144922, (616,377), root:(4456,429),
state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
Есть ли что-нибудь, что я могу изменить, чтобы заставить мою систему рассматривать тот ключ как полноценный Ctrl?
Присвоение ключа к другому уникально, когда ключ является модификатором. Этот ответ имеет хорошее объяснение:
Действие, когда это - действие модификатора, такое как это, изменяет текущее состояние модификатора, которое (просто помещенный) является рядом флагов, зарегистрированных в операционной системе, которые записывают, какие модификаторы в настоящее время "включены". [Эта запись] влияет на то, на какое действие дальнейшие нажатия клавиш отображаются.
И поэтому когда Вы пытаетесь отобразить свой ключ, он отображается как обычный ключ и теряющей информацию, которая указывает, как он ведет себя, когда несколько клавиш нажаты.
Для демонстрации работать xmodmap
. Обратите внимание, что существует два ключа по умолчанию (Control_L и Control_R) отображены на модификаторе управления. Если Вы работаете xmodmap -e 'keycode 131 = Control_L'
и затем xmodmap
, модификатор управления должен все еще иметь два ключа, таким образом, Ваш ключ не распознается как модификатор.
Отображаться как модификатор:
Очистите модифицирующую клавишу control
xmodmap -e 'clear control'
Добавьте код клавиши для ключа Hanja
xmodmap -e 'keycode 131 = Control_L'
Наконец, добавьте назад модификаторы по умолчанию:
xmodmap -e 'add control = Control_L'
xmodmap -e 'add control = Control_R'
Теперь, если необходимо было выполнить xmodmap снова, Вы заметите, что новый ключ был добавлен для управления модификатором, и это должно работать правильно теперь.
Вот ссылка на официальную Дугу, инструкции Linux относительно повторно присваивающихся модификаторов к включают Вашу клавиатуру.
править:
для персистентных изменений добавьте к /usr/share/X11/xkb/symbols/pl
:
key <HJCV> { [ Control_L ] };
modifier_map Control { Control_L, Control_R, <HJCV> };