key-combo v1.1をリリース:メジャーモードごとに簡単にキーを割り当て可能にしました

key-combo v1.1をリリースしました。変更点は以下です

  1. メジャーモードごとに簡単にキーを割り当て可能にしました
  2. デフォルトの設定を強化しました

変更詳細

詳細を説明します。
key-comboではキーにコマンドを定義する際にkey-combo-define-globalという関数で定義するようにしてました。globalという名前から連想できるように、一度設定するとすべてのバッファで有効になってしまいます。しかし、やっぱりメジャーモード毎に設定を切り替えたいとは思ってました。例えばEmacs lispでは「define-key」のように関数名に「-」を含めることが普通なので、「 - 」のように空白を含めると不便です。(undoすれば「-」に戻りますが)
しかしv1.1でkey-combo-define-localという関数を追加したので、メジャーモードごとに設定が可能となりました!
もっと早いことできたんじゃね?と言われそうですが、技術的な問題があって…と言い訳しておきます。ページの最後に内部実装の話を書くので興味があればどうぞ。

サンプルコード

では実際の使い方です。上の例であげたemacs-lisp-modeでは「-」を直接入力、c-modeでは「 - 」と空白を開けて入力したい場合は

(add-hook 'emacs-lisp-mode-hook
          (lambda ()
            (key-combo-define-local (kbd "-") 'self-insert-command)))
(add-hook 'c-mode-common-hook
          (lambda ()
            (key-combo-define-local (kbd "-") " - ")))

といった感じで設定できます。

デフォルト設定の変更

今回、設定をメジャーモードごとにできるようになった関係でかなりの量の設定をデフォルトに取り込んでます。
これは、id:pogin さんの設定
smartchrの設定例 - pogin’s blog
をkey-combo 風にして取り込んでます。こころよくOKをくれた pogin さんありがとうございます!
デフォルト設定は今まで同様

(key-combo-load-default)

で取り込めます。
モードによって挙動が違いますが、Cのソースで「=」を何回か入れたり、スクラッチバッファで「;」を何回か入れたりして試してみて下さい。
デフォルト設定をカスタマイズしたい場合は

  • key-combo-global-default
  • key-combo-lisp-default
  • key-combo-c-default
  • key-combo-objc-default
  • key-combo-html-default
  • key-combo-org-default

にキーと対応するコマンドが書いてあります。
また、上記の設定が読み込まれるモードは

  • key-combo-lisp-mode-hooks
  • key-combo-c-mode-hooks
  • key-combo-html-mode-hooks

(global, objc, orgはモードの変更不可)
に対応するフックのリストが書いてあるので、こちらに追加していくのが楽かと思います。

インストール方法

ソースがgithubにおいてあるので

(auto-install-from-url "https://github.com/uk-ar/key-combo/raw/216ef621fdd7410e07c71569c52216705214b335/key-combo.el")

を評価するか、
marmaladeから
M-x package-install key-combo
でインストール可能です。

その他

これで、機能的には当初思っていたものがほぼ出来上がったかなと。あとはデフォルト設定の充実とドキュメント整備だと思ってます。デフォルトについて今回まだ導入しなかったのが、改行を含む系の設定です。これはyasnippet同様に自動でインデントしてあげるのがいいかなと思ってます。試してみて次回のリリースですね。

内部実装

key-combo ではkey-combo 用のキーシーケンスの始まりを監視します。v1.0まではキーシーケンスの先頭のキーをkeymapに登録していました。キーを上書き登録すると元のコマンドが何だったのか分からなくなります。また、実質keymapを2つ管理することになるので設定の組み合わせによってはよく分からない挙動をします。
そこでpre-command-hookを使ってキーシーケンスを監視するようにしたら、うまくいったのでリリースしました。