I'm wondering is there any command line tool, that returns current keyboard layout.

I have XkbLayout set to us, ru.

Update: setxkbmap returns layout settings, not selected layout. E.g.:

$ setxkbmap -print | grep xkb_symbols
xkb_symbols   { include "pc+us+ru:2+inet(evdev)+capslock(grouplock)+terminate(ctrl_alt_bksp)"   };

It will return same result no matter what current layout is.

  • I am not really good at D-Bus, but it should be easy to track the current keyboard layout using it I think. Although it may not be able to do so if there is no active switch. – Benjamin Dec 26 '11 at 18:16

13 Answers 13


Maybe this is version dependent, but on my machine that uses setxkbmap 1.3.0 the following command works:

setxkbmap -query | grep layout

Note that depending on your need it may be useless to know only the layout : for instance the Dvorak variant of the US layout is quite different than the default QWERTY. The -query option of setxkbmap gives both the layout and the variant, as different fields :

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle
| improve this answer | |
  • 4
    -query was added in setxkbmap 1.2.0 – alanc Apr 6 '13 at 1:49
  • You get the current layouts and variants and many additional info with setxkbmap -print -verbose 10 – erik May 13 '16 at 20:22
  • To set it, for example both layouts cz and us, the latter with variant dvorak (for a 104 key keyboard), use setxkbmap -model pc104 -layout cz,us -variant ,dvorak – erik May 13 '16 at 20:27
  • Thanks, working – Indacochea Wachín Sep 27 '19 at 3:27
  • 5
    doesn't let you know the active one for multiple layouts, which is what the OP asked. Bummer this got to the top. – Xerus Jun 16 at 13:06

There is xkb-switch which is described thus:

xkb-switch is a C++ program that allows to query and change the XKB layout state.


Or, following nozimica's suggestion, you could use:

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'

From this thread on the Arch Linux boards: https://bbs.archlinux.org/viewtopic.php?pid=539406

| improve this answer | |
  • 1
    Thanks, xkb-switch works fine, but I hope that there was more portable solution – Andrew Apr 28 '11 at 16:34
  • 1
    @Andrew: yes it's kind of odd there is no simple way to get the current layout. – Benjamin Dec 26 '11 at 17:38
  • 11
    Your setxkbmap doesn't show the currently active layout when more than one layout is defined. – terdon Oct 22 '15 at 12:51

Yes THERE IS a command line tool that does what you want! I just discovered it 10min ago :)

Look at here: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

does exactly what you want (it doesn't output an end of line, so add ; echo if you need). run the tool without parameters for the help.

| improve this answer | |

Use this to get the code for the current layout:

$(xset -q|grep LED| awk '{ print $10 }')

This might needs to be converted to a form you want, like:

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
| improve this answer | |
  • 3
    I get 00000002 even though my layout is "USA Dvorak international". Language is not enough... – l0b0 Jan 5 '12 at 11:42
  • 4
    It doesn't help if there are three or more layouts. The second and the third layouts give the same value 00001004 on my machine. – sastanin Dec 19 '12 at 8:37
  • problem: toggle your numlock and start this command again ;) – andras.tim Jul 6 '16 at 16:19
  • This will not work reliably - you need to use a mask since the LED indicates the status of the keyboard led buttons as well. – fikovnik Feb 7 '18 at 9:26

Another simpler approach, because of fixed positions of the output of the xset -q command, is this:

xset -q | grep -A 0 'LED' | cut -c59-67

It prints 00000002 or 00001002 depending on your current keyboard layout.

| improve this answer | |
  • I like this one, I think you can narrow it down to 8 chars. c59-66. – xlembouras Jul 31 '14 at 13:23

On newer systems, you can use

localectl status

It will for instance show you the following:

System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
| improve this answer | |
  • 1
    doesn't show the currently active layout when more than one layout is defined, only shows the first – Xerus Jun 16 at 13:08

You can use xkbprint to print the current layout.

For example to print the current layout as PDF use

xkbprint -color "${DISPLAY}" - |\
    ps2pdf - > current_keyboard_layout.pdf

which produces:

xkbprint result

| improve this answer | |

The answers so far did not work for me. I use setkbmap with two layouts english and czech so any -print or -query will always return the two. Grepping the LED status for xset -q does not work either since that one shows the status of all keyboard leds.

The best so far was to quickly write this small utility: https://gist.github.com/fikovnik/ef428e82a26774280c4fdf8f96ce8eeb

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <X11/XKBlib.h>
#include <X11/extensions/XKBrules.h>

int main(int argc, char **argv) {
  Display *dpy = XOpenDisplay(NULL);

  if (dpy == NULL) {
    fprintf(stderr, "Cannot open display\n");

  XkbStateRec state;
  XkbGetState(dpy, XkbUseCoreKbd, &state);

  XkbDescPtr desc = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd);
  char *group = XGetAtomName(dpy, desc->names->groups[state.group]);
  printf("Full name: %s\n", group);

  XkbRF_VarDefsRec vd;
  XkbRF_GetNamesProp(dpy, NULL, &vd);

  char *tok = strtok(vd.layout, ",");

  for (int i = 0; i < state.group; i++) {
    tok = strtok(NULL, ",");
    if (tok == NULL) {
      return 1;

  printf("Layout name: %s\n", tok);

  return 0;

and compile using

gcc -I/usr/include getxkblayout.c -lX11 -lxkbfile

| improve this answer | |
  • In which package is XKBrules.h contained? x11proto-dev does not contain it. – nephewtom Feb 5 at 21:58
  • @nephewtom libxkbfile – fikovnik Feb 6 at 15:15
  • Thank you very much! Upvoted! – nephewtom Feb 7 at 13:20

From Goosfrabaa in the Arch Linux forums:

setxkbmap -v | awk -F "+" '/symbols/ {print $2}'

This works correctly here, and prints us(dvorak-intl) (displayed as "USA Dvorak international" in the GNOME keyboard selection menu).

| improve this answer | |
  • 8
    It prints only the first layout in the list, not the current one. – sastanin Dec 19 '12 at 8:38
  • How can I detect my keymap, when I use language toggle by setxkbmap? $ setxkbmap -v >> Trying to build keymap using the following components: | keycodes: evdev+aliases(qwerty) | types: complete | compat: complete+ledscroll(group_lock) | symbols: pc+us+hu:2+inet(evdev)+group(alt_shift_toggle)+compose(rwin)+terminate(ctrl_alt_bksp) | geometry: pc(pc105) in this case I got everytime "us" – andras.tim Jul 6 '16 at 16:29

Partial answer: On KDE, you can apparently get the current keyboard layout through the qdbus command:

$ qdbus org.kde.keyboard /Layouts getCurrentLayout

I have several layouts configured, but it only shows the one that is currently in use.

Tested on Kubuntu 18.04 (qdbus version 4.8.7). There may be other d-bus based solutions for non-Qt environments, but I do not know about them.

| improve this answer | |
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)

keyboardLayout () {
    layout=$(variableInFile "KEYMAP" "/etc/vconsole.conf")
    echo ${layout}

variableInFile () {

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}

| improve this answer | |

With GNOME D-Bus you can do it like this:

$ gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval  "imports.ui.status.keyboard.getInputSourceManager().currentSource.id"
(true, '"ru"')
| improve this answer | |

You can use:

setxkbmap -print | grep xkb_symbols
| improve this answer | |
  • 5
    it returns overall keyboard settings, not current layout (us or ru) – Andrew Apr 28 '11 at 11:17
  • Execute it well, as @jasonwryan states if you analyze carefully that line, into it resides your layout. In my case it is latam. – nozimica Apr 28 '11 at 14:10
  • 5
    jasonwryan version just output a part of string after '+', xkb_symbols value doesn't depend on selected layout, I always get 'us' – Andrew Apr 28 '11 at 16:33

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.