I use emacs and have fill commands set to Alt-Tab in certain modes and, as a creature of habit, would like to keep it that way.
Is there an easy way to disable application switching via Alt-Tab when emacs is open?
I use emacs and have fill commands set to Alt-Tab in certain modes and, as a creature of habit, would like to keep it that way.
Is there an easy way to disable application switching via Alt-Tab when emacs is open?
I have a solution. All what you need is, to start this watcher script:
#!/bin/bash
keySwitchApplication="switch-applications"
keySwitchApplicationBackward="switch-applications-backward"
backupSwitchApplications="$(gsettings get org.gnome.desktop.wm.keybindings "$keySwitchApplication")"
disableSwitchApplications="$(gsettings get org.gnome.desktop.wm.keybindings "$keySwitchApplication" | sed "s/\,*\s*'<Alt>Tab'//")"
backupSwitchApplicationsBackward="$(gsettings get org.gnome.desktop.wm.keybindings "$keySwitchApplicationBackward")"
disableSwitchApplicationsBackward="$(gsettings get org.gnome.desktop.wm.keybindings "$keySwitchApplicationBackward" | sed "s/\,*\s*'<Shift><Alt>Tab'//")"
disabled="0"
while true; do
isActive=$(wmctrl -lx | awk -v search=$(printf 0x0%x $(xdotool getactivewindow)) -v wm_class="$wm_class" '{ if($1 ~ search && $3 ~ /emacs/) print $3 }')
if [[ "$isActive" != "" ]]; then
# echo "active"
if [[ "$disabled" == "0" ]]; then
# echo "disable shortcut"
gsettings set org.gnome.desktop.wm.keybindings "$keySwitchApplication" "$disableSwitchApplications"
gsettings set org.gnome.desktop.wm.keybindings "$keySwitchApplicationBackward" "$disableSwitchApplicationsBackward"
disabled="1";
fi
else
# echo "not active"
if [[ "$disabled" == "1" ]]; then
# echo "enable shortcut"
gsettings set org.gnome.desktop.wm.keybindings "$keySwitchApplication" "$backupSwitchApplications"
gsettings set org.gnome.desktop.wm.keybindings "$keySwitchApplicationBackward" "$backupSwitchApplicationsBackward"
disabled="0"
fi;
fi;
sleep 1
done
The script checks in a endless loop the window class emacs
and disables/enables Alt+Tab and Shift+Alt+Tab
If anything goes wrong, then you can reset the entry to the default settings:
gsettings reset org.gnome.desktop.wm.keybindings switch-applications
gsettings reset org.gnome.desktop.wm.keybindings switch-applications-backward
In my case:
% gsettings reset org.gnome.desktop.wm.keybindings switch-applications
% gsettings get org.gnome.desktop.wm.keybindings switch-applications
['<Super>Tab', '<Alt>Tab']
% gsettings reset org.gnome.desktop.wm.keybindings switch-applications-backward
% gsettings get org.gnome.desktop.wm.keybindings switch-applications-backward
['<Shift><Super>Tab', '<Shift><Alt>Tab']
Credits
@Serg and his answer How to disable input language switching in terminal
@JacobVlijm for his comments
gsettings
on every cycle, by checking the front-window state before the loop, comparing it to "state_2" inside the loop, at the end of the cycle making state_1 = state_2
, like here: http://askubuntu.com/a/637334/72216 and here: http://askubuntu.com/a/637325/72216. Subsequently, you won't even need to check gsettings
, since if the "quality" of the front window changes, you know you'll have to set gsettings
for sure.
– Jacob Vlijm
Jun 20 '15 at 10:28
gsettings get
section, since you can be pretty sure that if there is a change in the identity of the active window (emacs/no emacs) you will have to act. Leaving out the get
section will make the script do practically nothing if there is no change, which will make it nicely "low on juice". The same for the sleep 1
which will dramatically reduce the "fuel consumption".
– Jacob Vlijm
Jun 20 '15 at 11:24
disabled="0"
and hope no error will ever occur, making disabled
run out of phase). Why not simply start the script before the loop with the check isActive=
(as in the link above), then after every cycle make the current state the initial one, to be compared with the second isActive=
check. Thanks for all your effort by the way :)
– Jacob Vlijm
Jun 20 '15 at 13:31
gsettings
! :D
– Dan
Jun 21 '15 at 15:42
One ugly hackish way comes to mind...
Keyboard setting should be stored in: ~/.config/dconf/user
So if you have two files, one where Alt+Tab
is system wide enabled, and the other where Alt+Tab
is globally disabled, you could theoretically swap them.
Simple script which would:
Alt+Tab Enabled
Disabled Alt+Tab
over Enabled Alt+Tab
That script would be used to open/run Emacs
I have no idea if it would work, for safety I would try it in VB first and now I don't have time to try unfortunatelly...