xcape позволяет вам использовать клавишу-модификатор в качестве другой клавиши при нажатии и отпускании отдельно. Обратите внимание, что это немного медленнее, чем нажатие исходной клавиши, поскольку событие нажатия не происходит, пока клавиша не будет отпущена. Поведение по умолчанию — генерировать клавишу Escape, когда левый элемент управления нажимается и отпускается самостоятельно. (Если вы не понимаете, зачем кому-то это нужно, то я предполагаю, что Vim — не ваш любимый текстовый редактор;)
Сначала установите зависимости разработки. В системах на базе Debian (включая Ubuntu и Linux Mint) запустите:
$ sudo apt-get install git gcc make pkg-config libx11-dev libxtst-dev libxi-dev
В системах на базе Fedora запустите:
$ sudo dnf install git gcc make pkgconfig libX11-devel libXtst-devel libXi-devel
Затем запустите:
$ git clone https://github.com/alols/xcape.git
$ cd xcape
$ make
$ sudo make install
$ xcape [-d] [-f] [-t <timeout ms>] [-e <map-expression>]
-d
Режим отладки. Не переходит в фоновый режим. Печатает отладочную информацию.
-f
Режим переднего плана. Не переходит в фоновый режим.
-t <timeout ms>
Если вы удерживаете клавишу дольше этого тайм-аута, xcape не будет генерировать событие ключа. По умолчанию — 500 мс.
-e <map-expression>
Выражение имеет грамматику 'ModKey=Key[|OtherKey][;NextExpression]'
Список имен ключей находится в заголовочном файле X11/keysymdef.h
(удалите префикс XK_
). Обратите внимание, что из-за ограничений X11 сдвинутые клавиши должны быть указаны как клавиша Shift, за которой следует нажимаемая клавиша, а не фактическое имя символа. Например, для создания «{» можно использовать выражение 'ModKey=Shift_L|bracketleft'
(при условии, что у вас есть ключ с «{» над «[»).
Вы также можете указать ключи в десятичном (префикс #
), восьмеричном ( #0
) или шестнадцатеричном виде ( #0x
). Они будут интерпретироваться как коды клавиш, если не будет найдено соответствующее имя ключа.
Это заставит левый Shift генерировать Escape при нажатии и отпускании самостоятельно, а левый элемент управления будет генерировать комбинацию Ctrl-O при нажатии и отпускании самостоятельно.
xcape -e 'Shift_L=Escape;Control_L=Control_L|O'
В сочетании с xmodmap можно сделать обычную клавишу дополнительным модификатором. Сначала сопоставьте ключ с модификатором с помощью xmodmap, а затем модификатор обратно с ключом с помощью xcape. Однако у этого есть несколько ограничений: клавиша не будет работать как обычно, пока ее не отпустят, и, в частности, она может непреднамеренно действовать как модификатор, если вы печатаете слишком быстро. Это не ошибка в xcape, а неизбежное последствие совместного использования этих двух инструментов таким образом. Например, мы можем заставить пробел работать как дополнительную клавишу Ctrl при удерживании (аналогично Space2ctrl) с помощью следующей последовательности команд.
# Map an unused modifier's keysym to the spacebar's keycode and make it a
# control modifier. It needs to be an existing key so that emacs won't
# spazz out when you press it. Hyper_L is a good candidate.
spare_modifier="Hyper_L"
xmodmap -e "keycode 65 = $spare_modifier"
xmodmap -e "remove mod4 = $spare_modifier" # hyper_l is mod4 by default
xmodmap -e "add Control = $spare_modifier"
# Map space to an unused keycode (to keep it around for xcape to
# use).
xmodmap -e "keycode any = space"
# Finally use xcape to cause the space bar to generate a space when tapped.
xcape -e "$spare_modifier=space"
Если у вас есть привычка переназначать коды клавиш на символы клавиш (например, с помощью xmodmap), вы можете столкнуться с двумя проблемами.
Вам нужно будет перезапускать xcape после каждого изменения сопоставления кодов клавиш с символами клавиш (например, с помощью xmodmap), иначе xcape все равно будет использовать старое сопоставление.
Ключ, который вы хотите отправить, должен иметь определенный код ключа. Так, например, при сопоставлении по умолчанию Control_L=Escape
вам все равно понадобится клавиша escape, определенная в вашем сопоставлении xmodmap. (Я обхожу эту проблему, используя 255, который моя клавиатура не может отправить).
Найдите последнюю версию на https://github.com/alols/xcape.
С автором можно связаться по адресу albin dot olsson по адресу gmail dot com.