Как переназначить определенные ключи или устройства?

Я ищу способ переназначения определенных ключей в Ubuntu.

т.е.

Я хотел бы изменить PgUp на Home или PgDown на End.

Существует ли встроенная команда или инструмент переназначения ключей в Ubuntu/GNOME?

11 ответов

Решение

Примечание: с 2013 года Ubuntu и его производные больше не используются xmodmap, но вместо этого использовать xkb, Для получения дополнительной информации см. Этот ответ. Ответ ниже не актуален для текущих выпусков.


Для переназначения определенных ключей вам понадобятся два инструмента. Первый xev (инструмент командной строки) и второй xmodmap (также инструмент командной строки). Оба должны быть доступны в Ubuntu без дополнительной их установки.

  1. Запустите окно терминала и запустите xev, Теперь он активен и ждет, когда вы нажмете клавишу. Затем нажмите клавишу, поведение которой вы хотите изменить. т.е. PgUp.

  2. xev выведет некоторую информацию о нажатой клавише. Третья строка важна. Это должно выглядеть примерно так:

    state 0x10, keycode 110 (keysym 0xff55, Prior), same_screen YES,
    

    в этом примере Prior это имя поведения, которому назначена клавиша на данный момент, цифровой код клавиши является внутренним идентификатором для распознавания ключа. Теперь сделайте это с помощью другого ключа, т.е. PgDown даст этот вывод

    state 0x10, keycode 115 (keysym 0xff56, Next), same_screen YES,
    

    Здесь снова интересная часть для нас keycode 115 а также Next - название поведения.

  3. Теперь, когда вы хотите поменять местами два ключа, используйте xmodmap,

     xmodmap -e "keycode 110 = Next"
    

    Это меняет клавишу с кодом 110 на клавиатуре на действие Next, Это довольно просто.

    Обратите внимание, что если отображаемая клавиша имеет другое значение при использовании с клавишей Shift (например, для английских раскладок клавиатуры, Shift + 2 дает кавычки), вы можете просто перечислить вторичную команду после первой. Например, если вы хотите, чтобы ключ с кодом 53 отображался как обычная обратная косая черта, но при использовании символа shift, вы можете сделать так:

     xmodmap -e "keycode 53 = backslash bar"
    

Дополнительная информация: последовательность этих сопоставлений: клавиша, Shift + клавиша, mode_switch + клавиша, mode_switch + Shift + клавиша, AltGr + клавиша, AltGr + Shift + клавиша. Чтобы пропустить столбец используйте NoSymbol, Кроме того, здесь представлен полный список всех ключевых символов.

Примечание. Эти изменения относятся только к активному сеансу X и будут потеряны после перезагрузки. Если вы хотите сохранить изменения навсегда, вы должны выполнить следующие команды после указанных выше:

xmodmap -pke >~/.Xmodmap

(создает файл с именем .Xmodmap в вашем домашнем каталоге (~))

Затем вы должны создать файл с именем .xinitrc в вашем домашнем каталоге, где вы положили команду xmodmap .Xmodmap в.

Теперь вы можете изменить .Xmodmap и беги xmodmap .Xmodmap из консоли, чтобы увидеть изменения немедленно. Изменения в .Xmodmap будет сохраняться.

Источник: Ubuntu Foruns

Бонусные вещи:

Если переназначаемая клавиша имеет различное поведение в зависимости от состояния (например, как клавиши на цифровой клавиатуре зависят от NumLock), вам просто нужно сделать xmodmap -pm чтобы получить список модификаторов, а затем выполните:

xmodmap -e "KEYCODE MODIFIER = behaviour behaviour_with_modifier"

Предположим, например, что вы хотите получить точку вместо запятой на цифровой клавиатуре (полезно для большинства программистов), но вы хотите сохранить поведение "delete", когда NumLock выключен.

xmodmap -e "keycode 91 mod2 = KP_Delete period"

mod2, так как xmodmap -pm говорит нам, что mod2 является Num_Lock другие имена получаются нажатием клавиш в xev,

Если вы пытаетесь переместить клавишу Shift, есть несколько дополнительных шагов:

 xmodmap -e "keycode 62 = Up" # Shift => Up
 xmodmap -e "keycode 111 = Shift_R" # Up => Shift
 xmodmap -e "add shift = Shift_R" # Make the new Shift key actually do shifting
 xmodmap -e "remove shift = Up" # Prevent the old Shift key from shifting
 xset r 62 # Make the new Up key autorepeat
 xset -r 111 # Prevent the new Shift key from autorepeating

У меня только что была запоздалая мысль... Я думаю, что вы можете иметь в виду "переотображение" что-то совершенно другое... но я оставлю свой ответ как есть... (Я не знаю, как переназначить один ключ для вести себя как другой)

ОБНОВЛЕНИЕ: моя "запоздалая мысль" была подтверждена; (Я ответил на неправильный вопрос:)... пожалуйста, посмотрите ответ вики сообщества NES (принятый выше).

Существует два основных способа переназначить привязку ключа.

  • локально для конкретной программы
    (ключ может использоваться для разных вещей в разных приложениях / окнах)
  • глобально для конкретного пользователя
    (клавиша имеет одинаковую функцию во всех окнах)

Для методов "локально для программы" иногда есть способ изменить привязки клавиш, предлагаемые самим приложением... например.

Firefox имеет аддон под названием keyconfig... для получения дополнительной информации см. этот пост MozillZine

Большинство программ Ubuntu основаны на Gnome, и есть специальная утилита для изменения привязки клавиш для любого пункта меню этих приложений Gnome... Это называется Editable Menu Accelerator... Это очень "обидчивый" инструмент, но довольно мощный. Вы можете включить его, запустив gconf-editor (через терминал или Alt+F2)... перейти к desktop-gnome-interface и выберите can_change_accels.... Затем вы можете изменить элементы меню на виртуальные все, что вам нравится (для каждой программы / окна)... Я предлагаю вам отключить его, как только вы сделали то, что вам нужно..

В противном случае вы можете настроить глобальные горячие клавиши. Я использую программу под названием xbindkeys Установите xbindkeys и есть также опция, доступная через главное меню - настройки, называемые Keyboard Shortcuts

Если вы используете xbindkeys, вам нужно будет добавить его в "Startup Applications" (Главное меню - "Настройки")... Также (по предложению Стефано Палаццо) я ранее написал более подробное описание xbindkeys в ответе на этот вопрос. страница аскубунту

Вот как я пытался переключить отображение клавиши ВВОД на клавишу SHIFT (и наоборот):

$ uname -a

ДОКЛАДЫ:

Linux box 2.6.32-37-generic #81-Ubuntu SMP Fri Dec 2 20:35:14 UTC 2011 i686 GNU/Linux

$ which xmodmap

ДОКЛАДЫ:

/usr/bin/xmodmap

$ which xev

ДОКЛАДЫ:

/usr/bin/xev

$ xev

(игнорировать следующие пятьдесят строк или около того)

PRESS THE ENTER KEY (notice the third line):
KeyPress event, serial 33, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263441120, (738,242), root:(771,314),
    state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
    XLookupString gives 1 bytes: (0d)
    XmbLookupString gives 1 bytes: (0d)
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263441271, (738,242), root:(771,314),
    state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
    XLookupString gives 1 bytes: (0d)
    XFilterEvent returns: False

PRESS THE SHIFT KEY (notice the third line):
KeyPress event, serial 30, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263592202, (464,368), root:(497,440),
    state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263592298, (464,368), root:(497,440),
    state 0x1, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

Важна третья строка каждого нажатия клавиши:

FOR:
state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
The name "Return" is the name of the behavior of the key pressed.
The number of the key pressed is "36".

state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
The name "Shift_R" is the name of the behavior of the key pressed.
The number of the key pressed is "62".

ОБРАТИТЕ КАРТУ:

$ xmodmap -e "keycode 62 = Return"
$ xmodmap -e "keycode 36 = Shift_R"

СОХРАНИТЕ РЕЗУЛЬТАТЫ:

$ xmodmap -pke > ~/.Xmodmap
$ vi ~/.xinitrc

ДОБАВЛЯТЬ

 xmodmap ~/.Xmodmap

$ sudo reboot

Основная проблема состояла в том, что обращение НЕ работало. Клавиша ENTER была сопоставлена ​​с клавишей SHIFT_R; но ключ SHIFT_R не был сопоставлен с клавишей ENTER. Пойди разберись.

Чтобы сделать глобальные переопределения независимо от X, вы можете вместо этого использовать console-setup(5).

В моем случае я хотел переназначить ключ Caps Lock на D, так как мой D- ключ не работает:)

Сначала я использовал dumpkeys(1), чтобы получить шаблон для отображения, в случае D- клавиши интересным битом является отображение для кода клавиши 32 (на моей клавиатуре); Обратите внимание, что в шаблоне grep есть два пробела!

$ sudo dumpkeys | grep "keycode  32" > tempfile
$ cat tempfile
keycode  32 = +d
    shift   keycode  32 = +D
    altgr   keycode  32 = +eth
    shift   altgr   keycode  32 = +ETH
    control keycode  32 = Control_d
    shift   control keycode  32 = Control_d
    altgr   control keycode  32 = Control_d
    shift   altgr   control keycode  32 = Control_d
(121 lines total...)

Для того, чтобы изменить карту, чтобы применить к Caps Lock (код клавиши 58 на моей клавиатуре) вместо

sed 's/32/58/' -i tempfile

Теперь это читает

keycode  58 = +d
    shift   keycode  58 = +D
    altgr   keycode  58 = +eth
(etc...)

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

sudo sh -c 'cat tempfile >> /etc/console-setup/remap.inc'

и настройку консоли необходимо перенастроить (пропуская вопросы с низким приоритетом -phigh)

sudo dpkg-reconfigure console-setup -phigh

Теперь переназначение должно быть завершено и автоматически загружаться при загрузке.

Для меня AutoKey из Software Center работал лучше всего. Он имеет интуитивно понятный графический интерфейс, чтобы добавить новую привязку, нажмите New -> Phrase и

  1. Добавьте имя, нажмите ОК
  2. В разделе "Настройки фразы" убедитесь, что для вставки используется клавиатура
  3. Добавьте горячую клавишу, которую хотите использовать
  4. Добавьте команду в текстовое поле, например, для эмуляции левой клавиши со стрелкой - это будет <left> (список специальных ключей здесь).

Я провел целый день, пытаясь создать ярлык для Ctrl+Pageup,

Я впервые попробовал xmodmap но это не может генерировать события модификатора. Таким образом, невозможно создать ярлык, который генерирует, например, Control событие.

Я тогда попробовал xbindkeys с xmacro, Такого рода работы, но xbindkeys не может захватить некоторые комбинации клавиш в моей системе, такие как Alt + ___,

Поэтому я, наконец, использовал собственные сочетания клавиш Unity -> Custom Shortcuts для настройки своего сочетания клавиш.

И вместо xmacroЯ сейчас использовал xvkbd Программа для генерации событий клавиатуры, но это всего лишь личные предпочтения. И то и другое xmacro а также xvkbd работать почти так же. Еще один совет - добавить параметр задержки в xmacro или же xvkbd чтобы события не потерялись.

Вы также можете попробовать https://github.com/sezanzeb/input-remapper

Он работает в фоновом режиме и активно внедряет сопоставленные коды клавиш.


Хотя это добавляет дополнительную гибкость, если все, что вам нужно, это переназначить одну кнопку и все готово, вы можете попробовать использовать xmodmap. Похоже, это уже подробно объяснялось.

Или напишите файл «символов» xkb и используйте setxkbmap, но я бы не рекомендовал этого. setxkbmap также можно использовать для каждого устройства отдельно.

Написание конфигураций xkb или xmodmap вызвало у меня проблемы, хотя, если оба устройства сообщают об одном и том же коде клавиши, даже если конфигурация сопоставляет их с разными символами при их одновременном нажатии (это основная причина, по которой мне пришлось написать для этого инструмент для внедрения)

И недавно я наткнулся на это решение: https://www.reddit.com/r/linux_gaming/comments/k3h9qv/remapping_keys_using_hwdb_files/

Непостоянное переназначение через ярлык .desktop

В моем случае я хотел переназначить десятичную точку клавиатуры на запятую, но только временно, поэтому xmodmap удовлетворяет этому требованию в моем случае

  • Узнайте, каков код клавиши для конкретной клавиши, которую нужно переназначить, и символа клавиши , который я тоже хочу сопоставить.
    • :~$ xev | grep keycode
  • Нажимайте интересующие клавиши и следите за стандартным выводом
          state 0x10, keycode 91 (keysym 0xffae, KP_Decimal), same_screen YES,
    XKeysymToKeycode returns keycode: 129
    state 0x10, keycode 59 (keysym 0x2c, comma), same_screen YES,
  • 1-й я нажал клавишу, которую хочу переназначить, а 2-й я нажал клавишу, на которую хочу сопоставить.

    • Код ключа, который я хочу переназначить: ..., keycode 91 (...
    • Keysym Я хочу, чтобы этот код клавиши отображался на: ...(keysym 0x2c, comma),...
  • Узнайте, каково текущее сопоставление кода клавиши для переназначения:

    • :~$ xmodmap -pke | grep "keycode\s*91"
      keycode  91 = KP_Delete KP_Decimal KP_Delete KP_Decimal

Как указано на справочной странице xmodmap: к ключу может быть привязано до восьми символов клавиш.. : 1- й символ клавиши используется, когда нет ключа-модификатора, 2-й с Shiftи т . д. Это не совсем соответствует тому, что происходило в моем случае, но метод проб и ошибок позволил мне обнаружить, что 2-й позиционный аргумент был тем, за которым я охотился.

  • Сопоставьте с новой конфигурацией.

    • :~$ xmodmap -e "keycode 91 = KP_Delete comma KP_Delete KP_Decimal"
  • Сопоставьте исходную конфигурацию.

    • :~$ xmodmap -e "keycode 91 = KP_Delete KP_Decimal KP_Delete KP_Decimal"
  • я создал пару .desktopярлыки в ~\.local\share\applications\чтобы легко переключиться на ту или иную конфигурацию:

      [Desktop Entry]
Name=KeyPad comma
Exec=xmodmap -e "keycode 91 = KP_Delete comma KP_Delete KP_Decimal"
Terminal=false
Type=Application
Icon=/home/paui/.icons/KP_comma.png

Дополнительная информация: вывод поля состоянияxev,

Поле состояния представляет собой «сумму» текущих активных модификаторов. Это те, которые я расшифровал.

          0x01 Shift
    0x02 Caps
    0x04 Control
    0x08 Alt
    0x10 NumLock
    0x80 Alt Gr

Если вам нужно переназначить ключ только для конкретной программы, я только что добавил эту функцию в hax11.

Я хотел бы изменить PgUp на Home или PgDown на End.

Чтобы сделать это с помощью hax11, откройте файл конфигурации профиля программы в ~/.config/hax11/profiles (например ~/.config/hax11/profiles/usr\lib\firefox\firefox), и добавить:

Enable=1
MapK112=K110
MapK117=K115

Использование предопределенных параметров конфигурации XKB

Если вам повезет , возможно, конкретное переназначение, которое вы хотите выполнить, уже интегрировано в набор предопределенных опций, которые вы можете добавить в текущую конфигурацию с помощью setxkbmap.

  1. в Терминале откройте справочную страницу xkeyboard-config :~$ man xkeyboard-config
  2. Прокрутите вниз или выполните поиск с помощью \для вашего конкретного варианта конфигурации. в моем случае я хотел переназначить клавишу Delete на запятую вместо точки, и мне повезло
       ┌─────────────────────────────────────────────────────────────────┐
 │Option               Description                                 │
 ├─────────────────────────────────────────────────────────────────┤
 │kpdl:dot             Legacy key with dot                         │
 │kpdl:comma           Legacy key with comma                       │
 │kpdl:dotoss          Four-level key with dot                     │
 │kpdl:dotoss_latin9   Four-level key with dot, Latin-9 only       │
 │kpdl:commaoss        Four-level key with comma                   │
 │kpdl:momayyezoss     Four-level key with momayyez                │
 │kpdl:kposs           Four-level key with abstract separators     │
 │kpdl:semi            Semicolon on third level                    │
 │                                                                 │
 └─────────────────────────────────────────────────────────────────┘
  1. проверьте текущую конфигурацию клавиатуры с помощью :~$ setxkbmap -query
      rules:      evdev
model:      pc105
layout:     es,gb
variant:    winkeys,
  1. добавить опцию в текущую конфигурацию: :~$ setxkbmap -option kpdl:commaoss
      :~$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     es,gb
variant:    winkeys,
options:    kpdl:commaoss
  1. Чтобы удалить все параметры, используйте пустой аргумент параметра. :~$ setxkbmap -option

Если вам требуется сопоставление, которое не предопределено там, например, пример, который вы разместили, вам нужно будет написать его самостоятельно , как описано в этом ответе.

Другие вопросы по тегам