プログラムを書くとき,"=" の前後や "," の後ろにスペースを挿入する人は多いと思います.また,"'" を挿入すればたいていはもう一つ "'" 入力するでしょう.
このような決まりきった入力を楽に行ってくれる Elisp として smartchr.el が有名です.smartchr.el は,"=" を入力したときに " = " を挿入するというように,1つのキーで2文字以上の文字を挿入することができます.また,1つのキーに対して複数の割り当てが行えるため,例えば "=" に " = " と " == " を割り当てれば,"=" を1回押すと " = " が,2回押すと " == "が,3回押すとまた " = " が挿入される,という設定が可能です.
以上のような素晴らしい機能を持つ smartchr.el ですが,日頃打ち慣れたキー入力で問題が発生することがあります.例えば,"=" キーに " = " を,">" キーに " > " を設定している場合,Ruby のハッシュ記号 "=>" を入力したときに " = > " という文字が挿入されてしまいます.
この問題を解決したのが smartchr.el の後継に当たる key-combo.el です.key-combo.el では,"=" の入力に " = " を割り当てる設定に加えて,">=" の入力に " >= " を割り当てるといったことが可能になります.
インストール方法は以下のとおりです.
-
key-combo.el をロードパスの通ったディレクトリに置く (
(package-install 'key-combo)
でも可) - .emacs に
(require 'key-combo)
を記述する
key-combo.el は .emacs に (key-combo-load-default)
と書けばおすすめの設定が自動で行われます.私はこの設定が気に入らなかったので,自分で設定を書きました.key-combo の設定の参考として最後に私の設定を添付しておきます.C 言語や javascript に key-combo の設定を適用するように書いていますが,Ruby 以外はほとんど書かないので設定内容はかなり Ruby に最適化されてます.
(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)