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


236

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

т.е.

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

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


зацените мой ответ здесь . Не стоит копировать и вставлять один и тот же ответ. Возможно, это поможет вам.
Рахул Вирпара

1
Есть ли Emacs-подобные привязки здесь для CTRL-P / N для единичных шагов?
Лео Леопольд Херц '

Так как некоторое время xmodmapдепортируется! чтобы получить общесистемную настройку, которую вы должны использовать xkb. Поэтому отредактируйте языковой файл, /usr/share/X11/xkb/symbols/чтобы добавить туда свои изменения. См. Askubuntu.com/a/898462/34298
rubo77

Ответы:


249

Примечание: с 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"
    

Дополнительная информация: Последовательность этих отображений Key, Shift+Key, mode_switch+Key, mode_switch+Shift+Key, AltGr+Key, AltGr+Shift+Key. Чтобы пропустить столбец используйте 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.


3
xevне может отловить Fnнажатия клавиш
om-nom-nom

3
Выбранный ответ не сработал для переназначения ключа Caps-lock для меня в Ubuntu 12.10. Я смог сделать это, зайдя в «Системные настройки» -> «Клавиатура» -> «Настройки макета» -> «Параметры», в котором есть список клавиш и альтернативных вариантов поведения. Работал без нареканий в Unity и Terminal.
Аллил Изоцианат

1
Если у вас подключено несколько клавиатур, увидят ли эти инструменты разницу между одной и той же клавишей на другой клавиатуре?
Stommestack

1
Странно, я все сделал, но после перезапуска мои раскладки клавиш сбрасываются.
Коста

1
Я не думаю, что у меня есть -eventфлаг в Ubuntu 12.04. Выдает ошибку и не упоминает «событие» в man xev.
изоморфизм

20

Если вы пытаетесь переместить клавишу 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

+1 Самый unix-y ответ из всех этих для модификатора (я уже сделал так, еще с моим iBook 2, когда я хотел, чтобы клавиша ввода имела функцию Control_R, но забыл детали).
rbrito

2
Важный ответ для пользователей, использующих клавиатуры на ноутбуках Lenovo
Эйнар Олафссон

16

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

ОБНОВЛЕНИЕ : моя «запоздалая мысль» была подтверждена; (Я ответил на неправильный вопрос:) ... пожалуйста, посмотрите ответ вики сообщества 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 в ответе на этот вопрос. страница аскубунту


+1, очень приятно! Предложение: Вы должны интегрировать свой отличный ответ от другого вопроса в этот, возможно, также немного объяснить формат конфигурации xbindkeys.
Стефано Палаццо

1
Часть о назначении других ключей может быть обработана xdotool, посмотрите страницу руководства, я использовал ее для решения этой проблемы .
Стефано Палаццо

Недавно я нашел другой подход с инструментом под названием xmodmap в сочетании с инструментом под названием xev. я не знаю, в чем разница между xmodmap и xbindkeys, но для меня это очень хорошо работает. какой-нибудь совет с инструментом, чтобы предпочесть из названных двух? Вот очень полезное пошаговое руководство, описывающее xmodmap и xev ubuntuforums.org/showpost.php?p=7675138&postcount=2
NES

@NES .. Похоже, я обратился не к той точке .. Вы, кажется, хотите на самом деле переназначить способ интерпретации определенной клавиши ОС, то есть нестандартную интерпретацию клавиатуры, тогда как я ссылался на стандартная интерпретация клавиатуры и просто перегрузка назначений клавиш по умолчанию. (Я думаю, что вы после того, как вы
поменялись

да, но не проблема. ответ тоже интересный. пошаговое руководство я разместил ссылку выше было правильным способом. поэтому я опубликую короткий ответ с решением, что у других пользователей есть хорошее руководство. спасибо Фред
РЭШ

9

Вот как я пытался переключить отображение ENTERключа на 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ключом. Пойди разберись.


7

Чтобы сделать глобальные переопределения независимо от 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

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


3

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

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

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

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

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


2

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

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

Это сработало безупречно для настройки Super+Cи Super+Vдля Ctrl+Cи Ctrl+V. Просто идеальное решение при использовании Ubuntu через VirtualBox на Mac
Бен

Однако это не отключает другие команды, которые прослушивают эти ярлыки. Чтобы отключить Super+V«показ списка уведомлений», зайдите в Настройки -> Устройства -> Клавиатура и отключите его там
Бен

@Ben да, было бы замечательно, если бы он отображал привязки других приложений, но это скорее глазурь на торте. Моя проблема в том, что невозможно переназначить клавишу «Fn». Я решил попробовать UHK-клавиатуру - эта штука программируемая независимо от ОС, посмотрим, как она будет работать.
Эго

0

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

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

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

Enable=1
MapK112=K110
MapK117=K115
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.