Ваша идея использования 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-терминал".
Надеюсь, это поможет.