53

My OS is Arch Linux amd64, Gnome ENV.

I want to map the Caps Lock key to Esc (escape) in Arch Linux. I run the command:

xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'

It works well, but a moment later, the Caps Lock key works again. And I must run the command again.

I'm pretty sure that this solution worked well maybe a year ago. What's my problem? Can anyone help me to map the Caps Lock key to Escape key forever in my Arch Linux OS?

10 Answers10

80

Any of the following (in increasing order of complexity):

  1. Use setxkbmap to remap the key (does not require a daemon and is independent of your desktop environment or window manager). Don't forget to add the command before the exec gnome-session (or similar) line in your ~/.xinitrc or ~/.xsession:

     setxkbmap -option caps:escape
    

    setxkbmap can be found in package extra/xorg-setxkbmap.

  2. dconf-editororg.gnome.desktop.input-sources.xkb-options → Add caps:escape to the aforementioned field.

  3. gnome-session-settings → Startup Programs → Add → Name=Remap caps lock to escape, command=setxkbmap -option caps:escape

  4. Create a custom keyboard layout

FYI, I obtained the XKB rule by grepping /usr/share/X11/xkb/rules for caps and esc.

pilona
  • 1,783
11

Xorg.conf

You can achieve this by editing the file /etc/X11/xorg.conf.d/00-keyboard.conf.

Example file:

Section "InputClass"
        Identifier      "system-keyboard"
        MatchIsKeyboard     "on"
        Option          "XkbLayout" "us"
        Option          "XkbModel"  "pc104"
        Option          "XkbOptions" "caps:swapescape"
EndSection  

You can specify multiple XkbOptions, for example caps:swapcaps,terminate:ctrl_alt_bksp for having esc and caps swapped but also allowing the X to be killed with CtrlAlt Backspace. You can find more info about this in man xkeyboard-config.

GUI

You can also use GNOME Tweak Tool (gnome-tweak-tool package). Just click on Typing and then choose whatever you like from the Ctrl position menu (see image below).

enter image description here

5

For use in X, the Arch Wiki Gnome page has instructions for modifying the keyboard with XkbOptions:

Using the dconf-editor, navigate to the key named org.gnome.desktop.input-sources.xkb-options and add desired XkbOptions (e.g. 'caps:swapescape') to the list.

In the console, you can create a custom keymap for the same effect. Create your personal keymap with the requisite changes for CapsLock and Escape at /usr/share/kbd/keymaps/i386/qwerty/yourmap then tar it and include a line in /etc/vconsole.conf to call it:

KEYMAP=yourmap
3

You can use xmodmap. Put your ~/.Xmodmap:

remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

(be sure at starting X will use your ~/.Xmodmap)

uzsolt
  • 1,305
3

! I don't know why the answers above don't work. Here is a working one for me. In your ~/.Xmodmap

! 66 is the keycode of Caps_Lock
clear    Lock
keycode  66 = Escape 

and then

$ xmodmap ~/.Xmodmap

I'm using Fedora and non-Gnome window manager. HTH

2

The Arch repos now include two relevant interception tools:


caps2esc (tap=esc, hold=ctrl)

  1. Install via pacman (if using another distro, install for your distro or build from source):

    $ sudo pacman -S interception-caps2esc
    
  2. Create /etc/interception/udevmon.yaml and optionally specify the mode. Here, -m 1 specifies "minimal" mode:

    - JOB: intercept -g $DEVNODE | caps2esc -m 1 | uinput -d $DEVNODE
      DEVICE:
        EVENTS:
          EV_KEY: [KEY_CAPSLOCK, KEY_ESC]
    
  3. Enable and start udevmon:

    $ sudo systemctl enable udevmon
    $ sudo systemctl start udevmon
    

dual-function-keys (customizable remappings)

  1. Install via pacman (if using another distro, install for your distro or build from source):

    $ sudo pacman -S interception-dual-function-keys
    
  2. Create /etc/interception/dual-function-keys/my-mappings.yaml, e.g. to remap tap/hold actions for caps and shift:

    MAPPINGS:
      - KEY: KEY_CAPSLOCK
        TAP: KEY_ESC
        HOLD: KEY_BACKSPACE
      - KEY: KEY_LEFTSHIFT
        TAP: KEY_ENTER
        HOLD: KEY_LEFTSHIFT
    
  3. Create /etc/interception/udevmon.yaml:

    - JOB: intercept -g $DEVNODE | dual-function-keys -c /etc/interception/dual-function-keys/my-mappings.yaml | uinput -d $DEVNODE
      DEVICE:
        EVENTS:
          EV_KEY: [KEY_CAPSLOCK, KEY_LEFTSHIFT]
    
  4. Enable and start udevmon:

    $ sudo systemctl enable udevmon
    $ sudo systemctl start udevmon
    
tdy
  • 125
1

The file /etc/X11/xorg.conf.d/00-keyboard.conf can also be auto-generated using systemd-localed. Use the following command:

localectl set-x11-keymap us "" "" caps:escape

Or, including some other useful options:

localectl set-x11-keymap us,de "" "" caps:escape,grp:alt_caps_toggle,grp_led:caps,lv3:ralt_switch_multikey,terminate:ctrl_alt_bksp,eurosign:e,rupeesign:4

Quick explanations:

  • CapsLk functions as Esc
  • Toggles between two keyboard layouts us/de with Alt+CapsLk
  • CapsLk LED indicates which layout is active
  • Right Alt (RAlt) is the "multikey" (see Compose Key)
    • RAlt+e generates
    • RAlt+4 generates (similar to how Shift+4 generates $)
  • Ctrl+Alt+Backspace kills X
1

Another great option is https://github.com/maricn/interception-vimproved interception plugin.

It does Esc on tap, CTRL on hold, plus:

  • Return becomes Right CTRL on hold
  • Hold space to change the hjkl keys on the home row to arrow keys, b to backspace, d to delete and more
0

To swap Caps Lock with Escape, you can use the following command:

setxkbmap -option caps:swapescape
comonadd
  • 189
0

I'm using Plasma (Not Gnome) as my desktop environment. I followed these steps:

  1. Settings > Keyboard > Keyboard > Keybindings(top right)
  2. Check the "Configure keyboard options"
  3. Capslock behaviour > Swap Esc and Caps Lock(last in the list)
  4. Apply

Worked instantly like a charm! A similar solution can be done in Gnome Tweaks/Settings.