Перезагрузка комбінації клавіш для програми?


18

Мені відомо про декілька способів перекомпонування комбінацій клавіш в Ubuntu на глобальній основі (наприклад, глобальна перестановка Ctrl + S для надсилання Ctrl + D або щось подібне), наприклад, додаток xbindkeys . Мені потрібно, але це спосіб зробити це лише для конкретної програми . Наприклад, щось на кшталт "Remap Ctrl + S для надсилання Ctrl + D, але лише в Chrome ". Чи є спосіб досягти цього?


Ви читали цю тему ? Я не пробував цього, але мені здається, що ви точно шукаєте. Я не знаю, якби про це написати належну відповідь.
мастило

Відповіді:


12

Ваша ідея використання xbindkeys звучить добре:

у своєму .xbindkeysrcдодаванні додайте нове прив'язку клавіш:

"app_specific_keys.sh"
   Control+s

Це буде виконано "app_specific_keys.sh"при натисканні ctrl+s.

Тепер потрібно визначити сценарій. Він повинен отримати активне вікно, а звідти назву програми, на яку зараз зосереджено фокус:

xprop -id `xdotool getactivewindow` |awk '/WM_CLASS/{print $4}'

Це зробить трюк: він запитує xdotool для активного вікна, потім запитує xprop для всіх властивостей вікна з заданим ідентифікатором, а потім зменшує самий багатослівний вихід до імені програми (власне її класу). Якщо запустити це в gnome-терміналі, ви отримаєте

"Gnome-terminal"

Тепер потрібно визначити дії для своїх додатків:

if [ $N = '"Gnome-terminal"' ]; then                                                    
    xdotool key --clearmodifiers ctrl+s                                                          
else                                                                            
    xdotool key --clearmodifiers ctrl+d                                                          
fi  

Отже разом сценарій "app_specific_keys.sh"може виглядати так:

#!/bin/bash                                                                     
W=`xdotool getactivewindow`                                                     
S1=`xprop -id ${W} |awk '/WM_CLASS/{print $4}'`                                 
S2='"Gnome-terminal"'                                                           
if [ $S1 = $S2 ]; then                                                          
   xdotool key --clearmodifiers ctrl+d                                             
else                                                                            
   xdotool key --clearmodifiers ctrl+s                                          
fi  

Це має працювати, але як і в цьому питанні , я мушу визнати, що це не так. Можливо, тому, що один із Compiz, Unity, Global Menu не дуже добре працює з --clearmodifiersопцією xdotool. Приблизним рішенням може бути додавання сну перед вашим сценарієм в одній формі, щоб мати можливість випустити ключі самостійно: .xbindkeysrcВнесення змін до цього прив'язки клавіш:

"sleep 0.5; app_specific_keys.sh"
   Control+s

Як сторонне позначення: це не спрацює, якщо ви хочете змінити клавіші для програм, які працюють у терміналі (наприклад, vi або emacs в консольному режимі). Повернений клас додатка все ще буде "Gnome-терміналом".

Сподіваюся, що це допомагає.


1
Це в результаті працювало просто чудово. Я не використовував xdotool для надсилання натискань клавіш, я просто використовував xvkbd -xsendevent -text "\Cs". Схоже, це не страждає від проблем, які ви бачили з xdotool.
Дерек Thurn

самостійно здійснити ключовий дзвінок неможливо, як fдзвінок xdotool key f. Ще шукаємо спосіб це зробити.
phil294

га, нарешті знайшов! xdotool type --window $(xdotool getwindowfocus) [keys] використання опції --window та пересилання в поточно активне вікно НЕ призводить до рекурсивної поведінки.
phil294

2

autokey - це як AutoHotkey для Ubuntu. Ви можете писати сценарії в python та виконувати їх за допомогою комбінації клавіш та фільтра Windows (що робить його псевдо-додатком). Ваш сценарій може керувати подіями клавіатури та миші та навіть переміщувати вікна навколо, як додатковий штрих.


autokeyШЛИШЕ швидше xbindkeys, навіть якщо ввімкнено режим виявлення вікон - негайно вжиті дії. Знизу: призначення кнопок миші, здається, не працює (я думаю, що це помилка)
phil294
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.