ソースコードを書いているときに "=" の前後にスペースを自動で挿入してくれる key-combo.el

プログラムを書くとき，"=" の前後や "," の後ろにスペースを挿入する人は多いと思います．また，"'" を挿入すればたいていはもう一つ "'" 入力するでしょう．

このような決まりきった入力を楽に行ってくれる Elisp として [smartchr.el](http://tech.kayac.com/archive/emacs-tips-smartchr.html) が有名です．smartchr.el は，"=" を入力したときに " = " を挿入するというように，1つのキーで2文字以上の文字を挿入することができます．また，1つのキーに対して複数の割り当てが行えるため，例えば "=" に " = " と " == " を割り当てれば，"=" を1回押すと " = " が，2回押すと " == "が，3回押すとまた " = " が挿入される，という設定が可能です．

以上のような素晴らしい機能を持つ smartchr.el ですが，日頃打ち慣れたキー入力で問題が発生することがあります．例えば，"=" キーに " = " を，">" キーに " > " を設定している場合，Ruby のハッシュ記号 "=>" を入力したときに " =  > " という文字が挿入されてしまいます．

この問題を解決したのが smartchr.el の後継に当たる [key-combo.el](http://d.hatena.ne.jp/uk-ar/20111208/1322572618) です．key-combo.el では，"=" の入力に " = " を割り当てる設定に加えて，">=" の入力に " >= " を割り当てるといったことが可能になります．

インストール方法は以下のとおりです．

1. [key-combo.el](https://raw.github.com/uk-ar/key-combo/master/key-combo.el) をロードパスの通ったディレクトリに置く (`(package-install 'key-combo)` でも可)
2. .emacs に `(require 'key-combo)` を記述する

key-combo.el は .emacs に `(key-combo-load-default)` と書けばおすすめの設定が自動で行われます．私はこの設定が気に入らなかったので，自分で設定を書きました．key-combo の設定の参考として最後に私の設定を添付しておきます．C 言語や javascript に key-combo の設定を適用するように書いていますが，Ruby 以外はほとんど書かないので設定内容はかなり Ruby に最適化されてます．

```common-lisp
(require 'key-combo)
(key-combo-mode 1)


;;; 各モードに対するキー設定
(setq key-combo-lisp-mode-hooks
      '(lisp-mode-hook
        emacs-lisp-mode-hook
        lisp-interaction-mode-hook
        inferior-gauche-mode-hook
        scheme-mode-hook))

(setq key-combo-lisp-default
      '(("."  . " . ")
        (","  . (key-combo-execute-orignal))
        (",@" . " ,@")
        (";"  . (";;;; " ";"))
        ("="  . ("= " "eq " "equal "))
        (">=" . ">= ")))

(setq key-combo-common-mode-hooks
      '(c-mode-common-hook
        php-mode-hook
        ruby-mode-hook
        cperl-mode-hook
        javascript-mode-hook
        js-mode-hook
        js2-mode-hook))

(setq key-combo-common-default
      '((","  . (", " ","))
        ("="  . (" = " " == " " === " "="))
        ("=>" . " => ")
        ("=~" . " =~ ")
        ("=*" . " =* ")
        ("+"  . (" + " " += " "+"))
        ("+=" . " += ")
        ("-"  . (" - " " -= " "-"))
        ("-=" . " -= ")
        ("->" . " -> ")
        (">"  . (" > " " => " " >= " ">"))
        (">=" . " >= ")
        ("%"  . (" % " " %= " "%"))
        ("%="  . " %= ")
        ("!" . (" != " " !~ " "!"))
        ("!="  . " != " )
        ("!~" . " !~ ")
        ("~" . (" =~ " "~"))
        ("::" . " :: ")
        ("&"  . (" & " " && " "&"))
        ("&=" . " &= ")
        ("&&=" . " &&= ")
        ("*"  . (" * " "**" "*"))
        ("*="  . " *= " )
        ("<" . (" < " " <= " "<"))
        ("<=" . " <= ")
        ("<<=" . " <<= ")
        ("<-" . " <- ")
        ("|"  . (" ||= " " || " "|"))
        ("|=" . " |= ")
        ("||=" . " ||= ")
        ("/" . ("/`!!'/" " / " "// "))
        ("/=" . " /= ")
        ("/*" . "/* `!!' */")
        ("{" . ("{`!!'}" "{"))
        ("{|" . "{ |`!!'|  }")
        ("\"" . ("\"`!!'\"" "\""))
        ("'" . ("'`!!''" "'"))
        ("(" . ("(`!!')" "("))))


(key-combo-define-hook key-combo-common-mode-hooks
                       'key-combo-common-load-default
                       key-combo-common-default)
(key-combo-define-hook key-combo-lisp-mode-hooks
                       'key-combo-lisp-load-default
                       key-combo-lisp-default)
```