There have been many life-changing Linux moments for me, but most fade into my backstory as they become the status quo. There's one little keyboard trick Linux taught me that I'm reminded of every time I use it (maybe 1,000 times a day), and that's converting the Caps Lock key to Ctrl.
I never use Caps Lock, but I use the Ctrl key all day for copying, pasting, navigating within Emacs, and invoking Bash, GNU Screen, or tmux actions. Caps Lock occupies valuable real estate on my keyboard, forcing the actually useful Ctrl key down to the awkward-to-reach bottom corner.
Remapping Ctrl increased my typing and navigation speed and has probably saved me from repetitive stress injuries.
The case of the disappearing control
Buckle in, this is a roller coaster of a history lesson:
Unfortunately for Caps Lock swappers like me, when GNOME 3 came out, it all but removed the ability to change the location of the Ctrl key.
Fortunately, the excellent GNOME Tweaks app brought back these "missing" control panels.
Unfortunately, GNOME 40 has no GNOME Tweaks app (yet?)
Also, unfortunately, the old
xmodmap hack that used to work on X11 is useless on the new Wayland display server.
For a short while (an afternoon at best), I felt things were looking dim for people who hate Caps Lock. Then I remembered I am a user of open source, and there's always a way around something as simple as an overlooked GUI control panel.
The GNOME desktop uses dconf, a database that stores important configuration options. It's the backend to GSettings, which is the system GNOME applications interface with when they need to discover system preferences. You can query the dconf database using the
gsetting command, and you can set dconf key values directly with the
The dconf database isn't necessarily what you might call discoverable. It's a humble database you're not meant to have to think about, and it holds a lot of data you usually don't have to interact with directly. However, it does use a sensible schema that's fun to browse if you want to better understand all of the preference options GNOME has to manage.
You can list all of dconf's schemas with the
list-schemas subcommand. After browsing hundreds of schemas, you might use grep to narrow your focus to something that seems especially relevant, such as
$ gsettings list-schemas | grep ^org.gnome.desktop [...] org.gnome.desktop.background org.gnome.desktop.privacy org.gnome.desktop.remote-desktop.vnc org.gnome.desktop.interface org.gnome.desktop.default-applications.terminal org.gnome.desktop.session org.gnome.desktop.thumbnailers org.gnome.desktop.app-folders org.gnome.desktop.notifications org.gnome.desktop.sound org.gnome.desktop.lockdown org.gnome.desktop.default-applications.office
Whether through a manual search or through reading GSetting documentation, you may notice the
org.gnome.desktop.input-sources schema, which helps define the keyboard layout. A GSetting schema, by design, contains keys and values.
Remapping Caps Lock with dconf
xkb-options key contains optional keyboard overrides. To set this key, use
dconf, converting the dots (
.) in the schema above to slashes (
/) because the dconf database requires it:
$ dconf write /org/gnome/desktop/input-sources/xkb-options "['caps:ctrl_modifier']"
ctrl_modifier because I use the Ctrl modifier more than any other modifier, but Vim users may prefer to set it to
View your setting
The change takes effect immediately and persists across reboots. It's a preference you've defined in GNOME, so it remains in effect until you change it.
You can view the new value in
gsettings. First, view the available keys:
$ gsettings list-keys \ org.gnome.desktop.input-sources xkb-options mru-sources show-all-sources current per-window sources
And then view the settings with the
$ gsettings get \ org.gnome.desktop.input-sources \ xkb-options ['caps:ctrl_modifier']
I use this little trick to set Caps Lock as well as the Compose key (
compose:ralt) on my GNOME 3.4 system. While I believe there are GUI controls in development to control options like these, I also have to admit that the ability to set them programmatically is a luxury I enjoy. As a former admin of systems that had no reliable way to adjust desktop settings, the ability to script my preferences makes setting up a fresh desktop quick and easy.
There are lots of useful options available with GSettings, and the documentation is thorough. If you have something you want to change, take a look at what's available.