Я пытаюсь отобразить Caps Lock на клавишу со стрелкой вниз, а Caps Lock с модификатором сдвига на клавишу со стрелкой вверх.
Я пытался использовать xmodmap со следующим входным файлом:
remove Lock = Caps_Lock
keycode 66 = Down Up
Нажатие кнопки caps lock работает для отправки клавиши со стрелкой вниз, но нажатие кнопки caps lock + shift не отправляет вверх.
Что я делаю не так?
В этом решении будет много технических деталей. Не стесняйтесь переходить к разделу файла макета , если вас не волнует проблема, а только ее решение.
Перемещение вверх и вниз с помощью CAPS kbd> и Shift kbd> + CAPS kbd> работает в моей системе с заданной .Xmodmap
как и ожидалось.
Вы проверяете, действительно ли на ваши настройки влияют, вызывая
$ xmodmap -pk | grep ^\\s*66
66 0xffe5 (Caps_Lock) 0x0000 (NoSymbol) 0xffe5 (Caps_Lock)
$ setxkbmap -layout us && xmodmap ~/.Xmodmap
$ xmodmap -pk | grep ^\\s*66
66 0xff54 (Down) 0xff52 (Up)
Существует еще одна (реальная) проблема в вашем вопросе, которая возникает следующим образом:
Модификатор LEVEL2 <SHIFT>
, который активируется нажатием кнопки Shift kbd>, предназначен для визуальной маркировки символов в текстовом редакторе при перемещении по строкам с помощью клавиш со стрелками. Если вы назначите <UP>
↑ kbd> второму уровню <CAPS>
, то, что вы фактически делаете, это нажимаете Shift kbd> + ↑ kbd>. Вы должны деактивировать модификатор Shift только для этого сценария. Afaik вы не можете сделать это с помощью xmodmap.
«Реальный способ» изменения ключей - это xkb . Я нашел решение в старом списке рассылки xorg . LEVEL2 из Caps kbd> должен быть перенаправлен на клавишу ↑ kbd> (<UP>
) (кстати, Up-Key имеет только один уровень.) На X.org вы можете деактивировать модификатор Shift kbd> во время перенаправления со встроенной функцией RedirectKey(key=<UP>, clearmods=Shift)
. clearmods «освобождает» модификатор Shift до того, как клавиша фактически «нажата».
Самый простой способ активировать поведение - создать новый файл макета:
/ usr / share / X11 / xkb / symbols / capslockarrow
default partial xkb_symbols "basic" {
include "de(basic)"
include "shift(both_capslock_cancel)"
key <CAPS> {
type[Group1] = "TWO_LEVEL",
symbols[Group1] = [ Down, NoSymbol ],
actions[Group1] = [ NoAction(), RedirectKey(key=<UP>, clearmods=Shift) ]
};
};
активируйте новый макет с помощью
setxkbmap capslockarrow
Новый файл макета происходит от de(basic)
. Это раскладка стандартной немецкой клавиатуры . Здесь вы можете добавить любой другой макет, например, us(basic)
или us(euro)
. см. /usr/share/X11/xkb/symbols/
, чтобы получить представление о том, что возможно. Двухбуквенный код - это имя файла, а в скобках - соответствующее xkb_symbols
определение из файла.
У вас больше не будет модификатора ключа заглавных букв. Поэтому я добавил своего рода замену для Caps kbd>: shift(both_capslock_cancel)
Нажав одновременно LSHIFT kbd> и RSHIFT kbd>, вы можете активировать CAPS Lock. kbd> и вы снова снимаете блокировку любым другим нажатием клавиши Shift kbd>.
Если кому-то интересно, почему я не использовал для этого новое определение типа: я просто не мог выпустить модификатор Shift до того, как сработала клавиша «вверх». Отпускание клавиши Shift должно быть возможно путем явного вызова preserve[Shift] = None
в отдельном xkb_types
.
Как указано в комментариях ниже, Wayland также будет полагаться на XKB, но не будет разрешать перенаправления.