Let’s say you have 3 languages on your linux machine: English, Russian and Belarusian. You frequently switch between EN and RU. Sometimes you write something in EN and BY. So you don’t want to press Alt+Shift three times constantly, only when writting something in Belarusian.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
current=`setxkbmap -query | grep layout|cut -d ',' -f 2`
echo $current
if [ "$current" == "by" ]
then 
    notify-send -t 500 -i keyboard "Keyboard layouts: US/RU"
    setxkbmap -model pc105 -layout us,ru -variant altgr-intl, -option grp:alt_shift_toggle
else 
    notify-send -t 500 -i keyboard "Keyboard layouts: US/BY"
    setxkbmap -model pc105 -layout us,by -variant altgr-intl, -option grp:alt_shift_toggle
fi

Here I assume that Alt+Shift switches languages inside a group.

Save the scipt in /usr/local/bin as toggle_en_ru.sh (for example). Add execution permissions.

sudo chmod +x /usr/local/bin/toggle_en_ru.sh

Go to keyboard layouts settings and add a new shortcut. Assign a shortcut for switching between languages groups. I decided to use Win+Space for language pairs (EN/RU <-> EN/BY) switching.

Sources and ideas from: http://superuser.com/questions/505466/2-and-more-keyboard-layout-groups-in-linux-changed-by-different-hot-key

Querying existing configuration

setxkbmap -query

Switch keyboard layout from command line

Sources: Thread

xkblayout-state

xkblayout-state - works for me.

Compiling:

git clone https://github.com/nonpop/xkblayout-state.git
cd xkblayout-state/
make

Usage:

xkblayout-state set +1

Now I can use the same method of assigning a custom keyboard shortcut for that command and have layout switching by pressing Super+Space for example.

xkb-switch

xkb-switch - I couldn’t compile it fast enough on my Linux Mint 17