2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

defaults command-line の実行方法の調査

Last updated at Posted at 2018-11-18

概要

macOSのdefaultsコマンドはwriteでプリファレンスを変更するとき、各引数に入れるべき値をどのように見つければいいのかを調査した。つまりは設定変更の汎用的な調査方法自体を調査したってこと。

結論

defaults write domain key 'value'で値を変える。
$HOME/Library/Preferencesにある<application bundle identifier>.plistから変更したいdomainを推測して見つける。
defaults read domainで変更したいkeyを推測して見つける。
valueについては各keyがどのように値の範囲や単位を定義しているのかはわからなかった。

調査履歴

defaults write の引数

UserDefaultsとはアプリに存在するユーザ毎に設定できるインターフェースである。UserDefaultsは defaults というコマンドラインユーティリティを使用してそのプリファレンスを設定することができる。ということは、公式ドキュメントを見て理解できたけど、defaultsでプリファレンスを設定するにはどのような値を入れればよいのかがわからなかったのでman defaultsを見た。サブコマンドの説明に write domain key 'value' とある。つまりはdomainkeyと取りうるvalueがわからなければ設定することができない。

引数 domain

まずはdomainから調べてみる。引き続きmanの内容を見ると以下のように書いてある。

User defaults belong to domains, which typically correspond to individual applications.

つまりdomainとはそれぞれのアプリケーションやシステムサービスが固有に持っているものらしい。公式ドキュメント参照リンク(For more details, see Preferences and Settings Programming Guide.)(古いって注意出てるけど公式が参照してるから多分大丈夫)を見てみると、 Application Domain の節に以下のように書いてある。

Because this domain is app-specific, the contents of the domain are tied to your app’s bundle identifier.

どうやらdomainにはいろいろ種類があり、その中で Application Domain と呼ばれるdomainapplication bundle identifierに紐づくらしい。そのまま続きを読んでくと、このdomain (Application Domain) のプリファレンスは$HOME/Library/Preferenceディレクトリに<bundle identifier>.plistというファイル名で格納されているらしい。つまりアプリのUserDeafultsにおいてdefaultsコマンドのdomainに入れる値はapplication bundle identifierであり、application bundle identifier$HOME/Library/Preference配下にあるファイル名から推測可能ということだ。
まあここまでわかればどのアプリがどのbundle identifierを使用しているのかは名前から自分で推測したりして調べようかなと思う。

引数 key

次はkeyvalueだ。これはアプリごとに調べなきゃならないということになりそうだ。先程domainに何を入れればいいのかわかったのでmanに書かれてた読み出し用のコマンドdefaults readが使えそう。readした内容から自分が変えたい設定の英語とかを検索すればkeyは見つかるかもしれない。

read domain Prints all of the user's defaults for domain to standard output.

ということで試しに System Preferences > Keyboard > Keyboard > Key Repeat をいじってみようと思う。
まずはこの設定がありそうなワードでgrepしてみる。

$ ls ~/Library/Preferences | grep system
com.apple.systempreferences.plist
com.apple.systemsound.plist
com.apple.systemuiserver.plist
$

お、引っかかった。com.apple.systempreferncesが怪しいので試しにdefaults readして検索してみる。

$ defaults read com.apple.systempreferences | grep repeat
$

うーんないねえ。じゃあ今度はkeyboardで探してみる。

$ ls ~/Library/Preferences | grep keyboard
com.apple.keyboardservicesd.plist
com.apple.textInput.keyboardServices.textReplacement.plist
$ 

コレジャナイ感が漂うけど一応調べる。

$ defaults read com.apple.keyboardservicesd | grep repeat
$ 
$ defaults read com.apple.textInput.keyboardServices.textReplacement | grep repeat
$ 

うーんない。System Preferences.appはシステムよりだしちょっと特殊なのかもしれない。

再度、About Preferences and Settingsを上から下まで読んでみるとdomainは Application Domain の他にも Argument Domain や Global Domain などがあるらしい。 Argument Domain はアプリ実行時の引数を対象としてるから今回探してるものとは違うのでスルーして、問題は Global Domain だ。こいつはすべてのアプリにまたがるプリファレンスのdomainらしい。

たしかにまあ Key Repeat はアプリにまたがってるかもとか思いながらダメ元で Global Domain にかけてみる。先程のドキュメントの Viewing Preferences Using the Defaults Tool の節に従い Global Domain のプリファレンスを調べてみる。

$ defaults read NSGlobalDomain | grep repeat
$

なかったw しかしここで諦める私ではない。検索方法が間違っているのかもしれないという疑念をもとに、 [key, Key, repeat, Repeat] で今まで調べた場所を再度調べてみる。そして発見。

$ defaults read NSGlobalDomain | grep Key
    AKLastEmailListRequestDateKey = "2018-10-12 14:15:13 +0000";
    AppleKeyboardUIMode = 1;
    InitialKeyRepeat = 15;
    KeyRepeat = 1;
    NSAllowsBaseWritingDirectionKeyBindings = 0;
    NSNavPanelFileLastListModeForOpenModeKey = 3;
    NSNavPanelFileLastListModeForSaveModeKey = 1;
    NSNavPanelSidebarKeyForOpen =     (
    NSNavPanelSidebarKeyForSave =     (
    NSUserKeyEquivalents =     {
$

引数 value

じゃあ、defaults write NSGlobalDomain KeyRepeatまではわかった。じゃあこの今のvalue(1)は何を表しているのか。それがわからなければ変えるべき値はわからない。

defaultsvalueはどうすればわかるのか。一応、man曰く型はdefaults read-type domain keyでわかるらしい。

$ defaults read-type NSGlobalDomain KeyRepeat
Type is integer
$

おう、知ってたよ。取りうる範囲とかどういう単位なのかとかが知りたいんだよね。

まあ調べればわかるんだけどこのコメントと同じ気持ちになる。 どこで知ったのそれ?ってやつ
まあ調べれば信用できないけどわかるし、大抵boolとかで範囲とか単位はないから大丈夫なんだけど。

参考ソース

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?