Transforming the most useless key ever in the most useful one
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.gitignore First commit Oct 12, 2016
LICENSE.md First commit Oct 12, 2016
README.md Add deprecation warning notice Jul 26, 2017
caps2esc.c Fix backports Dec 14, 2017

README.md

caps2esc

Transforming the most useless key ever in the most useful one. For vi/Vim/NeoVim addicts at least.

WARNING

The project now lives on https://gitlab.com/interception/linux/plugins/caps2esc as an Interception Tools plugin. This repository is now frozen.


ADM-3A terminal

What is it?

  • Put what's useless in its place
    By moving the CAPSLOCK function to the far ESC location
  • Make what's useful comfortably present, just below your Pinky
    By moving both ESC and CTRL functions to the CAPSLOCK location

Why?!

Because CAPSLOCK is just "right there" and making it CTRL when key-chording and ESC when pressed alone is quite handy, specially in vi.

Dependencies

Building

gcc caps2esc.c -o caps2esc -I/usr/include/libevdev-1.0 -levdev -ludev

Execution

The following daemonized sample execution increases the application priority (since it'll be responsible for a vital input device, just to make sure it stays responsible):

sudo nice -n -20 ./caps2esc >caps2esc.log 2>caps2esc.err &

Installation

I'm maintaining an Archlinux package on AUR:

It wraps the executable in a systemd service that can be easily started, stopped and enabled to execute on boot.

How it works

Executing caps2esc without parameters (with the necessary privileges to access input devices) will make it monitor any devices connected (or that gets connected) that produces CAPSLOCK or ESC events.

Upon detection it will fork and exec itself now passing the path of the detected device as its first parameter. This child instance is then responsible for producing an uinput clone of such device and doing the programmatic keymapping of such device until it disconnects, at which time it ends its execution.

Caveats

As always, there's always a caveat:

  • It will "grab" the detected devices for itself.
  • If you tweak your key repeat settings, check whether they get reset.
    Please check this report about the resolution.

History

I can't recall when I started using CAPSLOCK as both ESC and CTRL but it has been quite some time already. It started when I was on OS X where it was quite easy to achieve using the Karabiner, which already provides an option to turn CTRL into CTRL/ESC (which can be coupled with OS X system settings that turn CAPSLOCK into CTRL).

Moving on, permanently making Linux my home, I searched and tweaked a similar solution based on xmodmap and xcape:

It's a simple solution but with many annoying drawbacks I couldn't stand in the end:

  • It resets any time a device change happens (bluetooth, usb, any) or the laptop lid is closed or when logging off and needs to be re-executed.
  • It depends on X. Doesn't work on TTY (bare terminal based machine, CTRL-ALT F2, etc).

Meanwhile on Windows land, I had a definitive solution based on my Interception library that always works perfectly, no hiccups.

It made me envy enough, so I ported the Windows Interception caps2esc sample to Linux based upon evdev, udev and uinput.

License

GPL v3

Copyright © 2016 Francisco Lopes da Silva.