Finderで隠しファイルを一時的に表示する(キーボードショートカット)

# NEW! 最新のやり方
最新の macOS Shierra 10.12.6 なら特別な設定など不要で <kbd>⌘</kbd>+<kbd>Shift</kbd>+<kbd>.</kbd> だけでOKです！

# 過去に頑張った歴史
Mac のファイルエクスプローラーである Finder。こいつはデフォルトでは隠しファイル（ピリオドで始まるファイル名）を表示してくれません、そしてこの隠しファイルを表示させる手順が案外面倒くさいので、僕が納得する使い勝手になるまで色々試してみた記録です。


## v1: Finder の設定を書き換えて再起動

`Finder` で隠しファイル（dotfiles）を表示する方法をググると山のように出てくる方法があります。それは `defaults` というコマンドで設定を書き換えてFinder再起動するっていう方法です。

```bash:
## 隠しファイルON
defaults write com.apple.finder AppleShowAllFiles true && killall Finder

## 隠しファイルOFF
defaults write com.apple.finder AppleShowAllFiles false && killall Finder
```

けど、実際やってみれば分かるけど隠しファイルの常時表示って糞うざいから、普段は隠しておいて必要なときにだけもっと簡単に切り替えられるようにしたい。

## v2: Finder の設定を書き換えて再起動（トグル版）

先のコマンドを使い分けるのも面倒なのでとりあえず表示非表示をトグルするコマンドにしておこう。

```bash:
if defaults read com.apple.finder AppleShowAllFiles | grep -iqE '^(1|on|true|yes)$'; then
  defaults write com.apple.finder AppleShowAllFiles false && killall Finder
else
  defaults write com.apple.finder AppleShowAllFiles true && killall Finder
fi
```

コマンド選択を考える手間がなくなったからほんの少しだけ楽になるけど、結局のところGUIアプリである Finder を触ってる最中にわざわざターミナルに移動してコマンド実行するのが面倒くさいという点は改善されていない。


## v3: BTT でキーボードショートカットを作って切り替えられるようにする
手間を更に簡単にするために [BetterTouchTools](https://www.boastr.net/) を使って以下のようなキーボードショートカットの設定を追加しておくことにする。

- `Finder` 用のキーボードショートカットを追加
- `Shortcut` に `⇧⌘.` (`shift + command + .`) を入力
- `Trigger Predefined Action` で `Execute Terminal Command` を選択
- 出てきたダイアログに v2 のトグルスクリプトをコピペしてSave

これで Finder にフォーカスがあるときに `Shift+Cmd+.` を入力するだけでドットファイルの表示非表示切り替えが出来るようになる。設定のスクショは↓こんな感じだ。

![スクリーンショット 2016-07-15 15.51.19.png](https://qiita-image-store.s3.amazonaws.com/0/18726/bbb2eddf-f979-d062-a947-cc0f8a7ebfe6.png)

うん、大分楽になった。

でも Finder が再起動してしまう以上、どうしてもその時点で一度ウィンドウフォーカスを失ってしまうので、最期に一度 `Cmd+Tab` とかで Finder までフォーカスを戻してやらなきゃいけないのがまだ不便だ。

## v4: Finderの設定変更＆再起動後にウィンドウフォーカスも元に戻す

Finder にウィンドウフォーカスを強制的に当てるとか、昔は `AppleScript` とか使って頑張ってたけどあの言語嫌いなのよね。てことで今時ぽく `Swift` で書いてみよう。
あとここまでの流れ的に、これからスクリプトファイル作って〜とかやるのは面倒くさいのでswiftコマンドの標準入力にコードぶち込んでコピペで使える形にしておこう。

てことで出来たのが↓これ。このコードで v3 の手順で設定したコード部分を置き換えればOK。（ちなみに XCode 入ってないと swift コマンド使えないと思うので無い人は入れといてください）

```bash:
# toggle Finder setting
if defaults read com.apple.finder AppleShowAllFiles | grep -iqE '^(1|on|true|yes)$'; then
  defaults write com.apple.finder AppleShowAllFiles false
else
  defaults write com.apple.finder AppleShowAllFiles true
fi

# restart Finder
killall Finder

# wait Finder launching (Finderの再起動完了前にアクティベートを実行されても困るのでチョット待つ)
sleep 1

# activate Finder
swift - <<\SWIFT
import AppKit
let finderId = "com.apple.finder"
let finderApps = NSRunningApplication.runningApplicationsWithBundleIdentifier(finderId)
finderApps.forEach {
  $0.unhide()
  $0.activateWithOptions(NSApplicationActivationOptions.ActivateIgnoringOtherApps)
}
SWIFT
```

では `Cmd+Shift+.` を　入力して動作確認してみよう。うん、大分いい感じになった！

Finder がいったん終了しちゃうのと、再起動からフォーカスの再取得までにチョット間があるのが玉に瑕だが、まぁ許容範囲な使い勝手にはなっただろう。一応満足した。


## ファイル選択ダイアログへの対応

上記までで、Finder 上での隠しファイル表示切り替え簡単化問題は無事解決した。

でも、他アプリ（例えばブラウザのファイルアップロードとか）でモーダルダイアログとして Finder が出てくることもあるよね？
この場合、そもそもアプリ名も Finder じゃないから当然 Finder 用の設定変更は効いてくれないんだよね…、なので隠しファイル表示は結局出来ないし、どうすりゃいいんだ？
隠しファイルの表示を諦めて `Cmd+Shift+g` で移動先パスの手入力とかはもうやだよ！？

ご安心下さい。
実はそもそもファイル選択ダイアログとして出てきた Finder では `Cmd+Shift+.` で隠しファイルの表示トグルが出来る機能が標準装備されてるんです！
ΩΩΩ＜な、なんだってー!?

ほら、↓こんな感じでいい感じに切り替えが出来てます。 ドットファイルが出たり消えたりしてる時、僕は `Cmd+Shift+.` を入力してます。

![23b413c426a42bdc9719c7c94e7c7511.gif](https://qiita-image-store.s3.amazonaws.com/0/18726/18a7b6c9-6f72-be9b-63be-36851381e328.gif)

上述した v3, v4 の設定でショートカットを決めるときに僕が迷いなく `Cmd+Shift+.` にコード実行を割り当てたのはこれに合わせる為だったんです。
そのおかげでどの Finder でも `Cmd+Shift+.` で隠しファイルの表示切替が出来るようになりました。


## Apple 馬鹿なの？
っていうかさ…、なんっでダイアログのときはこのトグル機能があるのに、素の Finder には無いんだよ！！！？そこがまずオカシイだろ！

僕はむしろ何故かダイアログ時の動作を先に知ってて、たまたまさっき素の Finder で使おうとしたときに「あれー何で効かないんだろ？」て思ってググッたって順番だったから、そもそもキーボードショートカットで出来るって情報がまず殆ど出てこなくて、設定を書き換えて再起動するダサいやり方ばかりが出てくるわけだ。何で皆こんな面倒くさいことやってるの？って一周回って悩んだ後に、ようやくあのトグル機能がダイアログ限定だったことに気がついて、しょうがないから上述の v1~v4 の順番に格闘したっていうのがこのエントリを書く前の本当の流れです。

んで、最初はこんな誰でも知ってそうなキーボードショートカットネタなんて書くつもりは無かったんだが、このショートカットについての情報が全然出回ってないようなので、しゃねー記事書くか…。とこれを書いた次第です。

ていうかもう一度いうけどさ、Apple馬鹿だろ？ むしろ次のOSXで素のFinderでこの機能をつけてくれよ。マジ意味分からん。