How do I set Xmodmap on login?

The correct place to put xmodmap ~/.Xmodmap (so that your changes are read at startup) is in ~/.xinitrc (see explanation below), although you could alternately place the xmodmap command as a startup item (/usr/bin/xmodmap /home/user/.Xmodmap). I can say that for 12.04 (and presumably 12.10) that these two alternatives definitely do work, as either way they are read after you log in with lightdm. (I changed Return to Right Shift, and the change only took effect after entering my password and logging in).

Please note: if you are on Xfce, it is noted on the official Xfce FAQ that you may have to create a startup item instead of using ~/.xinitrc, and that you might have to delay the execution so the xmodmap changes are not overwritten by setxkbmap. You can use a delay to achieve this in your startup entry:

/bin/bash -c "sleep 20; /usr/bin/xmodmap /home/$USER/.Xmodmap"

(For the startup entry it is necessary to specify absolute paths)

Each time setxkbmap is run to change keyboard layout, you will have to run xmodmap ~/.Xmodmap again in the terminal.

Creating ~/.xinitrc

Create a file in your home folder called .xinitrc with

touch .xinitrc

and place in it:

xmodmap ~/.Xmodmap

Your Xmodmap file should not have entries in the xmodmap -e " " style as that is used in the terminal for temporarily setting the values. It must have entries in this format:

keycode 65 = Tab
keycode 23 = Space

It is often confusing which of the various X files (such as .xprofile, .xinitrc, etc) are read at startup, but .xinitrc does seem to be still read under 12.04, whereas .Xmodmap or .xinputrc are not read by themselves.


I'm using ElementaryOS (with its GNOME based window manager) and found a solution through using xdg autostart scripts. Many window managers are using xdg so I assume this approach also will work in other environments. At least it should work with GNOME.

xdg run scripts in ~/.config/autostart upon login in a X session. To load xmodmap config upon login, add the following script to ~/.config/autostart/xmodmap.desktop:

[Desktop Entry]
Name[en_US]=Xmodmap
Comment[en_US]=xmodmap ~/.Xmodmap
Exec=/usr/bin/xmodmap .Xmodmap
Icon=application-default-icon
X-GNOME-Autostart-enabled=true
Type=Application

Then logout and login again, and your Xmodmap configuration should've been loaded.

If it's not working, try to run xmodmap in terminal to see if it's xmodmap that complains:

$ xmodmap ~/.Xmodmap

If you don't get any error, run the following command to debug:

$ sudo cat /var/log/syslog | grep -B 5 -A 5 xmodmap

On Mint 17/18, I can achieve that bu put my scripts into the Startup Application, with 1 second delay.

As Mint 18 is derived from Ubuntu 1604, I think you can do the same, or install Startup Application managing panel first if it is not there.

Hope it helps.


I don't have the unity interface in front of me just now, but try clicking the Applications button on the launcher, then type startup.

There should be an app called Startup Applications (or some such). Click it and add your xmodmap command (eg xmodmap /home/thiago/.Xmodmap).

It is important to use absolute path, not ~/Xmodmap.
If it still doesn't work, you can try adding a bit of delay as suggested by hxpax.