Mac vriendelijke keybindings voor Emacs 22 Carbon

Gepubliceerd op: 11.X.2008 09:02 CEST
Categorieën: emacs, osx

Na begin van het jaar van Textmate weer terug te zijn verhuist naar Vim, ben ik sinds een paar maanden weer helemaal in Emacs gedoken voor al mijn Ruby, Rails, JavaScript, CSS, HTML, Common Lisp, Twitter, Latex en Spreadsheet werk. M’n EEE heeft veel invloed gehad op deze stappen en nu is ook m’n MacBook tot gastheer voor Emacs gemaakt.

Emacs is alles en meer. De langer je ermee werkt, de onhandiger en knulliger de ander applicaties op je computer lijken. Daarnaast begin je als gebruiker steeds minder te begrijpen van de editor war want Emacs is toch helemaal geen editor?!

Maar goed, deze afkeer tegen alles buiten Emacs heeft ook z’n nadelen; uitstapjes van Emacs naar bijvoorbeeld een browser kunnen door sneltoets incompatibiliteit pijnlijk aflopen. De versie die ik heb geïnstalleerd, is de “carbon” variant van MacPorts, een Emacs versie 22 welke netjes geïntegreerd is met OSX. Er is echter een klein detail dat heel vervelend kan uitpakken; de Command-toets (appeltje) is gedefinieerd als de Meta-toets.

In eerste instantie vond ik dat verschrikkelijk handig, m’n vingers kunnen deze toets namelijk gemakkelijk vinden en het is daarom heel natuurlijk om de veel gebruikte Meta-x combinatie te maken. Alleen is de standaard copieëren combinatie van Emacs Meta-w..

Ja, je kan cua-mode aanzetten maar dan zit je met Ctrl-C en Ctrl-V te copieëren terwijl Command-C en Command-V in alle ander applicaties op je Mac worden gebruikt. Daarbij komt dat Ctrl-C en Ctrl-V in de standaard Emacs al een functie hebben en ik wil natuurlijk de standaard Emacs binding Meta-w ook gewoon kunnen gebruiken zonder dat ik daarmee per ongeluk ander applicaties afsluit.

De oplossing blijkt heel simpel! Je kan de carbon variant van Emacs 22 vertellen dat hij de Function-toets (fn) als Meta-toets gebruikt en de Command-toets als Hyper-toets. Standaard heeft Emacs geen bindings voor de Hyper-toets en als we deze, op het toetsen bord, aan Command kunnen koppelen, zitten de OSX sneltoetsen in Emacs niet meer in de weg. Sterker nog we kunnen de deze sneltoetsen in Emacs koppelen aan functies die (ongeveer) overeen komen met het bijbehorende gedrag. Het resultaat is het volgende:

(when (eq window-system 'mac)
  ;; Fn als Meta en Cmd als Hyper
  (setq mac-function-modifier 'meta mac-command-modifier 'hyper)
  ;; Mac-achtige bindings
  (global-set-key (kbd "H-n") 'make-frame)
  (global-set-key (kbd "H-o") 'find-file)
  (global-set-key (kbd "H-s") 'save-buffer)
  (global-set-key (kbd "H-w") 'delete-frame)
  (global-set-key (kbd "H-c") 'kill-ring-save)
  (global-set-key (kbd "H-x") 'kill-region)
  (global-set-key (kbd "H-v") 'yank)
  (global-set-key (kbd "H-a") 'mark-whole-buffer)
  (global-set-key (kbd "H-l") 'goto-line)
  (global-set-key (kbd "H-f") 'isearch-forward)
  (global-set-key (kbd "H-g") 'isearch-repeat-forward)
  (global-set-key (kbd "H-z") 'undo)
  (global-set-key (kbd "H-<up>") 'beginning-of-buffer)
  (global-set-key (kbd "H-<down>") 'end-of-buffer)
  (global-set-key (kbd "H-<left>") 'move-beginning-of-line)
  (global-set-key (kbd "H-<right>") 'move-end-of-line)
  ;; Fn-combinaties waar ik aan gehecht was
  (global-set-key (kbd "M-<left>") 'beginning-of-buffer)
  (global-set-key (kbd "M-<right>") 'end-of-buffer)
  (global-set-key (kbd "M-<up>") 'scroll-down)
  (global-set-key (kbd "M-<down>") 'scroll-up)
  (global-set-key (kbd "M-<backspace>") 'delete-char))

Plaats het bovenstaande in je .emacs file en er is weer sneltoets vrede tussen Emacs en de rest.