how to remap Ctrl to Escape if pressed and released on its own

I want to remap Control, so that:

  1. If it is pressed and released with no other key, it acts as Esc.
  2. If it is pressed & held together with another key, it acts as Ctrl (no change in behaviour in this case).

I'm aware of How do I remap certain keys or devices?, so I suspect it may be done with xmodmap. But that answer does not explain how to map the modifier keys. I looked into the examples and grammar sections of the xmodmap manpage, but they do not explain that. The answer in Remapping Caps Lock to Control and Escape (not the usual way) mention that it is not possible to do that to Caps Lock, since it is a Lock key, but I hope this may be possible to do it with Control which is a mod key. A solution with something different than xmodmap will also be accepted. (I'm running Xmonad in Ubuntu 12.04, so perhaps there is a way to set this up in xmonad.hs?)

EDIT: The closest I can get is:

xmodmap -e 'remove Control = Control_L'
xmodmap -e 'keysym Control_L = Escape'
xmodmap -e 'add Control = Escape'

With this I get Escape when I press the Left Ctrl key alone, but to get, say, Ctrl+A I have to press the Left Ctrl key twice: Ctrl, Ctrl+A (rather than just Ctrl+A) - not sure why I need to press it twice.


Solution 1:

The latest reply to Remapping Caps Lock to Control and Escape (not the usual way) says this utility will do what you want: https://github.com/alols/xcape

Solution 2:

This can be done with xmodmap, but be aware that if you have set some things up with setxkbmap, the latter program will override and clear xmodmap settings.

However, to do exactly what you want with xmodmap, you can enter

xmodmap -e "keysym Control_L control = Escape Control_L" 

Now, if you look at xmodmap -pm, Escape has been added to the control modifier. This means that when left control is pressed, escape will instead be the result, but when control is pressed with another key (as in Ctrl+C), it will still give the same result as before.

Test it by entering in the terminal man xmodmap and then press ctrl while looking at the manpage and it will echo 'esc', but when you press Ctrl+Z it will suspend the page.

If you wish to reset your experimentations with xmodmap, logout and login again, and if you want to set the above xmodmap command as a startup item, see my answer here:

  • How do I set Xmodmap on login?