MacOS　PlistBuddyコマンドを使ってplistファイルを自由に編集しよう

# PlistBuddyコマンド

Macにデフォルトで入っているplistに対して様々な処理を行えるコマンドです。

plistに関しては、plutilコマンドがありますが、データが階層になっているファイルはplutilコマンドでは編集できません。

詳細についてはhelpコマンドで中身を見てもらうとして、よく使うplistファイルの編集コマンドのみ説明します。

```terminal
$ /usr/libexec/PlistBuddy   
Usage: PlistBuddy [-cxh] <file.plist>
    -c "<command>" execute command, otherwise run in interactive mode
    -x output will be in the form of an xml plist where appropriate
    -h print the complete help info, with command guide

$ /usr/libexec/PlistBuddy -h    
Command Format:
    Help - Prints this information
    Exit - Exits the program, changes are not saved to the file
    Save - Saves the current changes to the file
    Revert - Reloads the last saved version of the file
    Clear [<Type>] - Clears out all existing entries, and creates root of Type
    Print [<Entry>] - Prints value of Entry.  Otherwise, prints file
    Set <Entry> <Value> - Sets the value at Entry to Value
    Add <Entry> <Type> [<Value>] - Adds Entry to the plist, with value Value
    Copy <EntrySrc> <EntryDst> - Copies the EntrySrc property to EntryDst
    Delete <Entry> - Deletes Entry from the plist
    Merge <file.plist> [<Entry>] - Adds the contents of file.plist to Entry
    Import <Entry> <file> - Creates or sets Entry the contents of file

Entry Format:
    Entries consist of property key names delimited by colons.  Array items
    are specified by a zero-based integer index.  Examples:
        :CFBundleShortVersionString
        :CFBundleDocumentTypes:2:CFBundleTypeExtensions

Types:
    string
    array
    dict
    bool
    real
    integer
    date
    data

Examples:
    Set :CFBundleIdentifier com.apple.plistbuddy
        Sets the CFBundleIdentifier property to com.apple.plistbuddy
    Add :CFBundleGetInfoString string "App version 1.0.1"
        Adds the CFBundleGetInfoString property to the plist
    Add :CFBundleDocumentTypes: dict
        Adds a new item of type dict to the CFBundleDocumentTypes array
    Add :CFBundleDocumentTypes:0 dict
        Adds the new item to the beginning of the array
    Delete :CFBundleDocumentTypes:0 dict
        Deletes the FIRST item in the array
    Delete :CFBundleDocumentTypes
        Deletes the ENTIRE CFBundleDocumentTypes array


```

## 表示

### syntax

```terminal
$ /usr/libexec/PlistBuddy -c "print" <表示したいplistファイルのパス>
```

### xml形式での表示

xml形式で表示したい場合は xオプションを付与します。

```terminal
$ /usr/libexec/PlistBuddy -x -c "print" <表示したいplistファイルのパス>
```

### 実例

```terminal
$ /usr/libexec/PlistBuddy -c "print" ~/Library/Preferences/com.apple.speech.voice.prefs.plist
Dict {
    LastClientIDFromSpeakingHotkey = com.google.Chrome
    SelectedVoiceID = 369275107
    VoiceRateDataArray = Array {
        Array {
            1886745202
            369275107
            720
        }
        Array {
            1886745202
            369275117
            720
        }
    }
}
```

### 表示の範囲指定

配列名を指定することでより範囲を限定して表示することもできます。

#### syntax

```terminal
$ /usr/libexec/PlistBuddy -c "print [配列名]:[配列のindex]" <plistファイルのパス>
```

#### 実例

```terminal
$ /usr/libexec/PlistBuddy -c "print VoiceRateDataArray:0" ~/Library/Preferences/com.apple.speech.voice.prefs.plist
Array {
    1886745202
    369275107
    720
}
```

## 編集

#### syntax

場所を指定して、スペースを開けて変えたい値を入れます。

```terminal
$ /usr/libexec/PlistBuddy -c "set [配列名]:[配列のindex]:[配列のindex]... [値]" ~/Library/Preferences/com.apple.speech.voice.prefs.plist
```

#### 実例

```terminal
$ /usr/libexec/PlistBuddy -c "set VoiceRateDataArray:0:2 360" ~/Library/Preferences/com.apple.speech.voice.prefs.plist
~
$ /usr/libexec/PlistBuddy -c "print VoiceRateDataArray:0" ~/Library/Preferences/com.apple.speech.voice.prefs.plist
Array {
    1886745202
    369275107
    360
}
```

変更後は再起動するか、以下のコマンドを実施して、設定を反映させてください。

```
killall com.apple.speech.speechsynthesisd
killall SpeechSynthesisServer
```