Есть ли способ сделать одновременные нажатия клавиш в привязке клавиш, например. для клавиш w, e, f, при нажатии которых с интервалом в 0,05 секунды друг от друга запускалась команда?
Чтобы быть более конкретным:
Если w, e, f нажаты в пределах 0,05 секунды друг от друга, то при нажатии последней XMonad должен вызвать указанную команду . XMonad тоже должен был перехватить три ключа, чтобы они не шли лишним в сфокусированное окно.
В противном случае (если хотя бы одна из них не будет нажата в течение 0,05 секунды) XMonad должен отправить клавиши в выделенное окно, как обычно.
Моя цель в этом состоит в том, чтобы использовать w, e, f для "Escape" в vim-подобный "Normal Mode", XMonad. Actions.Submap (подкарта).
Обновите методом failed, если кто-то увидит, как это исправить:
Я попытался реализовать это с помощью подкарт, так что, например, если вы нажмете w, вы попадете в chord_mode_w
, если вы нажмете e оттуда, вы попадете в chord_mode_we
, и если вы нажмете f оттуда, вы в конце концов окажетесь, например, в normal_mode
. Реализация была очень запутанной: я включил в свои основные сочетания клавиш что-то вроде:
("w", spawn "xdotool key <chord_mode_w_keybinding> ; sleep 0.05 ; xdotool key <abort_keybinding>")
(chord_mode_w_keybinding, chord_mode_w)
для обнаружения w (остальное будет аналогичным), а также (неполных) подкарт, таких как:
chord_mode_w = submap . mkKeymap c $
[
("e", chord_mode_we )
, ("f", chord_mode_wf )
, (abort_keybinding, pasteString "w")
-- in order for the submap to not eat all other letters,
-- would need to include all mappings like:
, ("a", pasteString "wa")
, ("b", pasteString "wb")
...
]
chord_mode_we = submap . mkKeymap c $
[
("f", normal_mode )
, (abort_keybinding, pasteString "we")
-- in order for the submap to not eat all other letters,
-- would need to include all mappings like:
, ("a", pasteString "wea")
, ("b", pasteString "web")
...
]
chord_mode_wf = submap . mkKeymap c $
[
("e", normal_mode )
, (abort_keybinding, pasteString "wf")
-- in order for the submap to not eat all other letters,
-- would need to include all mappings like:
, ("a", pasteString "wfa")
, ("b", pasteString "wfb")
...
]
Полная реализация, очевидно, была бы очень грязной, но теоретически должна была отправить меня в normal_mode
, если бы я нажимал "wef" в пределах 0,05 секунды друг от друга, прерывая и вводя символы в противном случае. Однако возникли две проблемы:
pasteString
(а также другие функции вставки вXMonad.Util.Paste
) слишком медленны для обычного набора текстаЯ бы оказался в
normal_mode
лишь в небольшой части времени, даже если бы я установил задержку прерывания намного выше. Не уверен в причине этого.
(Причина, по которой я использовал pasteString
при прерывании вместо порождения другого xdotool
, заключалась в том, что вывод xdotool
повторно запускал один из chord_mode_w_keybinding
, chord_mode_e_keybinding
, chord_mode_f_keybinding
обратно в основные сочетания клавиш, отправляя меня обратно к режимам аккордов на неопределенный срок.)
Submap
документации. Вы хотите иметь такую задержку (0,05 с), или что конкретно пример вам не дает? - person deshtop   schedule 02.01.2015