How do I change my keyboard layout while using xmonad?

10,598

Solution 1

Here is one way to connect XMonad and multiple keyboard layouts.

Step 1. Create a script that will switch between your layouts. For the sake of example, let's say we will support English (US), Italian and French.

/home/you/bin/layout_switch.sh:

#!/bin/zsh
# LICENSE: PUBLIC DOMAIN
# switch between my layouts

# If an explicit layout is provided as an argument, use it. Otherwise, select the next layout from
# the set [us, it, fr].
if [[ -n "$1" ]]; then
    setxkbmap $1
else
    layout=$(setxkbmap -query | awk 'END{print $2}')
    case $layout in
        us)
                setxkbmap it
            ;;
        it)
                setxkbmap fr
            ;;
        *)
                setxkbmap us
            ;;
    esac
fi

Test this script - run it and see if the keyboard layout cycles between the layouts. If it does, proceed to the next step.

Step 2. Customize XMonad settings to support custom key binding that will switch the layout.

In your home directory, create a directory named ".xmonad" (if it does not exist).

/home/you/.xmonad/xmonad.hs:

import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run(spawnPipe)
import XMonad.Util.EZConfig(additionalKeys)
import System.IO

main = do
  xmonad $ defaultConfig
     {
        terminal = "gnome-terminal"
     } `additionalKeys`
     [ (( mod1Mask             , xK_Escape), spawn "/home/you/bin/layout_switch.sh")
     ]

Now, restart XMonad by pressing Mod+q. Your layout switcher should be fully functional.

Reference: http://zuttobenkyou.wordpress.com/tag/setxkbmap/

Solution 2

You might already have a startup file to launch and configure things at login.

Add the following line to use several keyboard layouts:

# Keyboard layout switcher
setxkbmap -layout us,se -variant ,kinesis -option 'grp:alt_shift_toggle'

-layout and -variant work together. Here my layouts are us (no variant, empty before the comma), and se(kinesis). Variants could be dvorak, for example. You can omit variant if you don't want them.

-option sets here the keyboard shortcut to switch between layouts.

For windows to remember their layout:

# Per window keyboard layout
kbdd

If you use xmobar and want to show the current layout, add this to your .xmobarrc Config:

, commands = [...
...
, Run Kbd [("se", "SE"), ("us", "US")]
]
...
, template = "...... %kbd% "

That was for all people googling for multiple keyboard layouts and finding this thread. If you want only one keyboard layout, add this to your startup script:

setxkbmap -layout us

Solution 3

To change your keyboard mapping to American English, you run the command setxkbmap us. To integrate it with Xmonad, you add it to the startup hook.

Share:
10,598

Related videos on Youtube

Walead Fuss
Author by

Walead Fuss

Updated on September 18, 2022

Comments

  • Walead Fuss
    Walead Fuss over 1 year

    So I have an IBM Thinkpad X31, running natty and xmonad as the window manager. The keyboard is Italian. I wish to use an American English keyboard mapping, all the time. How do I do this?

  • Gauthier
    Gauthier over 9 years
    This works fine, but restarting XMonad was not enough, I had to logout and in (I am on Ubuntu, with its login manager).
  • sleblanc
    sleblanc over 3 years
    This isn't enough. When my computer goes to sleep, the settings are "forgotten" once the computer wakes up.
  • Arsen Zahray
    Arsen Zahray over 2 years
    works great! but when I'm using cyrillic layout, shortcuts like Ctrl+C and Ctrl+V don't work, which is annoying. This does not happen in gnome. Any leads on how this can be fixed?