plistをコマンドラインから作成・編集する[PlistBuddy]


# Env

- OS X ElCapitan 10.11.6

# 使用するツール

defaultsとかplutilとかPlistBuddyなど、用意されているツールにもplistをいじれるものは複数あるが、それぞれの使用する用途は以下のような感じ（だと思っている）

- defaults: 各設定ファイル(Library/Preferences/*.plist)を作成・編集する
- plutil: plistの文法チェック・xml,jsonへのコンバート・閲覧(編集も一応出来るけど、arrayやdictの中の値の編集ができない？)
- PlistBuddy: plistの作成・編集・閲覧

ちなみにどっかの記事でPlistBuddyはElCapitanから使用できない、と記載されてあったが、特に問題なく使用出来るみたい

# PlistBuddy

## 作成

特に気にする必要はなし

存在しないファイルを編集しようとすると、
以下のような文言が出てきて自動でplistが作成される

`File Doesn't Exist, Will Create: hoge.plist`

## 編集

基本的には以下のような文法でコマンドを叩く

```
# ワンライン
/usr/libexec/PlistBuddy -c "コマンドアクション" ファイル名

# 対話型
/usr/libexec/PlistBuddy ファイル名
Command: コマンドアクション
```

### よく使うコマンド一覧

| コマンド | 概要 |
|---|---|
|add 名前 タイプ [値]|要素を追加する|
|set 名前 値|要素の値を変更する|
|print [名前]|要素をダンプする|
|delete 名前|要素を削除する|
|copy コピー元 コピー先|要素を複製する|
|save|ファイルを保存する※|
|exit|編集を終了する※|
|help|ヘルプ|
※ 対話型でコマンドを叩く場合のみ

### よく使う値のタイプ一覧

|タイプ|概要|
|---|---|
|string|文字列|
|integer|数値|
|bool|真偽値|
|array|配列|
|dict|連想配列|

### Example

#### 文字列要素を追加する

```
$ /usr/libexec/PlistBuddy hoge.plist
File Doesn't Exist, Will Create: hoge.plist
Command: add str string "fuga"
Command: print
Dict {
    str = fuga
}
```

#### 配列を操作する

複数階層ある要素については`:`で要素名をつなぐ

```
Command: add arr array
Command: add arr:0 string "piyopiyo"
Command: print
Dict {
    str = fuga
    arr = Array {
        piyopiyo
    }
}
Command: add arr:1 string "piyopiyo2"
Command: print
Dict {
    str = fuga
    arr = Array {
        piyopiyo
        piyopiyo2
    }
}
Command: add arr:0 integer 3
Command: print
Dict {
    str = fuga
    arr = Array {
        3
        piyopiyo
        piyopiyo2
    }
}
```

#### 連想配列を操作する

```
Command: add dic dict
Command: add dic:str string "foo"
Command: print
Dict {
    str = fuga
    arr = Array {
        3
        piyopiyo
        piyopiyo2
    }
    dic = Dict {
        str = foo
    }
}
Command: copy arr dic:dic2:arr
Command: print
Dict {
    str = fuga
    arr = Array {
        3
        piyopiyo
        piyopiyo2
    }
    dic = Dict {
        str = foo
        dic2 = Dict {
            arr = Array {
                3
                piyopiyo
                piyopiyo2
            }
        }
    }
}
Command: delete dic:dic2:arr:1
Command: print
Dict {
    str = fuga
    arr = Array {
        3
        piyopiyo
        piyopiyo2
    }
    dic = Dict {
        str = foo
        dic2 = Dict {
            arr = Array {
                3
                piyopiyo2
            }
        }
    }
}
```

#### 保存

対話的なコマンドで編集したファイルは最後にSaveするのを忘れないこと！！！

```
Command: save
```

以上の操作で以下のようなplistが作成される

``` hoge.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>arr</key>
        <array>
                <integer>3</integer>
                <string>piyopiyo</string>
                <string>piyopiyo2</string>
        </array>
        <key>dic</key>
        <dict>
                <key>dic2</key>
                <dict>
                        <key>arr</key>
                        <array>
                                <integer>3</integer>
                                <string>piyopiyo2</string>
                        </array>
                </dict>
                <key>str</key>
                <string>foo</string>
        </dict>
        <key>str</key>
        <string>fuga</string>
</dict>
</plist>
```