64

How I change keyboard layouts from the command-line? For example, I want to switch from English to Hebrew. I'm able to do it from lightdm with the little icon in the corner of my screen.

43

From terminal

English to Hebrew and vise versa with Alt + Shift

setxkbmap -option grp:alt_shift_toggle us,il

You can see all locale alias with this command

cat /etc/locale.alias

More info about setxkbmap in manual

man setxkbmap
51

You can find all the different keymaps in the following locations:

/usr/share/keymaps/i386/
/usr/share/kbd/keymaps/i386/
/usr/share/X11/xkb/symbols/

To change the keyboard layout (e.g. to Spanish) in the Linux command line, type the following command:

loadkeys es

For X:

setxkbmap es

To make these changes system wide, assuming you’re using Ubuntu, you can use the following:

sudo dpkg-reconfigure console-setup
  • This has effect on tty1, tty2, etc, but no effect in X. I want to do it in X, the same way that the keyboard switcher in lightdm works. – Eyal Oct 30 '12 at 13:21
  • I added a command in the answer, was this what you were looking for? – Dr_Bunsen Oct 30 '12 at 13:25
  • YES! Thanks. Also, can you update your answer to mention loadkeys, spelled with an 's'? – Eyal Oct 30 '12 at 13:27
  • 2
    yep I will, and no thanks. Just mark as solved so everyone knows. – Dr_Bunsen Oct 30 '12 at 13:28
  • for redhat users, following are the valuable pieces: /usr/share/X11/xkb/symbols/ and setxkbmap es – Peter Butkovic Nov 18 '15 at 11:35
13

Ubuntu 13.10 or Later

This works better then setxkbmap with Gnome/Unity keyboard layout indicator.

gsettings set org.gnome.desktop.input-sources current 0

0 is the layout index (0 default or top layout). Layouts indexed starting from 0.

For easy use, create an alias.

  • 2
    This answer is superior because it actually changes the indicator. Just what I've been looking for. – Ainar-G Apr 27 '17 at 20:50
  • 1
    thanks. used your answer also here: askubuntu.com/a/984981/6193 – Alexey Dec 10 '17 at 15:11
  • 3
    This doens't work on GNOME 3.26. It says "This key is deprecated and ignored". – hugomg Mar 3 '18 at 14:21
  • @hugomg, right now I don't have access yet to newer gnome. but you may try using dconf-editor tool and check /org/gnome/desktop/. they may just rename it. – user.dz Mar 3 '18 at 15:42
12
setxkbmap us,il -option "lv3:ralt_alt,grp:alt_shift_toggle"

this command enable you toggle between English and Hebrew only through by right alt+shift and rescue you from left alt+shift.

3

There seems to be no standard CLI tool, but xkb-switch is a small open-source tool to do the job. Just tested it with Ubuntu 16.04.4 LTS and it works flawelessly.

$ xkb-switch       # display current group
ua
$ xkb-switch -l    # list groups
us
ua
$ xkb-switch -s us # switch to a named group
$

This looks better than the other solutions because setxkbmap <name> ruins all options, and setxkbmap -layout <name>, while it preserves the options, it still fails to change the taskbar indicator nor the grp_led if set.


Caveat

If your ~/.config/kxkbrc uses LayoutLoopCount (e.g. it is set to less than the total number of layouts listed in LayoutList), like this:

LayoutList=us,ua,th,de
LayoutLoopCount=2
Options=grp_led:scroll,grp:rwin_switch,compose:menu,lv3:ralt_switch,
        nbsp:level2,grp:rctrl_toggle,misc:typo

then xkb-switch would only let you switch between the layouts in current group.


Invoke at screen lock

I noticed your comment:

Right before my screensaver turns on, I want to switch to English so that it will be easy to type my password when I get back in.

This was precisely my goal, so here's the answer:
To do that, you only need wrap it into a script hooking to dbus-monitor like discussed here.

3

Using gsettings in 18.04+ with Gnome, you can both add add keyboard layouts and switch between them from the command line or from the keyboard layout switcher on the desktop.

1.Present keyboard layouts and options:

$ gsettings list-recursively org.gnome.desktop.input-sources
org.gnome.desktop.input-sources show-all-sources false
org.gnome.desktop.input-sources xkb-options ['terminate:ctrl_alt_bksp']
org.gnome.desktop.input-sources per-window false
org.gnome.desktop.input-sources current uint32 1
org.gnome.desktop.input-sources mru-sources @a(ss) []
org.gnome.desktop.input-sources sources [('xkb', 'es'), ('xkb', 'no')]

2.Adding keyboard layouts:

$ gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us'), ('xkb', 'no'),('xkb','gr')]"
$ gsettings get org.gnome.desktop.input-sources sources
[('xkb', 'es'), ('xkb', 'no'), ('xkb', 'gr')]

3.Changing the current keyboard layout from the command line:

$ gsettings set org.gnome.desktop.input-sources current 1

As we now have 3 different languages, we have three choices from 0 to 2, with 1 being Spanish, 2 being Norwegian and 3 being Greek. Thus, setting current to 1 above makes Norwegian the current keyboard layout.

4.Listing all possible keyboard layouts:

cat //usr/share/X11/xkb/rules/base.lst

5.Changing the keyboard layout with a keyboard shortcut:

A keyboard shortcut is preconfigured for changing the keyboard layout. The present shortcut:

$ gsettings get org.gnome.desktop.wm.keybindings switch-input-source
['<Super>space']

A new shortcut can be set by using gsetting set, but take care not to use a shortcut that is already in use. To list all shortcuts in use:

$ gsettings list-recursively org.gnome.desktop.wm.keybindings
org.gnome.desktop.wm.keybindings cycle-windows-backward ['<Shift><Alt>Escape']
org.gnome.desktop.wm.keybindings minimize ['<Super>h']
org.gnome.desktop.wm.keybindings move-to-workspace-7 @as []
org.gnome.desktop.wm.keybindings move-to-workspace-8 @as []
org.gnome.desktop.wm.keybindings move-to-workspace-9 @as []
org.gnome.desktop.wm.keybindings move-to-monitor-left ['<Super><Shift>Left']
...
  • This is the most comprehensive answer, kudos for this. – Julien Chappuis Oct 14 '18 at 10:45
1

For Ubuntu 18.04 + Gnome the other answers did not work for me, but this did:

gdbus call --session --dest org.gnome.Shell \
--object-path /org/gnome/Shell \
--method org.gnome.Shell.Eval \
 "imports.ui.status.keyboard.getInputSourceManager().inputSources[0].activate()"

The argument in "inputSources[0]" is the index of the keyboard layout, the same as for gsettings solution.

Found it on linux StackExchange.

-1

Just out of curiosity, why would you do that ? Why would you open a terminal and they type a command to switch your keyboard layout when you can do so by a simple keyboard shortcut ! Assuming you use Ubuntu , it goes as Windows + Space

  • 2
    This appears to be more of a comment and less of an answer. – WinEunuuchs2Unix Feb 26 '17 at 15:48
  • Right before my screensaver turns on, I want to switch to English so that it will be easy to type my password when I get back in. – Eyal Mar 8 '17 at 19:33
  • also it is useful for making custom keyboard-shortcuts – Vassilis Oct 13 '17 at 11:24
  • This does not work in Ubuntu 16.04 on a virtualbox. – Juha Untinen Feb 15 '18 at 9:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.