Translations/Mac OS X Key Bindings

Last-modified: 2007-10-11 (木) 13:43:09 (3602d)

Mac OS Xにはテキスト編集コントロールでのキーバインディング(キーボードショートカット)を好きに設定できる仕組みがある。
/Library/KeyBindings/DefaultKeyBinding.dictというファイルに設定を書いておくと、標準のコントロールを使っているアプリケーションならすべて同じキーバインディングで操作できるようになる。そのやり方を調べていて海外のとあるブログを発見したので簡単に翻訳してみた。


私は最近Mac OS Xでのいくつかのキーバインドを変更したいと思った。検索に膨大な時間を費やしたのち、私は望んでいた情報を見つけた。だが、その情報はいくつかの異なるサイトに散らばっていた。この記事は私が見つけたすべての情報を一つのドキュメントにまとめることを目的としている。

Mac OS Xはキーバインドに関するある強力な制御を用意している。以下に記すその方法で標準的なCocoa AppKitのテキスト編集オブジェクトを利用しているすべてのアプリケーションに対しキーバインドを変更することが可能だ。

標準のキーバインドは以下に登録されている。

/System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict

不幸なことに、このファイルはXMLなので実に読みづらい。君は何があろうとこのファイルをいじらずに、次のファイルを作成することで変更を適用すべきだ。

/Users/USERNAME/Library/KeyBindings/DefaultKeyBinding.dict

USERNAMEのところには君のユーザー名が入る。もし KeyBindingsというディレクトリが無かったら作成すればいい。注意すべきなのはシステム標準のもの(StandardKeyBinding.dict)と上書きするもの(DefaultKeyBinding.dict)とではファイル名が異なるという点だ。

XMLではないファイルのフォーマットは基本的な キー / アクション のペアだ。

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    "KEY1" = "ACTION1";  /* KEY1 に ACTION1 を割り当てる */
    "KEY2" = "ACTION2";  /* KEY2 に ACTION2 を割り当てる */
    ...
}

以下に例を記す。

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    "^f"      = "moveWordForward:";            /* Ctrl-f    = 次の単語へ */
    "^b"      = "moveWordBackward:";           /* Ctrl-b    = 前の単語へ */
    "^v"      = "pageUp:";                     /* Ctrl-v    = ページUP   */
    "\UF729"  = "moveToBeginningOfLine:";      /* Home      = 行頭へ     */
    "^\UF729" = "moveToBeginningOfDocument:";  /* Ctrl-Home = ファイル先頭へ */
}

キーは表示可能な文字("a"など)でも、8進数で表現される非表示文字(例えばDeleteキーなら"\177")でも、あるいはユニコード(例えば上矢印キーなら"\UF700")でも指定できる。そのキーは一つ以上の「修飾」キーを前に置くことができる。

修飾キー

 ^ : コントロール
 $ : シフト
 ~ : オプション (Alt)
 @ : コマンド (Apple)
 # : テンキー

たとえば、コントロール+シフト+Homeキーなら "^$\UF729" で、コマンド+aキーなら "@a" になる。

多くの一般的な非表示キーコードのリストは以下のとおりだ。完全なリストは NSEvent.h というヘッダファイルで見ることができる。

非表示キーのコード

 ↑キー: \UF700        Backspace:    \U0008        F1:           \UF704
 ↓キー: \UF701        Tab:          \U0009        F2:           \UF705
 ←キー: \UF702        Escape:       \U001B        F3:           \UF706
 →キー: \UF703        Enter:        \U000A        ...
 Insert: \UF727        Page Up:      \UF72C
 Delete: \UF728        Page Down:    \UF72D
 Home:   \UF729        Print Screen: \UF72E
 End:    \UF72B        Scroll Lock:  \UF72F
 Break:  \UF732        Pause:        \UF730
 SysReq: \UF731        Menu:         \UF735
 Help:   \UF746

アクションは動作を表す文字列でシンプルに定義する。一般的にサポートされるアクションを以下に記す。各アクションの最後に付いているコロンに注意。これは省いてはいけない。

サポートされているアクション
 
 alignCenter:                                        newDocument:
 alignJustified:                                     openDocument:
 alignLeft:                                          orderBack:
 alignRight:                                         orderFront:
 breakUndoCoalescing                                 orderFrontLinkPanel:
 cancelOperation:                                    orderFrontListPanel:
 capitalizeWord:                                     orderFrontSpacingPanel:
 center                                              orderFrontTablePanel:
 centerSelectionInVisibleArea:                       outline:
 changeCaseOfLetter:                                 pageDown:
 checkSpelling:                                      pageUp:
 clearRecentDocuments:                               paste:
 complete:                                           pasteAsPlainText:
 copy:                                               pasteAsRichText:
 copyFont:                                           pasteFont:
 copyRuler:                                          pasteRuler:
 cut:                                                performClose:
 delete:                                             performMiniaturize:
 deleteBackward:                                     performZoom:
 deleteBackwardByDecomposingPreviousCharacter:       printDocument:
 deleteForward:                                      raiseBaseline:
 deleteToBeginningOfLine:                            revertDocumentToSaved:
 deleteToBeginningOfParagraph:                       runPageLayout:
 deleteToEndOfLine:                                  saveAllDocuments:
 deleteToEndOfParagraph:                             saveDocument:
 deleteToMark:                                       saveDocumentAs:
 deleteWordBackward:                                 saveDocumentTo:
 deleteWordForward:                                  scrollLineDown:
 hide:                                               scrollLineUp:
 ignoreSpelling:                                     scrollPageDown:
 indent:                                             scrollPageUp:
 insertBacktab:                                      selectAll:
 insertContainerBreak:                               selectLine:
 insertLineBreak:                                    selectParagraph:
 insertNewline:                                      selectToMark:
 insertNewlineIgnoringFieldEditor:                   selectWord:
 insertParagraphSeparator:                           setMark:
 insertTab:                                          showContextHelp:
 insertTabIgnoringFieldEditor:                       showGuessPanel:
 insertText:                                         startSpeaking:
 loosenKerning:                                      stopSpeaking:
 lowerBaseline:                                      subscript:
 lowercaseWord:                                      superscript:
 moveBackward:                                       swapWithMark:
 moveBackwardAndModifySelection:                     terminate:
 moveDown:                                           tightenKerning:
 moveDownAndModifySelection:                         toggleBaseWritingDirection:
 moveForward:                                        toggleContinuousSpellChecking:
 moveForwardAndModifySelection:                      toggleRuler:
 moveLeft:                                           transpose:
 moveLeftAndModifySelection:                         transposeWords:
 moveRight:                                          turnOffKerning:
 moveRightAndModifySelection:                        turnOffLigatures:
 moveToBeginningOfDocument:                          underline:
 moveToBeginningOfDocumentAndModifySelection:        unscript:
 moveToBeginningOfLine:                              uppercaseWord:
 moveToBeginningOfLineAndModifySelection:            useAllLigatures:
 moveToBeginningOfParagraph:                         useStandardKerning:
 moveToEndOfDocument:                                useStandardLigatures:
 moveToEndOfDocumentAndModifySelection:              yank:
 moveToEndOfLineAndModifySelection:
 moveToEndOfLine:                                    
 moveToEndOfParagraph:                               
 moveUp:                                             
 moveUpAndModifySelection:            					 
 moveWordBackward:                    					 
 moveWordBackwardAndModifySelection:  					 
 moveWordForward:                     					 
 moveWordForwardAndModifySelection:   					 
 moveWordLeft:                        					 
 moveWordLeftAndModifySelection:      					 
 moveWordRight:                       					 
 moveWordRightAndModifySelection:     					 

以下の2つの異なる定義は、マルチキーのバインディングと複数のアクションを行う単一キーを設定している。

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    /* KEY1 に ACTION1 と ACTION2 をバインディングする */
    "KEY1" = ("ACTION1", "ACTION2", ...);
    
    /* マルチキー バインディング */
    "KEY1" = {
             /* KEY1 の次に KEY2 をタイプした時に ACTION1 を行う */
             "KEY2" = "ACTION1";
             /* KEY1 の次に KEY3 をタイプした時に ACTION2 を行う */
             "KEY3" = "ACTION2";
             ...
             };
    ...
}

例を以下に。

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    /* 単一キーに複数のアクションをバインドする例。
       コントロール+シフト+Home を 現在のカーソル位置から行頭までの
       範囲選択にバインドする。
       Windowsでいうところの Ctrl + シフト + Home。*/

    "$\UF729"  = ("setMark:","moveToBeginningOfLine:","selectToMark:");

    /* 複数のキーを単一アクションにバインドする例。
       コントロール+x と コントロール+s を「保存」にバインドする。
       Emacs でいうところの C-x C-s。 */ 

    "^x" = { "^s"  = "save:"; }
}

部分的にWindowsをエミュレートするキーバインドファイルの例。

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
   "^\010"    = "deleteWordBackward:";
   "\UF729"   = "moveToBeginningOfLine:";
   "^\UF729"  = "moveToBeginningOfDocument:";
   "$\UF729"  = "moveToBeginningOfLineAndModifySelection:";
   "$^\UF729" = "moveToBeginningOfDocumentAndModifySelection:";
   "\UF72B"   = "moveToEndOfLine:";
   "^\UF72B"  = "moveToEndOfDocument:";
   "$\UF72B"  = "moveToEndOfLineAndModifySelection:";
   "$^\UF72B" = "moveToEndOfDocumentAndModifySelection:";
   "^\UF702"  = "moveWordBackward:";
   "^\UF703"  = "moveWordForward:";
   "$^\UF702" = "moveWordBackwardAndModifySelection:";
   "$^\UF703" = "moveWordForwardAndModifySelection:";
   "\UF72C"   = "pageUp:";
   "\UF72D"   = "pageDown:";
   "^z"       = "undo:";
   "$\UF728"  = "cut:";
   "$\UF746"  = "paste:";
   "^\UF746"  = "copy:";
}

部分的にEmacsをエミュレートするキーバインドファイルの例。

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
/* オリジナルのバインディングは lorax.comのMike Ferrisによる
 * TextExtrasパッケージに含まれるもの。
 * それ以上の変更はMishka Gorodnitzky(misaka@pobox.com)、 
 * Patrick Linskey、そして Llew Mason による。
 */
{
   "~f"      = "moveWordForward:";              /* M-f */
   "~b"      = "moveWordBackward:";             /* M-b */
   "~<"      = "moveToBeginningOfDocument:";    /* M-< */
   "~>"      = "moveToEndOfDocument:";          /* M-> */
   "~v"      = "pageUp:";                       /* M-v */
   "^v"      = "pageDown:";                     /* C-v */
   "~d"      = "deleteWordForward:";            /* M-d */
   "~^h"     = "deleteWordBackward:";           /* M-C-h */
   "~\010"   = "deleteWordBackward:";           /* M-backspace */
   "~\177"   = "deleteWordBackward:";           /* M-delete */
   "~\UF728" = "deleteWordForward:";            /* delete */
   "\UF729"  = "moveToBeginningOfDocument:";    /* home */
   "\UF72B"  = "moveToEndOfDocument:";          /* end */
   "@\UF729" = "moveToBeginningOfParagraph:";   /* A-home */
   "@\UF72B" = "moveToEndOfParagraph:";         /* A-end */
   "@\UF700" = "moveToBeginningOfDocument:";    /* A-up */
   "@\UF701" = "moveToEndOfDocument:";          /* A-down */
   "^\UF700" = "pageUp:";                       /* C-up */
   "^\UF701" = "pageDown:";                     /* C-down */
   "\UF72C"  = "pageUp:";                       /* page-up */
   "\UF72D"  = "pageDown:";                     /* page-down */
   "^/"      = "undo:";                         /* C-/ */
   "~c"      = "capitalizeWord:";               /* M-c */
   "~u"      = "uppercaseWord:";                /* M-u */
   "~l"      = "lowercaseWord:";                /* M-l */
   "^t"      = "transpose:";                    /* C-t */
   "~t"      = "transposeWords:";               /* M-t */
   "~/"      = "complete:";                     /* M-/ */
   "^g"      = "_cancelKey:";                   /* C-g */
   "^a"      = "moveToBeginningOfLine:";        /* C-a */           
   "^e"      = "moveToEndOfLine:";              /* C-e */   

   "^x" = {
       "^x"  = "swapWithMark:";                 /* C-x C-x */
       "^m"  = "selectToMark:";                 /* C-x C-m */
       "^s"  = "save:";                         /* C-x C-s */
       "^w"  = "saveAs:";                       /* C-x C-w */
       "k"   = "performClose:";                 /* C-x C-k */
   };

   /* マーク設定みたいなの。(Emacsスタイルのmarkとpointのバインディングは
    * 実装されてはいるもののデフォルトでは区切られない。テキストシステムでは
    * markとpointは範囲であり、位置ではない。"point" は 選択の範囲を示す)
    */
   "^@" = "setMark:";                           /* C-@ */
   "^ " = "setMark:";                           /* C-space */
   "^w" = "deleteToMark:";                      /* C-w */

   /* Mac 流の F1〜F5 のバインディング */
   "\UF704" = "undo:";                          /* F1 */
   "\UF705" = "cut:";                           /* F2 */
   "\UF706" = "copy:";                          /* F3 */
   "\UF707" = "paste:";                         /* F4 */
   "\UF708" = "_cancelKey:";                    /* F5 */
}

リンク

Customizing the Cocoa Text System by Jacob Rus

TextMate Blog - Key bindings for switchers

Apple Documentation - Text Defaults And Bindings

Apple Documentation - NSResponder supported actions

※原文はこちら→http://www.lsmason.com/articles/macosxkeybindings.html


訳注

  • アクションの完全な一覧はNSResponder.hに記載されている。