OS X を自分色に染める w/ defaults

わけあって新しく環境を設定することになったので備忘録代わりに。
## スクリプタブルであること
新しいMac買ったときって環境作るの面倒臭いですよね。

1. OSの設定
1. 必要なパッケージのインストール
1. 必要なアプリケーションのインストール
1. 各種アプリケーションの設定

やることがたくさんあります。
これを手でやっていると面倒臭いですし、抜け漏れ出ますよね。
まぁ気付き次第ちょこちょこ設定していけばいいんですが、自分色になっていくまで結構不便だったりします。

**だからスクリプト化しようや**

パッケージやアプリケーションのインストールについてはMac-geekなみなさんであればbrew(cask)など使ってうまいことスクリプト化されていると思うので、今回は触れません。
ですので、OSの設定について解説します。各種アプリケーションの設定も実は今回の話でだいたいスクリプト化可能です。

## defaultsコマンド
**読んで** `man defaults`
流石に申し訳ないので解説しますと：
>デフォルトでは、ユーザーがコマンドラインシェルからのMac OS Xユーザのデフォルトを、読み取り、書き込み、および削除することができます。 Mac OS Xのアプリケーションやその他のプログラムは、好みやapplicationsaren'tは（そのようなデフォルトの新規文書のフォント、またはInfopanelの位置として）実行しているときに維持されなければならない他の情報をrecorduserするために、デフォルトのシステムを使用しています。この情報の多くは、アプリケーションのPreferencespanelを介してアクセス可能ですが、それのいくつかは、そのような情報パネルの位置として、ではありません。あなたはデフォルト値を持つthisinformationにアクセスすることができます

とのこと (`man defaults` translated by [Google Translate](https://translate.google.com/))

### 使い方
**読んで** `man defaults`
ざっくり：

+ `defaults read DOMAIN KEY ...`で設定読み込み
+ `defaults write DOMAIN KEY ...`で設定書き込み

です

## 私の設定内容
[こちら](https://github.com/ryof/ryof-env/blob/master/initosx.sh#L117-L186)に添って説明。

### QuickLook
#### QuickLookのテキストを選択可能にする
```sh
defaults write com.apple.finder QLEnableTextSelection -bool true
```

### スクリーンキャプチャ
+ jpgで保存
+ 影付けない
+ `ss~`みたいな名前で保存
+ ssディレクトリに保存

```sh
defaults write com.apple.screencapture type jpg
defaults write com.apple.screencapture “disable-shadow” -bool yes
defaults write com.apple.screencapture name ss
defaults write com.apple.screencapture location ~/ss/
```

### キーボード早め
まぁなんかこの辺はみなさん設定されてるかと思います

```sh
defaults write -g KeyRepeat -int 2
defaults write -g InitialKeyRepeat -int 15
```

### スクロール方向
老人なので従来式じゃないとダメです…

```sh
defaults write -g com.apple.swipescrolldirection -bool false
```

### OSの言語設定
英語にします

```sh
defaults write -g AppleLanguages -array en ja
```

### 辞書の設定
ちょっとマニアック（笑）

+ 国語
+ 和英 / 英和
+ Wikipedia
+ 英類語
+ 英英

を使うように設定します

```sh
defaults write -g com.apple.DictionaryServices -dict-add "DCSActiveDictionaries" '("/Library/Dictionaries/Sanseido Super Daijirin.dictionary", "/Library/Dictionaries/Sanseido The WISDOM English-Japanese Japanese-English Dictionary.dictionary", "/System/Library/Frameworks/CoreServices.framework/Frameworks/DictionaryServices.framework/Resources/Wikipedia.wikipediadictionary", "/Library/Dictionaries/Oxford Thesaurus of English.dictionary", "/Library/Dictionaries/Oxford Dictionary of English.dictionary")'
```

DCSActiveDictionariesに辞書のパスを配列で渡せばいいっぽい。

### Spotlight呼び出しショートカット
Spotlightを`option + command + space`で呼び出せるようにします。

```sh
defaults write com.apple.symbolichotkeys AppleSymbolicHotKeys -dict-add 61 "<dict><key>enabled</key><false/></dict>"
defaults write com.apple.symbolichotkeys AppleSymbolicHotKeys -dict-add 64 "<dict><key>enabled</key><true/><key>value</key><dict><key>parameters</key><array><integer>32</integer><integer>49</integer><integer>1572864</integer></array><key>type</key><string>standard</string></dict></dict>"
```

`次の入力ソースを選択`とショートカットが被るので一行目で無効に。
二行目でSpotlightの設定をしています。
`61`とか`64`とかが設定項目のキーです。[こちら](http://apple.stackexchange.com/questions/91679/is-there-a-way-to-set-an-application-shortcut-in-the-keyboard-preference-pane-vi)に詳しい。

`parameters`に3つ数字を渡すが、1つめと2つめはよく分かってないのでデフォで入ってる値をそのままにした。3つめでキーを指定している。
optionが524288でcommandが1048576なので足して1572864。

### CapsLockをControlに割り当てる
CapsLockって使わなくないですか…？

```sh
keyboardid=$(ioreg -n IOHIDKeyboard -r | grep -E 'VendorID"|ProductID' | awk '{ print $4 }' | paste -s -d'-\n' -)'-0'
defaults -currentHost write -g com.apple.keyboard.modifiermapping.${keyboardid} -array '<dict><key>HIDKeyboardModifierMappingDst</key></dict><integer>2</integer> <key>HIDKeyboardModifierMappingSrc</key><key>0</key>'
```
`keyboardid`の取り方は[こちら](http://baqamore.hatenablog.com/entry/2013/09/03/013013)に習った。

### Dock
+ 左に配置
+ 自動で隠す
+ 起動中のアプリだけ表示
+ 小さめの表示

```sh
defaults write com.apple.dock orientation left
defaults write com.apple.dock autohide -bool true
defaults write com.apple.dock persistent-apps -array
defaults write com.apple.dock tilesize -int 25
```

### Finder
+ デスクトップにアイコンを表示しない
+ 新規ウィンドウはホームディレクトリで開く
+ 拡張子の変更を警告しない
+ 検索をデフォルトでカレントディレクトリ以下にする
+ カラム表示にする
+ サイドバー表示の諸々...
+ 拡張子はすべて表示

```sh
defaults write com.apple.finder CreateDesktop -bool false
defaults write com.apple.finder NewWindowTarget -string "PfLo"
defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}"
defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
defaults write com.apple.finder FXPreferredViewStyle -string "clmv"
defaults write com.apple.finder ShowRecentTags -bool false
defaults write com.apple.finder SidebarDevicesSectionDisclosedState -bool true
defaults write com.apple.finder SidebarPlacesSectionDisclosedState -bool true
defaults write com.apple.finderSidebarSharedSectionDisclosedState -bool true
defaults write -g AppleShowAllExtensions -bool true
```

### ほか
#### ネットワークディスク上に`.DS_Store`を作らない（重要）
```sh
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
```
#### バッテリー残量のパーセンテージ表示
```sh
defaults write com.apple.menuextra.battery ShowPercent -string "YES"
```
#### Bluetooth切っとく
```sh
sudo defaults write /Library/Preferences/com.apple.Bluetooth ControllerPowerState -int 0
```

### 設定を反映する
```sh
killall Dock
killall SystemUIServer
killall Finder
```

#### けど
反映されないものも多いので`You better reboot your machine..🤔 `

## 設定項目の探し方
Dictionary.appを例にとって書きたいところですが **[この余白はそれを書くには狭すぎる。](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A7%E3%83%AB%E3%83%9E%E3%83%BC%E3%81%AE%E6%9C%80%E7%B5%82%E5%AE%9A%E7%90%86)** （後日追記予定）

雑に説明すると

```sh
defaults read > before
# ここで設定変更
defaults read > after
diff before after
```
とかして探してくイメージです。

## 最後に
**enjoy scripting your mac!**

## 参考
[こちら](https://github.com/mathiasbynens/dotfiles/blob/master/.osx)とそれを解説した[こちら](http://baqamore.hatenablog.com/entry/2013/07/31/222438)（全8回） <- **相当真似ました。** ありがとうございます。

その他にStackoverflowの先人たち！

## 免責
**記載スクリプトの実行により被った一切の損害等について当方では責任を負いかねます。**

ぶっちゃけ理解が足りていない部分も相当にありますので実行についてはすべて自己責任でお願い致します。

環境設定の項目が開けなくなったり、アプリケーションがNot Respondingになったりします。（実際試している途中何度かなりました）

`defaults read`と`defaults write`を駆使してなんとか元には戻せますが、遊ぶ際には無事な状態のバックアップを取っておくことを忘れないで下さいね！