Ý tưởng của bạn về việc sử dụng xbindkeys nghe có vẻ tốt:
trong .xbindkeysrc
thêm một liên kết phím mới:
"app_specific_keys.sh"
Control+s
Điều này sẽ thực thi "app_specific_keys.sh"
khi bạn nhấn ctrl+s
.
Bây giờ bạn cần xác định kịch bản. Nó sẽ nhận được cửa sổ hoạt động và từ đó tên của ứng dụng hiện đang tập trung:
xprop -id `xdotool getactivewindow` |awk '/WM_CLASS/{print $4}'
Điều này sẽ thực hiện một mẹo nhỏ: nó yêu cầu xdotool cho cửa sổ hoạt động, sau đó hỏi xprop cho tất cả các thuộc tính của cửa sổ với id đã cho, và sau đó giảm đầu ra rất dài cho tên của ứng dụng (thực ra là lớp của nó). Nếu bạn chạy cái này trong một thiết bị đầu cuối gnome, bạn sẽ nhận được
"Gnome-terminal"
Bây giờ bạn cần xác định hành động cho các ứng dụng của mình:
if [ $N = '"Gnome-terminal"' ]; then
xdotool key --clearmodifiers ctrl+s
else
xdotool key --clearmodifiers ctrl+d
fi
Vì vậy, cùng nhau, kịch bản "app_specific_keys.sh"
có thể trông như thế này:
#!/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
Điều này sẽ làm việc, nhưng như trong câu hỏi này , tôi phải thừa nhận rằng nó không. Có lẽ vì một trong Compiz, Unity, Global Menu không hoạt động tốt với --clearmodifiers
tùy chọn xdotool. Một cách giải quyết khác là thêm một giấc ngủ phía trước tập lệnh của bạn vào oder để có thể tự giải phóng các phím: Trong .xbindkeysrc
thay đổi của bạn đối với thao tác bấm phím này:
"sleep 0.5; app_specific_keys.sh"
Control+s
Là một sidenote: điều này sẽ không hoạt động, nếu bạn muốn thay đổi các khóa cho các chương trình chạy trong một thiết bị đầu cuối (ví dụ vi hoặc emacs trong chế độ bảng điều khiển). Lớp ứng dụng được trả về vẫn sẽ là "Gnome-terminal".
Mong rằng sẽ giúp.