Как переназначить определенные ключи или устройства?
Я ищу способ переназначения определенных ключей в Ubuntu.
т.е.
Я хотел бы изменить PgUp на Home или PgDown на End.
Существует ли встроенная команда или инструмент переназначения ключей в Ubuntu/GNOME?
11 ответов
Примечание: с 2013 года Ubuntu и его производные больше не используются xmodmap
, но вместо этого использовать xkb
, Для получения дополнительной информации см. Этот ответ. Ответ ниже не актуален для текущих выпусков.
Для переназначения определенных ключей вам понадобятся два инструмента. Первый xev (инструмент командной строки) и второй xmodmap (также инструмент командной строки). Оба должны быть доступны в Ubuntu без дополнительной их установки.
Запустите окно терминала и запустите
xev
, Теперь он активен и ждет, когда вы нажмете клавишу. Затем нажмите клавишу, поведение которой вы хотите изменить. т.е. PgUp.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
- название поведения.Теперь, когда вы хотите поменять местами два ключа, используйте
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 и есть также опция, доступная через главное меню - настройки, называемые 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 и
- Добавьте имя, нажмите ОК
- В разделе "Настройки фразы" убедитесь, что для вставки используется клавиатура
- Добавьте горячую клавишу, которую хотите использовать
- Добавьте команду в текстовое поле, например, для эмуляции левой клавиши со стрелкой - это будет
<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.
- в Терминале откройте справочную страницу xkeyboard-config
:~$ man xkeyboard-config
- Прокрутите вниз или выполните поиск с помощью
\
для вашего конкретного варианта конфигурации. в моем случае я хотел переназначить клавишу 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 │
│ │
└─────────────────────────────────────────────────────────────────┘
- проверьте текущую конфигурацию клавиатуры с помощью
:~$ setxkbmap -query
rules: evdev
model: pc105
layout: es,gb
variant: winkeys,
- добавить опцию в текущую конфигурацию:
:~$ setxkbmap -option kpdl:commaoss
:~$ setxkbmap -query
rules: evdev
model: pc105
layout: es,gb
variant: winkeys,
options: kpdl:commaoss
- Чтобы удалить все параметры, используйте пустой аргумент параметра.
:~$ setxkbmap -option
Если вам требуется сопоставление, которое не предопределено там, например, пример, который вы разместили, вам нужно будет написать его самостоятельно , как описано в этом ответе.