Переопределить несколько кодов клавиш с помощью XKB

10

Я хочу перемешать несколько ключей с помощью XKB. (Почему? На ноутбуке, где некоторые клавиши расположены неудобно.) В настоящее время я использую xmodmap:

keycode 110 = Prior
keycode 115 = Delete
keycode 112 = Next
keycode 117 = Insert
keycode 119 = End
keycode 118 = Home

Вместо этого я хочу использовать XKB и назначать разные символические имена для определенных физических ключей, а не назначать разные ключевые символы для определенных кодов клавиш. ( Вот почему.) Я хочу, чтобы код клавиши 110 отправлялся PGUPвместо HOME, код 115 отправлялся DELEвместо END, и т. Д. На остальную конфигурацию не должны влиять (то PGUPесть продолжать посылать ключ Priorи т. Д., И все остальные ключи остаются как они есть).

Как я могу изменить назначение этих конкретных кодов клавиш? Я загружу файл xkbcomp somefile.xkb $DISPLAY, что мне нужно вставить в somefile.xkb?

Жиль "ТАК - перестань быть злым"
источник

Ответы:

14

Создайте файл, содержащий ваши изменения кода ключа, и сохраните его как (например) ~/.xkb/keycodes/local. ( keycodesКаталог жестко закодирован; базовый каталог может быть чем-то другим, а также именем файла). Это будет содержаться в вашем случае

xkb_keycodes {
  <PGUP> = 110;
  <PGDN> = 112;
  <DELE> = 115;
  <INS> = 117;
  <HOME> = 118;
  <END> = 119;
};

Чтобы загрузить это, запустите

setxkbmap -print | sed -e '/xkb_keycodes/s/"[[:space:]]/+local&/' | xkbcomp -I${HOME}/.xkb - $DISPLAY

Это выводит ваши текущие настройки, добавляет +localв xkb_keycodes includeоператор и загружает его в компилятор XKB, добавляя ~/.xkbк пути включения. (Если вы назвали свой файл как-то иначе ~/.xkb/keycodes/local, вам, очевидно, нужно будет изменить +localи -I${HOME}/.xkb}.) Таким образом, все остальные настройки будут сохранены.

Стивен Китт
источник
1
Так что это ожидаемый путь и способ передать его на -Iкоммутатор! Спасибо, я не смог понять это на странице руководства.
Л. Леврел
работал как шарм! это сработало, если хотите обновить xkb_symbols, просто замените xkb_keycodes на него, сработало
zw963
5

Вы можете начать с того, setxkbmap -print > somefile.xkbчтобы получить таблицу ключей, которую вы используете в качестве основы, а затем переопределить имена ключей, которые вы хотите, в xkb_keycodesразделе, например:

xkb_keymap {
 xkb_keycodes {
  include "evdev+aliases(azerty)"
  // Custom <key name> = keycode
  <INS> = 117;
  <HOME> = 118;
  <PGUP> = 110;
  <DELE> = 115;
  <END> = 119;
  <PGDN> = 112;
 };
 xkb_types { include "complete"};
 xkb_compatibility { include "complete"};
 xkb_symbols { include "pc+fr+inet(evdev)"};
 xkb_geometry { include "pc(pc104)"};
};

Это генерирует предупреждения о том, что некоторые имена ключей назначаются несколько раз, но это работает, потому что учитывается только последний (поэтому важно установить пользовательские настройки после включения). И файл имеет то преимущество, что его можно прочитать.

Другой способ - выгрузить используемую вами карту ключей в файл xkbcomp $DISPLAY somefile.xkbи изменить те же строки (это та же самая карта ключей с оценками включений). Таким образом, нет предупреждений для нескольких определений, но он менее читабелен.

Leiaz
источник
1
Откуда все эти имена ( evdev+aliases(azerty)и т. Д.)? Я явно хочу выполнить относительное изменение, а не полную реконфигурацию. Ключи, отличные от 6, перечисленных в вопросах, не должны быть затронуты, они должны оставаться в том состоянии, в котором они находились, когда я дал команду.
Жиль "ТАК - перестань быть злым"
1
Они приходят из setxkbmap -print, они файлы из /usr/share/X11/xkb/. Я думаю, что вы должны дать целую xkbcomp
карту ключей,