Safariに限らずCocoaアプリケーションではdefaults(注意:複数形だ)コマンドを使って初期設定を編集できる。その中にはアプリケーションの環境設定には現れない「隠し設定」的なものも多い。Terminalを使っての作業になる。基本的な使い方は
defaults write "com.apple.Safari" key value
defaults read "com.apple.Safari" key
defaults delete "com.apple.Safari" key
などである。man defaultsと打ち込むと詳しい使い方が分かる。valueの部分は文字列として認識されるが「-bool true」のような書き方をすると真偽値として書き込むことが出来る。-integerだと数字。これらの型はわざわざ指定せずに文字列として書き込んでも基本的には大丈夫だ。さらに、
defaults write "com.apple.Safari" RecentSearchStrings '(aaa,bbb,ccc)'
などとすれば配列を書き込むことも出来たりするが、そこまでするにはProperty List Editorを使った方がよいかもしれない。
具体的にSafariで設定できる項目を挙げてみる。
真偽値と書いてある個所には「-bool true」「-bool false」「YES」「NO」のいずれかを入れる。
Debugメニュー表示
defaults write "com.apple.Safari" IncludeDebugMenu 真偽値
IEやMozillaからの自動インポート済み判定
defaults write "com.apple.Safari" IEFavoritesWereImported 真偽値
defaults write "com.apple.Safari" NetscapeAndMozillaFavoritesWereImported 真偽値
履歴の数制限
defaults write "com.apple.Safari" WebKitHistoryItemLimit -integer 数字
履歴メニューアイテムの幅制限
defaults write "com.apple.Safari" URLMenuItemTitleMaxWidth -integer 数字
フォントに関するkeyいろいろ。
WebKitStandardFont
WebKitFixedFont
WebKitSerifFont
WebKitSansSerifFont
WebKitCursiveFont
WebKitFantasyFont
WebKitMinimumFontSize
WebKitDefaultFontSize
WebKitDefaultFixedFontSize
gifアニメを制限出来るようだが良く分からん。
WebKitAllowAnimatedImagesPreferenceKey
WebKitAllowAnimatedImageLoopingPreferenceKey
他にこんなのもあるみたいだが試してない。
WebKitInitialTimedLayoutDelay
WebKitInitialTimedLayoutSize
WebKitResourceTimedLayoutDelay
WebKitObjectCacheSizePreferenceKey
WebKitInitialTimedLayoutEnabled
WebKitResourceTimedLayoutEnabled
ページキャッシュに関する設定下記参照。
WebKitPageCacheSizePreferenceKey
WebKitBackForwardCacheExpirationIntervalKey
いったん設定したものを元に戻したい場合はデフォルトの値を書き込むか
defaults delete "com.apple.Safari" key
で消す。デフォルトの値が分からないこともあるだろうからdeleteする方が良いと思う。
ただしkeyを書き忘れると初期設定ファイルごと消えてしまうので要注意!
いい加減にしか調べてないのでこの情報は間違ってる可能性あり。ご注意ください。
この情報はSafari1.0(v85)での現状です。次期バージョンでは解決される見込み(らしい)。
別のページに行ってから戻った状態のページからフォーム送信すると「???」になっちゃう問題。
まずキャッシュには3段階くらいあって、ディスクに保存されてるファイルとしてのキャッシュ、それがメモリ上に読み込まれている状態、ページキャッシュ、とあって後者に行くほど速い。ページキャッシュ以外は生のhtmlで、ページキャッシュはデコード、パースされている状態。と、正確にそうなっているかは自信がない。かなりあやしい。が、だいたいそんな感じと思う。
で、問題なのはページキャッシュだ。
ページのエンコーディングはKHTMLPartとDecoderが保持しているみたいだが、ページキャッシュ状態だとどちらの値も正しくなくなる。KHTMLPartは使い回すので、ページが変わるごとにエンコーディングを白紙にしている。Decoderは最初に読み込まれる時にだけ生成され、ページキャッシュ状態だとそもそも存在しない。ページキャッシュはKHTMLPageCacheにストアされるみたい。キャッシュにストア、レストアするときにエンコーディングも出し入れすればいいのだろうけど、上手く追えなかった。このページキャッシュ機能はWebKit.frameworkにも関わってるみたいだし。
ちなみに現状のSafariでこの文字化けを防ぐにはDebugメニューの「Use Back/Foward Cache」をオフにすれば大丈夫なようだ。ただしこれをやるとページ表示のたびにDecoderが生成されデコード、パースを行うので、Safariの魅力のひとつである驚異的なページ移動速度が若干失われる。またこの設定はひとつのViewにだけ有効で、新たにウィンドウやTabを開くと、そっちはページキャッシュ有効状態なので注意。
すべてのウィンドウとTabで最初からページキャッシュ無効にするには、Terminalで
defaults write "com.apple.Safari" WebKitPageCacheSizePreferenceKey -integer 0
と打ち込めばいい。元に戻すには、
defaults delete "com.apple.Safari" WebKitPageCacheSizePreferenceKey
だ。元に戻す方法を忘れないようにしとこう。
サードパーティのユーティリティでも可能かもしれない。
ちなみにDebugメニューを表示させるには、サードパーティのユーティリティを使うか、Terminalで
defaults write "com.apple.Safari" IncludeDebugMenu -bool true
と打ち込む。これを再び無効にするにはもちろん
defaults delete "com.apple.Safari" IncludeDebugMenu
WebKitBackForwardCacheExpirationIntervalKeyという隠し設定があるようだ。
defaults write "com.apple.Safari" WebKitBackForwardCacheExpirationIntervalKey 10
とかすれば10秒たったらページキャッシュは破棄される模様。フォームを送信するページとそうでないページで使い分けが難しいのであまり意味はないかな……。デフォルトの値はおそらく1800秒となっている。
以下の方法は最初のベータ版が出た頃に試した情報です。現在は専用のフリーウェアが出ていると思います。
まず最初にFavorites.htmlをバックアップしておく。
そして、既に一回でもSafariを起動しているなら
~/Library/Safari/ と ~/Library/Preferences/com.apple.Safari.plist
が既にあるなら名前を変えておく。
あるいは、
Safariから、(文字化けした)読み込み済みのIEのブックマーク「Imported IE Favorites」
を消去して終了し、Terminalで
defaults write "com.apple.Safari" IEFavoritesWereImported -bool false
と打ち込む(こっちの方がいいかな)。
#ここから
$path="/Users/ユーザー名/Library/Preferences/Explorer/";
$f1="Favorites.html"; $f2="Favorites.enc.html";
open(IN,"<$path$f1"); open(OUT,">$path$f2");
while ($cnt=<IN>){
$cnt=~s/([\x7B-\xFF])/'%'.unpack("H2",$1)/ego;
print OUT $cnt;
}
close(OUT); close(IN);
#ここまで
以上をie2safari1.plなどとファイルに保存。
(コピペだとバックスラッシュ(¥or\)が変になるときがあり気なので確認すること)
Terminalで「perl /パス/ie2safari1.pl」と実行。Favorites.enc.htmlが出来るので
Favorites.htmlにリネーム(元のFavorites.htmlはFavorites.org.htmlなどにしておく)。
Safariを起動すると自動的にFavorites.htmlを読み込むので、そしたら終了。
#ここから
$path="/Users/ユーザー名/Library/Safari/";
$f1="Bookmarks.plist"; $f2="Bookmarks.dec.plist";
open(IN,"<$path$f1"); open(OUT,">$path$f2");
while ($cnt=<IN>){
$cnt =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/ego;
print OUT $cnt;
}
close(OUT); close(IN);
#ここまで
以上をie2safari2.plなどとファイルに保存。
terminalで「perl /パス/ie2safari2.pl」と実行。Bookmarks.dec.plistが出来るので
Bookmarks.plistにリネーム(元のBookmarks.plistはBookmarks.org.plistなどにしておく)。
このファイルは文字化けしていないMacOS Japanese(Shift-JIS)のテキストになっている筈なので、
miなど文字コード変換が出来るエディタやTEC
OSAXなどを使ってUTF-8に変換する。
問題なければFavorites.htmlをバックアップしていたものに戻し、
不要な方のBookmarks.plistを捨てる。
いずれのperlスクリプトも「ユーザー名」のとこ自分のを入れる。
Terminalでファイルパスを入力するには、ファイルをFinderからTerminalの
ウィンドウにドロップすれば入力されるので楽。
で、これ何をやってるかというと、2バイト文字をエスケープしてSafariに読み込ませ、
その後でデコードしているわけです。
うまく行かない人は元のFavorites.htmlの文字コードがShift-JISになっているか確かめませう
(Favorites.htmlを最初にJISに変換してからやる方の方法を試した人は特に)。