先日、東京は初台のアップルジャパンさんを訪ねました。もちろん、新しい「iMac」の発表にあわせてです。残念ながら、そのときは新Mac miniを見ることはできませんでしたが……近々お借りできる予定ですので、レビューをお待ちください。
さて、今回はアプリケーションの「裏オプション」について。defaultsコマンドでなにやら実行すると、ふだん表示されないメニューが現れたり、環境設定パネルにはない動作を指定できたり、というアレだ。当コラムでは何度も取り上げているが、その探し方について言及したことがなかったことに気付いたため、ここに紹介する次第。
defaults / plistの歴史
裏オプションの探し方へ進む前に、defaultsコマンドとplistファイルについて説明しておこう。OS Xの歴史的遺構 (?) とでも表現すべき内容を含むため、知っておいて損はないと思う。
その出発点は、ご想像どおりNeXTSTEPだ。システムおよびアプリケーションは共通のプロパティリスト (~/.NeXT/NeXTdefaults.{D|L}
) へ、「GLOBAL 24HourColock Yes
」といったシンプルなフォーマットで各種情報を記録し、設定ファイルとして利用していた (ちなみにこの頃のコマンド名は「dread」と「dwrite」)。OPENSTEPのときに仕様が拡張され、解析速度向上を目的にバイナリ形式も用意されたが、独自フォーマットだったという点では大きく変わらない。
それがNeXT Software買収を契機にRhapsodyの開発がスタート、このときプロパティリストのフォーマットがXML形式に変更された。現在OS Xで利用されているplistファイルの原型は、このRahpsodyベースのものだ。
一方、defaultsコマンドの性格は大きく変化していない。plistファイルにアクセスするためのCUIツールという位置付けであり、時代にあわせて対応するフォーマットは変化しているものの、defaultsコマンドを使わなければアプリケーションの設定を読み書きできない、というわけではない。使い方は『第125回 今さら聞けないdefaultsコマンドの使い方』で詳しく説明しているため、そちらをご参照いただきたい。
道具は「strings」
defaultsコマンドでアプリケーションのplistファイルに変更を加える場合、その名称と対象の項目、書き込むデータを指定しなければならない。名称は、Safariであれば「com.apple.Safari
」のように、アプリケーション名+開発元のドメイン名を逆から読んだ形式となる。項目名は基本的にアプリケーションごとに異なるため、plistファイルを解析するしかない。
しかし、裏オプションがplistファイルに (デフォルトの状態で) 記載されているケースは少ない。自力で探さなければならないのだ。
裏オプション探しの基本は、バイナリファイルから表示可能な文字列を抽出する「strings」コマンドの活用だ。stringsコマンドを使い、アプリケーションバンドル内部にある実行形式のファイル (×××.app/Contents/MacOS/○○○
) からめぼしいキーワードを探し出し、defaultsコマンドで設定を変更してみること。あとは実践あるのみ、ひたすら試行錯誤を繰り返さなければ裏オプションにたどりつくことは難しい。
合い言葉は「Debug」
とはいえど、コツのようなものはある。それを知るか知らないかでは、裏オプションに辿り着くことができる確率が大きく変わるため、参考にしてほしい。
ひとつは、項目名の命名様式。Property List Editorでplistファイルを開けばわかるが、項目名はほとんどの場合大文字で始まる。小文字のみ、末尾が「:
」で終わる、といった項目名はほとんどないはず。逆に言えば、そのような文字列はオプションではない (ex. アプリケーションが発するメッセージ) 可能性が高い。
もうひとつは、"ありがちな"裏オプション命名ルールを参考にすること。裏オプションはデバッグ目的で設けられていることが多いため、名前に「Debug」を含むことが多いのだ。『第314回 話題の「Safari 4」に隠された秘密』が好例だろう。ほかにも、通常は非表示のメニューを表示するということから「Show」、通常は無効な設定を有効にすることから「Enabled」などの文字列が使われることも多い。
発見した項目名だが、いきなり「defaults write ~
」で書き込む前に、「defaults read ~
」で同名の項目が存在するかどうか確認したほうがいい。存在しなければ書き込み、対応アプリケーションの動作を確認しよう。動作に問題があるかなにも起こらなければ、「defaults delete ~
」で項目を消せばいい。これも試行錯誤あるのみだ。
$ strings /Applications/Address\ Book.app/Contents/MacOS/Address\ Book | less
$ defaults read com.apple.AddressBook ABShowDebugMenu
2009-03-05 11:59:16.835 defaults[58978:10b]
The domain/default pair of (com.apple.AddressBook, ABShowDebugMenu) does not exist
$ defaults write com.apple.AddressBook ABShowDebugMenu -bool YES