ユーザデフォルト(defaults)で設定できる項目

隠れ設定項目を操作する方法として、defaults コマンドがあると記事([*1])で知りました。

たとえば Finderのフォントを変更する には次のように設定する、とのことなのですが、この「NSSystemFont」という属性自体の存在は、どのようにして調べられるのでしょうか。


%UNIX> defaults write com.apple.finder NSSystemFont -string AmericanTypewriter;killall Finder


なお、

%UNIX> defaults read

ですべての属性が見られるとのことで、表示させてみたのですが、NSSystemFont が見つかりませんでした。

また、上記設定は実際に機能することは手元で確認しました。


<http://tukaikta.blog135.fc2.com/blog-entry-190.html>


OS: Yosemite (ver 10.10)


宜しくお願いします

null-OTHER, OS X Yosemite (10.10)

投稿日 2015/05/19 08:14

返信
返信: 4

2015/05/19 21:48 matu_home への返信

ちゃんと調べる方法はないと思います。ネットで調べるとか、アプリの中身をバイナリエディタで覗いてみるとかしかないんじゃないでしょうかね。だから隠し設定?


とりあえずは、こんな感じのキーワードで探してみてはどうでしょうか?

  • NSSystemFont
  • NSSystemFontSize
  • NSBoldSystemFont
  • NSBoldSystemFontSize
  • NSFont
  • NSFontSize
  • NSFixedPitchFont
  • NSFixedPitchFontSize
  • NSMessageFont
  • NSMessageFontSize
  • NSLabelFont
  • NSLabelFontSize
  • NSToolTipsFont
  • NSToolTipsFontSize
  • NSTitleBarFont
  • NSTitleBarFontSize
  • NSPaletteFont
  • NSPaletteFontSize


ただ、この手のカスタマイズはやめておいた方が良いですよ。というのも、OS や各アプリでは部品毎に微調整をしてる箇所があって、フォントを変更すると、そこだけ表示がおかしくなったりします。(経験済み)


それと、defaults read ... は、設定済みの項目を取得するためのもので、設定可能な項目一覧を取得するものではありません。


例えば下の例では、Finder の環境設定、つまり、~/Library/Preferences/com.apple.finder.plist の内容を取得&表示するだけです。隠し設定については設定済みならありますし、未設定ならありません。


$ defaults read com.apple.finder


ということで、defaults read は本件とは目的が異なると思います。

2015/05/19 22:54 matu_home への返信

付け加えるなら、NSSystemFont は本来 Finder の設定項目ではなくそのシステム全体に対して設定されているものです。

$ defaults find NSSystemFont

Found 1 keys in domain 'Apple Global Domain': {

NSSystemFont = "HiraKakuPro-W3";

}

matu@homeさんが行った方法は、それをFinderに対して設定することで、Finder から文字描画を行うときに参照される値を違うものに変えているのでしょう。

また、こういった設定にはFinderなどのアプリケーションが設定値を直接処理しているのではなくて、アプリケーションが使用するシステムの機能が参照するものもあるので、設定可能な全てを調べるには開発者向けのドキュメント(システムAPIの一覧など)を一通り目を通す必要があると思います。


ちなみに default コマンドの使用方法は「man defaults」で表示されます。(コマンドの使い方であって、どんな値があるかではありません)

2015/05/20 05:59 matu_home への返信

defaults の隠しキーについては、一般に公開された公式文書はないので、アプリケーションやフレームワークのバイナリを探るしかないです。


手っ取り早く候補を探すだけなら、strings(1) を使えばよいです。但し、キーの候補となるもの以外もたくさん出力されますし、又、圧縮されたり暗号化されたバイナリは対象外となります。


例えば、下記のシェルスクリプトはシステムのフレームワークのバイナリ内にある ^NS.*Font.* の正規表現にマッチする文字列(長さが 5 文字以上 100 文字以下のもの)を探して、デスクトップの strings_NS*Font*.txt というファイルに出力します。



#!/bin/bash q='^NS.*Font.*' { ff=( /System/Library/Frameworks/*.framework/Versions/Current/* /System/Library/Frameworks/*/Frameworks/*/Versions/Current/* /System/Library/PrivateFrameworks/*.framework/Versions/Current/* /System/Library/PrivateFrameworks/*/Frameworks/*/Versions/Current/* ) for f in "${ff[@]}" do r=$( strings "$f" 2>/dev/null | grep -Ei "$q" | grep -E '^[a-zA-Z0-9_.-<>/]{5,100}$' | sort | uniq ) [[ -z $r ]] && continue echo "$f" echo "$r" echo done } > ~/desktop/strings_NS\*Font\*.txt





又、下記のシェルスクリプトは、Finder.app のパッケージ内のファイルにある NS で始まる文字列(長さが 5 文字以上 100 文字以下のもの)を列挙します。



#!/bin/bash q='(^|>)NS.*' { ff=( /System/Library/CoreServices/Finder.app/Contents/*{,/*{,/*}} ) for f in "${ff[@]}" do r=$( strings "$f" 2>/dev/null | grep -Ei "$q" | grep -E '^[a-zA-Z0-9_.-<>/]{5,100}$' | sort | uniq ) [[ -z $r ]] && continue echo "$f" echo "$r" echo done } > ~/desktop/strings_Finder_NS\*.txt





この例に見るように、NSSystemFont は AppKit.framework の中にありますが、Finder.app の中にはありません。Finder が AppKit を使うときに、間接的に参照しているということでしょう。


以上、OS X 10.6.8 での話しです。10.7 以降のことは知りません。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

ユーザデフォルト(defaults)で設定できる項目

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。