Назначение комбинации клавиш для конкретного приложения?

18

Мне известен ряд способов переназначения комбинаций клавиш в Ubuntu на глобальном уровне (например, глобальное переназначение Ctrl + S для отправки Ctrl + D или что-то в этом роде), например, приложение xbindkeys . Однако мне нужен способ сделать это только для конкретного приложения . Например, что-то вроде «Переопределить 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-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-терминал".

Надеюсь, это поможет.

xubuntix
источник
1
Это в конечном итоге работает просто отлично. Я не использовал xdotool для отправки нажатий клавиш, я просто использовал xvkbd -xsendevent -text "\Cs". Это, похоже, не страдает от проблем, которые вы видели с xdotool.
Дерек Турн
не возможно сделать сам вызов с ключом, как fвызов xdotool key f. Все еще ищу способ сделать это.
phil294
ха, наконец нашел один! xdotool type --window $(xdotool getwindowfocus) [keys] использование опции --window и отправка в текущее активное окно НЕ приведут к рекурсивному поведению.
phil294
2

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

aramadia
источник
autokeyПУТЬ быстрее, чем xbindkeysдаже при включенном режиме обнаружения окна - немедленные действия предприняты. Недостаток: назначения кнопок мыши, кажется, не работают (я думаю, что это ошибка)
phil294