2011年12月31日土曜日

Cocoa テキストシステムのキィバインドをさらに Emacs に近づける

本ブログのエントリィ「眠れぬ夜のために: KeyBindingsEditor」の六年ぶりの続編。

 上記エントリィの繰り返しになるけど、Mac OS X の Cocoa フレームワークを用いて作られたアプリケーションのテキストフィールドは、ディフォルトで Emacs 風なキィバインドが割り当てられている。たとえば Control + p/n/f/b/a/e によるカーソル移動や Control + d/h によるカーソル前後の文字削除、Control + k/y による kill-lineyank など。
 Emacs 風のキィバインドに慣れたユーザであれば、両手をキィボードのホームポジションに置いたままで様々な操作ができるけん、テキスト編集のスピードが上がる。みんな覚えよう!

 ほなけど、ディフォルトの割り当てだけではまだまだ Emacs でよく使う操作には足りない。今回は Cocoa テキストシステムのキィバインドをさらに Emacs に近づけることを考える。

 今回は以下の操作をキィバインドに割り当てる。
  • set-mark
  • newline
  • newline-and-indent
  • kill-region
  • kill-ring-save
 キィバインドの割り当てには前回のエントリィと同じ KeyBindingsEditor を用いる。
  1. KeyBindingsEditor を立ち上げる
  2. メニューバーから File -> Open -> User Key Bindings を選択してユーザのキィバインド定義ファイルを開く
  3. Add Binding ボタン(2 ストローク以上のキィバインドの場合は Add Multikey binding ボタン)を押してキィバインドを追加する
  4. 追加したキィバインドを選択して、ウィンドウ下部の Keystroke 欄をクリックし、好みのキィバインドをタイプする
  5. Actions 欄でキィバインドに割り当てる操作を選択する。ひとつのキィバインドにふたつ以上の操作を割り当てたい場合は Add Action ボタンを押してアクションを増やす
  6. 3 - 5 を必要なだけ繰り返す
 KeyBindingsEditor でキィバインドを割り当てた結果が以下の画像のようになる。
 画像中で Action 欄が ( となっているのはふたつ以上のアクションを割り当てたもの。具体的には Control + j には insertNewline:indent:Control + [ に続く 2 ストローク目の Control + w には deleteToMark:yank: が割り当てられている。

 今回の KeyBindingsEditor での割り当てで kill-ring-save に対応するキィバインドは Control + [Control + w とした。Emacs において kill-ring-save に対応するキィバインドは M-w であり、ふだん私が Emacs でこの操作を行う場合は MetaC-[ で代用してから 2 ストローク目で w を単独で押す。本来であれば KeyBindingsEditor での割り当ても 2 ストローク目は単独の w で構わない。ほなけど、日本語入力が ON になっている状態で 2 ストローク目の w を押すと、その入力が IM に取られて割り当てた操作が実行されない(日本語入力が OFF の場合は単独の wで動作する)。Control を修飾すると日本語入力が ON の状態でも動作するので、今回のようにしている。

 これで 一般的なCocoa アプリケーションのテキストフィールドにて割り当てた操作を実行できる(Cocoa アプリケーションではなかったり、テキストフィールドを独自実装しているような場合は実行できない。たとえば Google Chrome なんかは動作が怪しい)。たとえば Control + Space でマークし、カーソルを動かして Control + w すると、マークした箇所からカーソル位置までの文字を削除して kill-ring に格納することができる。kill-ring の内容は Control + yyank。つまり、ホームポジションのままでカットアンドペーストができることになる。
 割り当て変更後にはアプリケーションの終了、再実行が必要となる。

 ここで、kill-ring の内容と Mac OS X 標準のペーストボードの内容とは関係がないことに注意。コンテキストメニューや Command + c/x からコピィ・カットした文字を Control + yyank することはできないし、上述の Control + w で kill-ring に格納した文字を Command + v でペーストすることはできない。それぞれが独立して動作する。

0 comments:

コメントを投稿