English | Русский

Блог о Linux и велосипедах

xchainkeys — глобальные сочетания клавиш

xchainkeys позволяет создавать глобальные сочетания клавиш в стиле Emacs и ratpoison.

xbindkeys

Думаю, многие, кто знаком с Emacs, ratpoison и другими программами с гибким назначением сочетаний клавиш, знают и про xbindkeys. xbindkeys работает в качестве демона и обрабатывает глобальные сочетания клавиш, назначенные пользователем в конфигурационном файле ~/.xbindkeysrc. Одной из уникальных особенностей программы является возможность составлять конфигурацию на языке Scheme (Guile). В частности это позволяет создавать последовательности, не ограниченные по количеству клавиш. Но возможности программы этим вовсе не ограничивается. Например, при желании можно повесить действие на некоторый ритм, выстукиваемый определёнными клавишами. Посмотреть полезные примеры конфигурационных файлов xbindkeys можно тут и тут.

Мне лично бы хотелось записывать в ~/.xbindkeysrc сочетания клавиш в нотации Emacs или хотя бы похожей. Это сделало бы определения сочетаний клавиш более простыми и наглядными. В долгосрочной перспективе я планировал написать необходимую функцию на Guile. Но, как часто бывает, долгосрочным планам не суждено сбываться. И вот однажды я случайно на Google Code наткнулся на xchainkeys. А недавние проблемы с xbindkeys, который по непонятным причинам у меня начал тихо вылетать, заставили меня ещё раз взглянуть на xchainkeys.

xchainkeys

xchainkeys, как можно догадаться из названия, изначально предполагает возможность определения последовательностей (цепочек) клавиш.

Конфигурационный файл записывается в ~/.config/xchainkeys/xchainkeys.conf. В нем указываются глобальные настройки и сочетания клавиш. И те, и те записываются в одну строку, в результате конфиг получается более компактным и разборчивым. Типичный биндинг выглядит так:

A-f :exec firefox http://vlevit.org

Другие примеры клавиш: C-a C-b, C-a b, f C-W-F1, C-A-W-XF86Calculator. Обозначение той или иной клавиши можно узнать при помощи xchainkeys --keys.

Подобно ratpoison'у сочетания с дублирующей последней клавишей посылаются программе. Например, если определить клавишу C-a C-s, то C-a C-a пошлет сочетание C-a активной программе. Если определена и C-a C-a, то посылку C-a активной программе можно повесить на C-a C-s следующим образом:

C-a C-s :escape

Отмена цепочки клавиш происходит по C-g. Это можно переопределить для каждого сочетания клавиш отдельно. Например, чтобы оборвать сочетание C-a ... по A-n, можно определить следующее действие:

C-a A-n :abort

Отмена сочетаний также происходит автоматически спустя 3 секунды. За это значение отвечает глобальная переменная timeout, которую, разумеется, можно также переопределить. Чтобы изменить timeout для отдельной цепочки, можно указать параметр timeout действия enter:

C-a :enter timeout=1000
C-a C-s :exec gmrun

Отключить автоматический обрыв сочетаний клавиш можно указав 0 в timeout. А значение опции abort, равное manual, приведет к тому, что xchainkeys не будет освобождать клавиатуру после выполнения действия или при нажатии несуществующей комбинации. Таким образом, можно продолжать выполнять другие действия с тем же префиксом, не повторяя каждый раз его. А чтобы выйти из этого состояния, следует нажать C-g. Например с помощью следующего конфига

W-w  :enter abort=manual timeout=0
W-w 1 :exec wmctrl -s 0
W-w 2 :exec wmctrl -s 1
W-w 3 :exec wmctrl -s 2
W-w 4 :exec wmctrl -s 3

после нажатия W-w можно переключаться между рабочими столами по клавишам 1, 2, 3, 4. А когда надоест, нужно нажать C-g.

Похожего эффекта можно достичь, используя группы. Например, чтобы можно было управлять курсором мыши с помощью стрелочек, а Enter эмулировал нажатие на левую кнопку мыши, можно сделать так:

W-m Up :group xdotool mousemove_relative -- 0 -10
W-m Down :group xdotool mousemove_relative 0 10
W-m Right :group xdotool mousemove_relative 10 0
W-m Left :group xdotool mousemove_relative -- -10 0
W-m Return :group xdotool click 1

Основное отличие использование групп от предыдущего метода (:enter abort=manual timeout=0) в том, что на W-m можно продолжать вешать другие сочетания клавиш с помощью :exec. xchainkeys определит, что сочетание не принадлежит группе и отпустит клавиатуру сразу после выполнения команды. Также можно создавать другие группы для того же префикса, для этого нужно указывать имя группы. Для примера определим действие расположения окна по углам экрана и повесим его на то же префикс (W-m):

W-m h :group "windowmove" xdotool getactivewindow windowmove 0 0
W-m j :group "windowmove" xdotool getactivewindow windowmove 0 10000
W-m k :group "windowmove" xdotool getactivewindow windowmove 10000 0
W-m l :group "windowmove" xdotool getactivewindow windowmove 10000 10000

Теперь после сочетания W-m h нажатие клавиши из другой группы (default), например Up, оборвет цепочку. А новое сочетание W-m g :exec... отпустит клавиатуру сразу после выполнения команды.

Среди других полезных действий, есть :reload — перегрузить конфигурационный файл и еще пару, которые вы найдете в man'е.

xbindkeys vs. xchainkeys

Преимущества xbindkeys:

  • крайне конфигурируемый (программируемый);
  • обрабатывает события клавиатуры и мыши.

Преимущества xchainkeys:

  • лёгкое определение длинных сочетаний клавиш;
  • компактная конфигурация;
  • некоторые удобные фичи из коробки.

Комментарии

RSS
Здесь можно Markdown