How do I bind C-= in emacs?

In a terminal, TAB is represented by the same byte sequence as C-i. And typically the terminal has no special byte-sequence for C-=, so it will just send a =. There is nothing that Emacs can do about it. But you might be able to teach your terminal emulator to send some special byte sequence of your choice (check the documentation of your terminal emulator for that), after which you can teach Emacs to recognize it as a C-= (with something like (define-key input-decode-map "...thebytes..." [?\C-=])).


The accepted answer in combination with the link in the first comment to it is enough to get started on a complete solution. The steps are:

  1. make your terminal output escape codes for the key
  2. make Emacs recognise the escape codes as a standard keypress
  3. bind the keypress in a mode map

The first is very terminal and/or operating system dependent.

The link in the first comment shows some examples for X Window System. The key names are available in /usr/X11R6/include/X11/keysymdef.h (or try locate keysymdef.h), prefixed with XK_ (which should be removed for our purposes). I read that symbolic names are preferred over key literals.

I don't currently run X but I think it should look like this in your case:

XTerm.VT100.Translations: #override \
Ctrl ~Meta ~Shift  <Key> equal:         string(0x1b) string("[emacs-C-=")\n

The first string is the escape, the second is of your choosing.

In iTerm you can use Preferences->Keys and choose Send Escape Sequence as the Action. For example, I have:

iTerm key mappings

Emacs Wiki lists some configuration methods for other terminals.

Now you can teach Emacs to recognize it as a C-=. First define-key into input-decode-map. I have a couple of helper functions:

(defun my/global-map-and-set-key (key command &optional prefix suffix)
   "`my/map-key' KEY then `global-set-key' KEY with COMMAND.
 PREFIX or SUFFIX can wrap the key when passing to `global-set-key'."
   (my/map-key key)
   (global-set-key (kbd (concat prefix key suffix)) command))

 (defun my/map-key (key)
   "Map KEY from escape sequence \"\e[emacs-KEY\."
   (define-key function-key-map (concat "\e[emacs-" key) (kbd key)))

So then:

(my/global-map-and-set-key "C-=" 'some-function-to-bind-to)

Some keys (currently: ()\|;'`"#.,) will need escaping in the string, like C-\..