control-command-Dの設定はどこへ行った?

前回からの続き...

  • OSX 10.6になり、ポップアップして辞書で調べるショートカット:control-command-Dを変更するシステム環境設定の項目が消えてしまった。
  • OSX 10.5までは、システム環境設定 >> キーボートとマウス >> キーボードショートカットで、2行目の「辞書で調べる」の項目でショートカットの変更が可能だった。
  • 設定項目が消えてしまったからと言って、control-command-Dが利用できなくなる訳ではなく、OSX 10.6でもちゃんと使える。
  • また、OSX 10.5でcontrol-command-Dを変更して別のショートカットを割り当てていると、その設定はOSX 10.6でも引き継がれ、変更後のショートカットで利用できる。
  • しかし、一部問題があって、変更したショートカットによっては、一部のアプリケーションで反応しない場合もある。
  • 具体的には、ショートカットをF5に変更していると、OSX 10.5では問題なく利用できたが、OSX 10.6のSafariでは反応しない、という症状が発生している。(Safari以外のアプリケーションではちゃんとポップアップする)
  • Safariを使っている時こそ、ポップアップ辞書が大活躍するので、これが使えないのは相当悲しい...。
  • ならば、ショートカットを標準のcontrol-command-Dに戻せばいいじゃないか、と考えるが、OSX 10.6ではその設定項目が消えているのだ...。
  • こうなったら、設定ファイルを見つけ出して、直接書き換えるしかない。変更が引き継がれるということは、どこかにその設定が保存されているはずだ。

設定ファイルを探す

  • 実験用にOSX 10.5を外付けHDに新規インストールした。(過去に2度も壊れてAppleで補償交換した信頼性の全くないHDが役に立った。)
    • control-command-Dを変更するシステム環境設定の項目は、OSX 10.5にしかないので、面倒だけどインストールした。(余分なプリンタファイルとか言語環境は削除して必要最小限の構成で)
    • また、Property List Editor.appもたぶん使うことになるので、Xcodeもインストールしておいた。
  • インストールしたら、すぐさまFinderで~/Library/Preferencesを開き、リスト表示、変更日順に並べ替える。(最新のファイルが上に表示されるように)
    • こうゆう設定は、基本的にPreferencesフォルダの.plistファイルにインストールされると考えて狙い撃ち。
    • ちなみに、インストール初回起動での面倒なユーザー登録はcommand-Qでスキップ出来る。
  • システム環境設定 >> キーボートとマウス >> キーボードショートカットを開き、辞書で調べるのショートカットをファンクションキーF5に変更してみる。
  • 変更したらシステム環境設定を終了する。その瞬間、開いておいたFinderウィンドウ~/Library/Preferencesを確認する。
    • 更新時間が最新の数ファイルが求める設定ファイルである可能性大。
  • 一つずつ開いていくと、おそらく~/Library/Preferences/com.apple.symbolichotkeys.plistが求めるファイルだと予想した。
    • ショートカットに意味のある設定ファイルは、これしかなさそうだと思い込んだので。名前からしてsymbolic hotkeysだし。

設定項目を特定する

  • ~/Library/Preferences/com.apple.symbolichotkeys.plistダブルクリックするとProperty List Editor.appで内容が表示された。
    • うまく開けない時は、/Developer/Applications/Utilities/Property List Editor.appを起動して開けばいい。
  • 辞書で調べるのショートカット:control-command-DをF5に変更したり、元に戻したりする。
  • しかし、項目が多すぎるのでどれが変更されたか目視だけでは確認出来ない。diff(差分)をとることにした。
  • com.apple.symbolichotkeys.plistは、そのままではバイナリ形式になっていて、差分の詳細を把握出来ない。
  • 一旦、デスクトップにXML Property List形式で保存して、それぞれのdiffをとってみた。
  • ターミナルを起動して、以下のコマンドを実行した。
$ diff -U 10 ~/Desktop/com.apple.symbolichotkeys_ctrl-cmd-D.plist ~/Desktop/com.apple.symbolichotkeys_F5.plist 
--- ~/Desktop/com.apple.symbolichotkeys_ctrl-cmd-D.plist    2009-11-06 16:55:45.000000000 +0900
+++ ~/Desktop/com.apple.symbolichotkeys_F5.plist            2009-11-06 16:54:28.000000000 +0900
@@ -623,23 +623,23 @@
 			</dict>
 		</dict>
 		<key>70</key>
 		<dict>
 			<key>enabled</key>
 			<integer>1</integer>
 			<key>value</key>
 			<dict>
 				<key>parameters</key>
 				<array>
-					<integer>100</integer>
-					<integer>2</integer>
-					<integer>1310720</integer>
+					<integer>63240</integer>
+					<integer>96</integer>
+					<integer>0</integer>
 				</array>
 				<key>type</key>
 				<string>standard</string>
 			</dict>
 		</dict>
 		<key>73</key>
 		<dict>
 			<key>enabled</key>
 			<true/>
 			<key>value</key>
  • どうやら、変更される項目は「70番のvalue >> parameters >> item 0〜2」であることが判明した。
  • 設定項目は以下のように変化した。
    • control-command-D = 「100、2、1310720」
    • F5 = 「63240、96、0」
  • つまり、~/Library/Preferences/com.apple.symbolichotkeys.plistをProperty List Editor.appで開いて、
  • 「70番のvalue >> parameters >> item 0〜2」を「100、2、1310720」に変更すれば、デフォルトのショートカット:control-command-Dが有効になるはず。


  • やってみる。が、Property List Editor.appで変更後、保存してみたが、相変わらずショートカットはF5のまま。変更されない...。
  • 設定ファイルが違っていたのかとガックリしたが、念のため再起動すると...

予想通りのcontrol-command-Dに変更された!

  • どうやら変更を反映させるためには、再起動が必要らしい。(システム環境設定では再起動しなくても反映されるので、もっと利口なやり方があるとは思うが)

バックアップして書き換え

  • 後はこの作業を常用しているOSX 10.6.1環境で実行すれば、おそらく変更出来るはずだ。
  • 但し、書き換えの前には~/Library/Preferences/com.apple.symbolichotkeys.plistをバックアップしておく、
    • あるいは念には念を入れて、Time Machineでバックアップしておけば、心置きなく作業出来る。
  • 作業前の「70番のvalue >> parameters >> item 0〜2」の内容も予想通り「63240、96、0」だった。
  • 「100、2、1310720」に変更して、保存して、再起動してみると...

成功!

  • これでSafariでも便利なポップアップ辞書を思い切り使うことができるのだ。

設定の意味を理解する

  • 一見、理解不能な3つの数字にはいったいどんな意味があるのだろう?
  • こうゆう時はショートカットの設定を微妙に変化させながら、地道に数字の変化を追えばだいたい当たりが付く。
  • しかし、やってから大抵後悔するのがいつものパターン。「書いてあるじゃん」と。
  • その前にWEBで検索してみた。キーワードは「com.apple.symbolichotkeys.plist」で。
  • item 2は、複合キー(モディファイヤキー)の組み合わせを表現するようだ。
16進数 10進数 キー
0x000000 0 何も押さない
0x020000 131072 shift
0x040000 262144 control
0x080000 524288 option
0x100000 1048576 command
    • command = 1048576
    • control-command = 262144 + 1048576 = 1310720(上記で書き換えた時のコードと同じだ!)
    • つまり、押しているキーの数字を足し算すれば、複数のキーを押していることになるのだ。
  • そして、item 0・item 1はキーコードを調べてみて分かった。
  • Macでキーコードを調べるには、その名もズバリ Key Codes.app がある。


  • 上記で設定した内容と見比べてみて、item 0はUnicode:、item 1はKey Code:、であることが理解出来た。
  • また、70番というのはOSが決める機能の番号で、ポップアップ辞書の機能が割り当てられている。


以上の仕組みが理解出来れば、GUIから変更出来ないショートカットでも、設定ファイルを直接弄って自由に変更することができるのだ!どこかに隠れたショートカット機能がないか探してみたくなった。


システム標準の辞書で調べるcontrol-command-Dを設定するワンライナー

  • 最後に、おなじみの裏技的なワンライナーにまとめてみた。
  • しかし、複雑な構造を持ったplistを書き換える方法って、どうやるべきなんだろう?
  • 悩んだ結果、最初にやってみたのが以下のコマンド。
defaults write com.apple.symbolichotkeys AppleSymbolicHotKeys -dict-add 70 "{enabled = YES; value = { parameters = (100, 2, 1310720); type = 'standard'; }; }"
  • 一応、上記コマンドでショートカットは control-command-D に設定された。
  • しかし、Property List Editor.appで確認してみると、以下のようになっていた。


  • 値がすべてstring形式になっている...。(その下の73番と比較すると良く分かる。本来は boolean・number であるべきなのかも。)
  • 目指すショートカットが設定されるので良いのだけど、何だか気分的に良くない。
  • そこで、少し長ったらしいがxml形式で書き直してみると、値の型もちゃんと指定出来た。
defaults write com.apple.symbolichotkeys AppleSymbolicHotKeys -dict-add 70 "<dict><key>enabled</key><true/><key>value</key><dict><key>parameters</key><array><integer>100</integer><integer>2</integer><integer>1310720</integer></array><key>type</key><string>standard</string></dict></dict>"


以上で、control-command-Dを設定するワンライナー、完成!(コマンド実行後、再起動あるいは再ログインが必要)
OSX 10.6で辞書で調べるがうまく機能しない場合、やってみる価値があると思う。

参考ページ