NSTextView のキーバインド

 NSTextView で特殊キーの機能を変更したい時、普通に思い付くのは NSTextView をサブクラス化する、という手だが、Cocoa の key binding 機能をうまく使うとサブクラス化しなくてもデリゲートで処理でき、しかもカスタマイズ機能までおまけでついてくる。

 ポイントは NSTextView のデリゲートメソッド -(BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector。特殊キーを押すと、標準キーバインド(システム標準:/System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict、ユーザー標準:~/Library/KeyBindings/DefaultKeyBinding.dict)が検索され、そこに登録されているキーに対しては対応するセレクタが NSTextViewdoCommandBySelector:(SEL)aSelector に送られる。このメソッドは上述のデリゲート -(BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector を呼び出し、戻り値が NO なら自分の aSelector メソッドを呼び出し、YES なら何もしない。

 例えば、標準キーバインドでは control-FmoveForward: にバインドされているため、上記の手順に従ってデリゲートに [delegate textView: aTextView doCommandBySelector: @selector(moveForward:)] なるメソッド呼び出しが行われる。control-F にある機能を割り当てたければ、デリゲートの上記メソッド中でその処理を行えばよい。しかも、ユーザーが control-F の代わりに control-DmoveForward: に割り当てていれば、自動的に同じキーバインドが適用される。

 疑問:アプリケーションごと、あるいは違う NSTextView ごとに違うキーバインドを設定したいこともあると思うのだが、それはどうすれば実現できるんだろう?