Xbindkeys не будет работать должным образом

9

У меня есть небольшая проблема. Я хотел переназначить некоторые горячие клавиши из моей предыдущей системы, но я не могу заставить их работать должным образом xbindkeys.

xbindkeys распознает комбинацию, но команда не запускается.

Если я использую команду

xdotool key braceleft

Он выводит мне правильный {знак в консоли. Однако, если я использую ту же команду в xbindkeys, ничего не произойдет. Если я заменю команду на firefoxнее, она будет работать правильно и откроет firefox, так что я думаю, что xbindkeysработает.

Я хочу добиться следующего:

Я хочу напечатать символ {в активном окне с помощью Alt_R+ 7или Alt_Left+ Ctrl+, 7чтобы я мог использовать оба. Я знаю, что Alt_R(AltGr) - правильный путь, но на немецких клавиатурах сложно набрать скобу с помощью AltGrклавиши (Alt_R), поэтому я ДОЛЖЕН использовать вместо нее Alt_L+ Control+ 7(как раньше в предыдущей системе). Я как-то заставил его работать должным образом в 12.04, но я не могу заставить его работать в 14.04.

Какие-либо предложения? Я попробовал несколько команд. Все они работали в консоли, но ни один из них не работал при исполнении xbindkeys

xdotool type '{'
xdotool key braceleft
xdotool key ISO_Level3_Shift+7
xvkbd -xsendevent -text '{'
xvkbd -xsendevent -text '\[Alt_R]+7'

Это мой конфиг, который не будет работать

"xdotool key braceleft"
Control+Alt + 7

Тем не менее, это работает:

"firefox"
Control+Alt + 7

Решение Править

Когда я попробовал еще несколько вещей, я заметил, что xdotool запускается слишком рано. Я изменил конфиг так:

"sleep 1 && xdotool type --delay 15 '{'"
Control+Alt + 7

ТЕПЕРЬ отправляет правильный знак {в активное окно. Теперь осталось только уменьшить сон и задержку до работоспособного значения, потому что 1 секунда кажется слишком длинной :)

** Дополнительная информация ** Ну, теперь мне удалось найти подходящие значения. ОДНАКО это работает только в том случае, если вы отпускаете ключи до тех пор, пока продолжительность сна не закончится. Если вы слишком медленный, если не будет работать.

Это мой текущий конфиг для всех неудобных немецких символов AltGr

"sleep 0.2 && xdotool type --delay 15 '{'"
Control+Alt + 7

"sleep 0.2 && xdotool key --delay 15 at"
Control+Alt + q

"sleep 0.2 && xdotool type --delay 15 '€'"
Control+Alt + e

"sleep 0.2 && xdotool type --delay 15 '['"
Control+Alt + 8

"sleep 0.2 && xdotool type --delay 15 ']'"
Control+Alt + 9

"sleep 0.2 && xdotool type --delay 15 '}'"
Control+Alt + 0

"sleep 0.2 && xdotool type --delay 15 '~'"
Control+Alt + plus

Однако, если вы хотите набрать несколько знаков @ (например), вы должны нажать Ctrl + Alt + Q, как и предполагалось, но отпустить все клавиши и затем нажать ее снова. Это, однако, намного, намного лучше, чем отсутствие опции Control + Alt вместо AltGr, но это не так эффективно, как я тоже использовал. Может быть, я найду решение для этого тоже.

Элло
источник
Да, это хорошая находка! Для ответа на ваш вопрос нет ограничений на количество повторений, только ограничение по времени . Было бы здорово, если бы вы могли вернуться и опубликовать это как ответ через 6 часов. Это также даст вам некоторую репутацию, если вы заботитесь об этом. Если вам действительно все равно, я просто включу ваше решение в мой ответ через несколько дней.
Тердон
Вы когда-нибудь выясняли, как заставить xdotoolповторять клавишу, пока она удерживается?
Фаржер
Если честно, я уже не пробовал. Я успешно заставил League of Legends работать со скоростью 60 кадров в секунду (в 12.04 он вообще не запускался), так что я, находясь дома, играл все время.
Элло
Я не получил несколько ярлыков, работающих в течение нескольких дней. Решение было простым: мой рабочий стол Ubuntu получил ярлыки до xbindkeys. Просто отредактируйте настройки kayboard, добавьте новый пользовательский ярлык с действиемxdotool getactivewindow key Home
BurninLeo
Похоже, вы пытаетесь смоделировать немецкую раскладку клавиатуры. Почему бы вам просто не переключить раскладку клавиатуры в настройках системы?
Рапти

Ответы:

4

Проблема в xdotoolтом, что при нажатии настоящих клавиш Xorg многократно отправляет события нажатия клавиш (смотрите xevвывод). Чтобы преодолеть это, вам нужно временно отключить функцию повтора, а затем создать событие KeyRelease для ключа, который был выключен.

Вместо

"sleep 0.2 && xdotool type --delay 15 '{'"
  Control+Alt + 7

попробуйте следующее:

"xset r off; xdotool keyup --window 0 7 type --clearmodifiers --window 0 '{'; xset r on"
  Control+Alt + 7
midenok
источник
Спасибо за ваш ответ, но я сейчас использую Manjaro с XFCE, и там он работал из коробки, поэтому спать не нужно.
Элло
@ Здравствуйте, эти ответы не только для вас, поэтому мы ценим самое универсальное решение.
Миденок
3

Когда я попробовал еще несколько вещей, я заметил, что xdotool запускается слишком рано. Я изменил конфиг так:

"sleep 1 && xdotool type --delay 15 '{'"
Control+Alt + 7

ТЕПЕРЬ отправляет правильный знак {в активное окно. Теперь осталось только уменьшить сон и задержку до работоспособного значения, потому что 1 секунда кажется слишком длинной :)

** Дополнительная информация ** Ну, теперь мне удалось найти подходящие значения. ОДНАКО это работает только в том случае, если вы отпускаете ключи до тех пор, пока продолжительность сна не закончится. Если вы слишком медленный, если не будет работать.

Это мой текущий конфиг для всех неудобных немецких символов AltGr

"sleep 0.2 && xdotool type --delay 15 '{'"
Control+Alt + 7

"sleep 0.2 && xdotool key --delay 15 at"
Control+Alt + q

"sleep 0.2 && xdotool type --delay 15 '€'"
Control+Alt + e

"sleep 0.2 && xdotool type --delay 15 '['"
Control+Alt + 8

"sleep 0.2 && xdotool type --delay 15 ']'"
Control+Alt + 9

"sleep 0.2 && xdotool type --delay 15 '}'"
Control+Alt + 0

"sleep 0.2 && xdotool type --delay 15 '~'"
Control+Alt + plus

Однако, если вы хотите набрать несколько знаков @ (например), вы должны нажать Ctrl + Alt + Q, как и предполагалось, но отпустить все клавиши и затем нажать ее снова. Это, однако, намного, намного лучше, чем отсутствие опции Control + Alt вместо AltGr, но это не так эффективно, как я тоже использовал. Может быть, я найду решение для этого тоже.

Элло
источник
Это очень странно, я рад, что вы с этим разобрались, но я действительно не могу понять, почему это происходит. В любом случае, спасибо, что нашли время опубликовать это, это может помочь следующему человеку с той же проблемой.
Тердон
Вместо sleep, я думаю, вы хотите добавить + releaseв комбинации клавиш. Это скажет xbindkeysподождать, пока ключ отпущен, прежде чем запускать команду.
wjandrea
3

Как задокументировано в похожих вопросах ( почему эти команды xte работают в терминале, а не когда они связаны с xbindkeys? ), Вы можете задать запускxbindkeys событий при освобождении (при ключе вверх):

"xdotool key braceleft"
   Release+Control+Alt + 7

Таким образом, нет конфликта между клавишами, используемыми для ярлыка, и теми, которые были отправлены.

Майкл
источник
2

У меня недавно была эта проблема, когда я пытался смоделировать мультимедийную клавишу Play / Pause (XF86AudioPlay) с помощью Ctrl + G. После некоторых исследований выяснилось, что мне нужно не только отменить Control , но и клавишу g (которая какая нужна sleep 0.1задержка для начала). Если я отменю оба эти ключа с помощью команды keyupxdotool, а также ключа --clearmodifiers, это сработает. Это моя новая команда в моем файле .xbindkeys.rc:

"xdotool keyup g key --clearmodifiers XF86AudioPlay"
Control + g
QuickishFM
источник
1

Не уверен, почему это не работает xbindkeys, я думаю, вам нужно указать окно для записи. В качестве обходного пути вы можете использовать xvkbdвместо этого.

  1. устанавливать xvkbd

    sudo apt-get install xvkbd
    
  2. Добавьте это в свой .xbindkeysrcфайл

    "xvkbd -text '{'"
    Control+Alt + 7
    

Это должно работать.


НОТЫ

По какой-то причине на моем аппарате xvkbdиспользуется один из моих дополнительных макетов (испанский) вместо моего основного (американский английский), и это приводит {к фактической печати ". Если у вас также есть эта проблема, просто поиграйте немного, чтобы узнать, какая клавиша соответствует {используемой раскладке. Кроме того, вы можете копать глубже и выяснить, откуда xvkbdберет свои localeнастройки.

terdon
источник
все еще не работает. даже с правильными персонажами. если я пишу xvkbd -text 'apple' в консоли, он печатает apple, если я выполняю его через xbindkeys, ничего не происходит. если я смотрю на xbindkeys -v, он видит, что он распознал нажатую команду
Ello
я получил его на работу, но с чем-то другим
Элло
@ Отлично, отлично! Что ты использовал? Это работало нормально для меня. Не могли бы вы опубликовать ответ, объясняющий ваше решение и принять его?
Тердон
Я изменил свой пост, я не могу отвечать на свои вопросы из-за отсутствия репутации. Извините
Ello