CapsLock как ключ-модификатор для раскладок приложений

11

Я разработчик, и в настоящее время я использую Ubuntu Linux с PyCharm IDE для разработки веб-сайта. Чтобы улучшить производительность печати, я думаю изменить CapsLock на Hyper_L и назначить его для mod3 с помощью xmodmap. После этого я хочу отобразить mod3 для клавиши «i» на «Вверх». Пока что я сделал:

xmodmap -e "keysym Caps_Lock = Hyper_L"

вывод выглядит так:

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Hyper_L (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

тогда я удаляю Hyper_L из mod4

xmodmap -e "remove Mod4 = Hyper_L"

После этого я попытался назначить Hyper_L для mod3

xmodmap -e "add Mod3 = Hyper_L"

Однако я получил ошибку в следующем:

X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  118 (X_SetModifierMapping)
  Value in failed request:  0x17
  Serial number of failed request:  11
  Current serial number in output stream:  11

Итак, в чем здесь проблема? Как я могу заставить это работать? Правильный ли мой подход? Или я должен использовать другой подход, чтобы использовать mod3 для пользовательских ключей?

PS Я использую клавиатуру Microsoft Natural Ergonomic 7000

Хамидулла
источник

Ответы:

20

В Интернете есть баджиллионные ответы, большинство из которых сбивают с толку.

Ключ заключается в том, что вам нужно сопоставить код клавиши 66 с вашим гиперключем, удалить отображение этого ключа из других мод {1,2,4,5} (только если присутствует), а затем установить мод3.

Откройте ~ / .Xmodmap и поместите следующее:

! Unmap capslock
clear Lock
keycode 66 = Hyper_L

! Leave mod4 as windows key _only_
remove mod4 = Hyper_L

! Set mod3 to capslock
add mod3 = Hyper_L

Запустить это

xmodmap ~/.Xmodmap

Если что-то пойдет не так, вы можете сбросить настройки клавиатуры с помощью:

setxkbmap -layout us

Вероятные причины взрыва в том, что Hyper_L отображается в другом месте. Исправьте это, запустив xmodmap без аргументов, чтобы выяснить, что еще связано с Hyper_L. Когда вы знаете, что вам нужно удалить, добавьте 'remove BINDING = Hyper_L' в ваш файл .Xmodmap.

Файл .Xmodmap будет загружен при открытии сеансов X11, это отображение должно быть на месте при следующем входе в систему или перезагрузке.

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

heymatthew
источник
@antindexer у тебя сработало?
Heymatthew
Я попробовал довольно много ответов, и это тот, который работал для меня. По крайней мере, это было сделано на голой металлической установке Linux. Как ни странно, он не работает в QEMU / KVM, работая только на альтернативных нажатиях клавиши блокировки крышки.
Диагон
0

Я знаю, что этот вопрос довольно старый, но мне нужно поделиться своим решением, так как (расстраивающе) ответ Хеймантью не сработал для меня. Что в итоге сработало для меня:

setxkbmap -layout us -option lv3:caps_switch -variant intl

Это включит capslock в качестве ключа mod3, установит разметку «us» и установит вариант «intl». Если вы используете интерактивную оболочку, такую ​​как fish, вы можете нажать tab после «-layout», «-option» или «-variant», чтобы получить полный список возможных параметров.

Дополнительная информация: год назад я попробовал подход xmodmap на машине с Ubuntu, работающей с оконным менеджером i3, переключаясь со стандартной среды gnome. Я изменил «us» раскладку клавиатуры xkb, в частности международную раскладку с мертвыми клавишами - она ​​работала нормально при использовании gnome-desktop-manager (есть возможность установить caps-lock в качестве клавиши mod3), но я не смог заставить его работать с xmodmap. Это была моя ошибка: я думал, что графический интерфейс gdm использует xmodmap для привязки caps lock к mod3, но на самом деле он устанавливал эту опцию X11. Теперь, когда я переключился на Арку, я был вынужден понять это.

Я рекомендую всем, кто планирует возиться с этим, прочитать справочные страницы по localectl, xmodmap, setxkbmap и тестировать макеты, добавив спящий и возвратный компоненты:

setxkbmap ... ; sleep 10; setxkbmap <INSERT DEFAULT SETTINGS>

это сэкономило мне много времени.

Однако я до сих пор не понимаю, почему подход xmodmap не работает. Надеюсь, это кому-нибудь поможет.

Марк ИО
источник