Setting major-mode specific keybindings in emacs

Solution 1:

Use the mode hook. C-h m shows information about the major mode, usually including what hook(s) it supports; then you do something like

(add-hook 'coffee-mode-hook ;; guessing
    '(lambda ()
       (local-set-key "\C-cc" 'coffee-compile-file)))

Solution 2:

You can define the key in the mode specific map, something like:

(add-hook 'coffee-mode-hook
    (lambda ()
        (define-key coffee-mode-map (kbd "C-c c") 'coffee-compile-file)))

Or, more cleanly:

(eval-after-load "coffee-mode"
    '(define-key coffee-mode-map (kbd "C-c c") 'coffee-compile-file))

The second statement causes the key definition to only happen once, whereas the first causes the definition to happen every time coffee-mode is enabled (which is overkill).

Solution 3:

Emacs 24.4 superseded eval-after-load with with-eval-after-load:

** New macro `with-eval-after-load'.
This is like the old `eval-after-load', but better behaved.

So the answer should be

(with-eval-after-load 'coffee-mode
  (define-key coffee-mode-map (kbd "C-c C-c") 'coffee-compile-file)
  (define-key erlang-mode-map (kbd "C-c C-m") 'coffee-make-coffee)
  ;; Add other coffee commands
)