【Xcode】ショートカットガチ勢が普段よく使うショートカットを紹介する

こんにちは！作業効率厨、[むらお](https://twitter.com/ymurao2)です！
爆速コーディングのために、ショートカットガチ勢（自称）である自分が、よく使うショートカットや開発スピードアップテクニック？を紹介します


## 登場する記号たち
| 記号 |  |
| -- | -- |
| ⌘ | Command |
| ⇧ | Shift |
| ⌃ | Control |
| ⌥ | Option |
| ↩ | Return |
| ⌫ | BackSpace |
| ↑↓←→ | 矢印 |

## Tier
独断と偏見でつけていきます
| Tier | 説明 |
| -- | -- |
| S | エース・これなしではやっていけない |
| A+ | 最強ではないものの非常によく使う |
| A | 結構使う |
| A- | 場所を選ぶが、結構使う |
| B | 便利 |
| C | たまに使う |
| D | あんまり使わない |


# Xcode編
## Build系
| Tier | ショートカット | アクション |
| -- | -- | -- |
| S | ⌘ + R | 実行 |
| S | ⌘ + B | ビルド |
| A | ⌘ + ⇧ + K | クリーンビルド |
| B | ⌘ + . | 停止 |
| S | ⌘ + U | 全体テスト |
| A+ | ⌘ + ⌃ + R | 前回のビルド情報で実行（XcodeとSimulatorを接続したい時によく使う）|

## Editor系
|Tier | ショートカット | アクション |
| -- | -- | -- |
| A+ | ⌃ + I | インデント修正 |
| B | ⌘ + ⌥ + ↩ | プレビュー表示 |
| B | ⌘ +  ↩ | プレビュー非表示 |
| D | ⌘ + [ | インデントを左にずらす |
| D | ⌘ + ] | インデントを右にずらす |
| B | ⌘ + ⌥ + ← | コードを折りたたむ |
| B | ⌘ + ⌥ + → | 折りたたみをやめる |
| A | ⌘ + / | コメントアウト |
| A+ | ⌘ + ⌥ + [ | カーソル行を上に移動 |
| A+ | ⌘ + ⌥ + ] | カーソル行を下に移動 |
| C | ⌘ + + | フォントサイズを大きく |
| C | ⌘ + - | フォントサイズを小さく |
| B | ⌘ + ⇧ + ⌃ + A | 編集履歴を表示 |

<details><summary>軽くデモ</summary>

インデント修正
![CleanShot 2023-12-28 at 21.23.46.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/89ea17d9-2911-028d-4db5-fbffcc4b8384.gif)

プレビュー表示/非表示![CleanShot 2023-12-28 at 21.27.52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/4336ae57-8d7e-f9d9-6161-1377177649a4.gif)

インデントを左/右にずらす
![CleanShot 2023-12-28 at 21.28.36.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/f40b4191-536a-c640-bb0b-4ab48ff02f79.gif)

コードを折りたたむ/折りたたみをやめる
![CleanShot 2023-12-28 at 21.29.09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/73e5b623-fae9-4a01-c4a1-6f46d0a1abb8.gif)

カーソル行を上/下に移動
![CleanShot 2023-12-28 at 21.29.47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/e67bbbff-3c73-e614-9b2d-f339c8c33fd9.gif)

</details>


## Navigate系
| Tier | ショートカット | アクション |
| -- | -- | -- |
| S | ⌘ + ⇧ + J | 開いているファイルの場所を表示 |
| B | ⌘ + J | （分割モードのとき）フォーカスを移動 |
| S | ⇧ + ⌥ + タブクリック | ファイルを別のエディタで開く（分割モードにできる） |
| A- | ⌘ + ⇧ + [ | 左のタブに移動 |
| A- | ⌘ + ⇧ + ] | 右のタブに移動 |
| B | ⌘ + L | 指定の行に移動 |
| S | ⌘ + ⇧ + O | ファイル検索 |

<details><summary>軽くデモ</summary>
 開いているファイルの場所を表示

![CleanShot 2023-12-28 at 21.32.21.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/dcf2ae12-c931-4f83-30c9-2c8b69661e47.gif)


 （分割モードのとき）フォーカスを移動
 ![CleanShot 2023-12-28 at 21.31.39.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/0167646f-4eb0-176b-c57f-aaab03f668e7.gif)

 ファイルを別のエディタで開く（分割モードにできる）![CleanShot 2023-12-28 at 21.32.47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/e05a60c0-09d1-9ecc-29e7-eb45e04ec8eb.gif)

左/右のタブに移動

![CleanShot 2023-12-28 at 21.33.09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/c0765863-394b-35d9-77b4-51976015ceb9.gif)

ファイル検索

![CleanShot 2023-12-28 at 21.34.07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529173/4085e600-de8e-b059-213a-547161c32445.gif)

</details>


## Find系
| Tier | ショートカット | アクション |
| -- | -- | -- |
| S | ⌘ + F | ファイル内検索 |
| S | ⌘ + ⇧ + F | プロジェクト内検索 |
| A- | ⌘ + ⌥ + F（カスタムショートカット） | 置換(Find and Replace) |
| B | ⌘ + ⌃ + E | 一括置換 |
| A- | ⌘ + ⌥ + E | 選択し、置換 |

## 編集系
| Tier | ショートカット | アクション |
| -- | -- | -- |
| S | ⌃ + D | カーソルの右を一つ削除 |
| S | ⌃ + H | カーソルの左を一つ削除 |
| S | ⌃ + K | カーソルの右を全て削除 |
| C | ⌘ + ⌫ | カーソルの左を全て削除 |
| S | ⌘ + Z | Undo |
| S | ⌘ + ⇧ + Z | Redo |
| S | ⌘ + D | カーソル行を複製 |
| S | ⌃ + m | 引数を改行 |

## 選択系
| Tier | ショートカット | アクション |
| -- | -- | -- |
| A- | ⌘ + A | ファイル内全選択 |
| A | ⌘ + ⇧ +  ← | カーソルの左を全て選択 |
| A | ⌘ + ⇧ +  → | カーソルの右を全て選択 |
| A | ⇧ + ⌥ +  ← | カーソルの左をひと単語選択 |
| A | ⌘ + ⇧ +  → | カーソルの左をひと単語選択 |
| A+ | ⌃ + ⇧ +  ↑ | マルチカーソル |
| A+ | ⌃ + ⇧ +  ↓ | マルチカーソル |
| B | ⌃ + ⇧ +  Click | マルチカーソル |
| C | ⌥ +  Drag | マルチカーソル |


## 移動
| Tier | ショートカット | アクション |
| -- | -- | -- |
| S | ⌃ + f | 右に一つ移動 |
| S | ⌃ + b | 左に一つ移動 |
| S | ⌃ + n | 下に一つ移動 |
| S | ⌃ + p | 上に一つ移動 |
| A | ⌥ + ← | 左にひと単語移動 |
| A | ⌥ + → | 右にひと単語移動 |
| S | ⌃ + a | 一番左に移動 |
| S | ⌃ + a から ⌃ + i | 一番左の**文字**に移動 |
| S | ⌃ + e | 一番右に移動 |

## その他
| Tier | ショートカット | アクション |
| -- | -- | -- |
| S | ⌘ + , | Xcodeの設定を開く |
| S | ⌘ + , | Xcodeの設定を開く |

# Raycast編
Raycastのスニペットを登録しておいて、**入力**を検知して**結果**を反映させている
例えば、`.fml`と入力すると`.frame(maxWidth: .infinity, alignment: .leading)`に変換される
正直これが生産性バグ上げしていると思う
[Raycast + Xcodeで爆速開発したい！](https://qiita.com/ymurao/items/a57e032c3aae7459db63)にて詳細あり

| Tier | 入力 | 結果 |
| -- | -- | -- |
| S | .fs | `.foregroundStyle(Color.)` |
| S | .fwh | `.frame(width: 16, height: 16)` |
| S | .fmi | `.frame(maxWidth: .infinity)` |
| S | .fml | `.frame(maxWidth: .infinity, alignment: .leading)` |
| S | .fmt | `.frame(maxWidth: .infinity, alignment: .trailing)` |
| S | ifv | import SwiftUI <br> struct ViewName: View { <br> var body: some View {}<br>} <br>extension ViewName {}|
| A- | xctae | `XCTAssertEqual(<#T##expression1: Equatable##Equatable#>, <#T##expression2: Equatable##Equatable#>)` |
| S | .clirou | `.clipShape(RoundedRectangle(cornerRadius: 25.0))` |
| S | vview | var viewName: some View {} |
| S | fview | func viewName() -> some View {} |
| S | sview | struct ViewName: View {<br> var body: some View {} <br>} |


スニペットまでは載せませんが、テストなどは大体フォーマットが決まっているため、スニペットに登録して呼び出しています


# Vim編
Vimはまだ初心者なので、あまり使いこなせてないですが、おまけ程度に紹介します
| Tier | ショートカット | アクション |
| -- | -- | -- |
| S | C → I　→ W | カーソル上の単語を消して入力する |
| S | U | Undo |
| S | ⌃ + R | Redo |
| S | gg | ファイル内の先頭へ |
| S | X | カーソル上の文字削除 |
| S | dd | カーソル上の行を削除 |


## おわりに
できるだけマウスの移動を避け、キーボード（ホームポジション内で完結できるように頑張っています。
最近はVimも練習中なので、さらなる速度向上が期待されると思います
思い出したら追記していきます

:::note
この記事がお役に立てば、いいね👍お待ちしています！
:::


# 参考文献
[【Xcode】control + mで引数を自動で改行](https://qiita.com/yusame0308/items/0c5a8cb98122852ec65d)
[Xcodeショートカットまとめ](https://qiita.com/yutosa3/items/88e3ebedb74c02e324b2)
[Xcodeでの開発に溜め息が出るあなたへ](https://qiita.com/yuta-shoji/items/f24b8907b75b47f1cafd)