Using Caps Lock as Menu/Apps keys on Emacs

I’m an ergoemacs-mode user, a mode that changes most key bindings so that they put less strain on your hands.  For example, it uses Alt instead of Ctrl most of the time, which is easier to press: use your curled thumb instead of a karate chop.  Also, many commands are activated by first pressing the Menu/Apps key (that key near the Right Ctrl which usually opens the context menu).  For example, pressing Menu then T allows you to switch buffers.

However, the keyboard on my new notebook doesn’t have a dedicated Menu key.  Instead, one needs to press Fn+Right Ctrl, which is of course extremely painful.

Menu key hidden on the Right Ctrl.


I’ve found a workaround, though.  A very hackish workaround.

The ergoemacs-mode FAQ suggests using Caps Lock as a Menu/Apps key for Mac users.  Using xmodmap it’s trivial to make Caps Lock a Menu key:

$ xmodmap -e "keycode 66 = Menu"

However, using xmodmap properly with Gnome is nigh impossible.  It’s recommend to use xkb instead, but xkb doesn’t support mapping Caps Lock to the Menu key out-of-the-box (at least not yet).  At this point, having wandered through many documentation pages, I’ve decided to try using some of the xkb options that already exist.

At first I tried setting Caps Lock as the Hyper key.  However, by default the Hyper key gets the same modifier code as the Super key (which is usually the key with the Windows logo).  There’s a straightforward way of separating them, but I couldn’t find a way to make it play nice with Gnome.  And even if I could, it’s not clear to me if I could use the Hyper key as a substitute for the Menu key on emacs.

When ready to admit defeat, I’ve set the Caps Lock behavior to “Caps Lock is disabled” in preparation of trying a hack using xmodmap.  Much to my surprise, I accidentally discovered that emacs then began treating the disabled Caps Lock key as <VoidSymbol>! The gears started turning in my head, then I added the following line to my ~/.emacs file:

(define-key key-translation-map (kbd "<VoidSymbol>") (kbd "<menu>"))

Surprisingly, it worked!  Now pressing Caps Lock then T will switch buffers, for example.  As a bonus, pressing Caps Lock accidentally while on another application won’t do anything.

It’s not clear to me how fragile this hack really is.  I’ll update this blog post if I ever find some drawback to it.  But right now it seems to work quite nicely.

3 thoughts on “Using Caps Lock as Menu/Apps keys on Emacs”

  1. Hi Felipe,
    you mention a straightforward way of assigning the Hyper and Super keys to different modifiers (e.g. by moving one to Mod3), care to give the details?
    I have set CapsLock to Hyper like you tried, but the only way of putting it to Mod3 I know of is to patch file “/usr/share/X11/xkb/symbols/capslock”, which has the disadvantage that it is under OS control and thus will be reverted every time the OS (Debian) package gets upgraded:

    $ diff capslock~ capslock
    — capslock~ 2015-09-18 21:32:39.000000000 +0200
    +++ capslock 2015-09-19 20:22:25.978356155 +0200
    @@ -48,7 +48,7 @@
    hidden partial modifier_keys
    xkb_symbols “hyper” {
    key { [ Hyper_L ] };
    – modifier_map Mod4 { };
    + modifier_map Mod3 { };

    hidden partial modifier_keys

Leave a Reply

Your email address will not be published. Required fields are marked *