AppCodeショートカットメモ（コード補完周り）


以前にもショートカットまとめたけど、もうちょっと付け加えたメモ。
Eclipseの`cmd + 2`を押してから`L`ってショートカットに感動して、AppCodeにもあるだろうと思って探してみたら案の定ありました。
ざっくり言うとこんな機能。

```java
    new PrivateMessage(); // この行でcmd+2を押した後にLを押す
```

↓↓

```java
    // こうやって補完される
    PrivateMessage privateMessage = new PrivateMessage();
```

`Tab`を押すと赤枠になってる部分を移動できるとか、
`Shift + Enter`でカーソル位置に関わらず改行してくれるとか、
細かいところも抑えていくと大分違いますが、
一番重要な機能として、これを知ってるか否かでコーディングの速度が大分違う気がします。
（感覚的な話かもしれませんが・・・）
詳しくは実際に使ってみてほしいんですが、AppCodeにも同様の機能があったのでご紹介。

##ショートカット一覧

Refuctor > Extractを開くとメニューが表示されます。
これらはとても便利なショートカットです。
今回は以下のショートカットについてご紹介。

- Variable
command + option + V

- Constant
command + option + C

- Parameter
command + option + P

- Property
command + option + E

- Instance Variable
command + option + I

- Define
command + option + F

- Typedef
command + option + K

- Method
command + option + M

- Block Parameter
ショートカットなし

- Superclass
ショートカットなし

- Subclass
ショートカットなし

- Protocol
ショートカットなし

- Category
ショートカットなし

##例

以下のようなソースを書いているとします。

```objectivec:
@implementation HogeObject
{

}

- (void)hoge
{
    
}

@end
```

この状態でExtractメニューを実行します。
返り値から変数を自動生成というのが主な機能。
名前の編集ももちろんその場で可能。

```objectivec:補完前
- (void)hoge
{
    [NSArray array]; // この行にカーソルを合わせる
}
```

###Variable [cmd + option + V] 実行後

```objectivec:補完後
- (void)hoge
{
    NSArray *array = [NSArray array];
}
```

###Instance Variable [cmd + option + I] 実行後

```objectivec:補完後
@implementation HogeObject
{
    NSArray *_array;
}

- (void)hoge
{
    _array = [NSArray array];
}
```

###Instance Variable [cmd + option + I] 実行後

```objectivec:補完後
@implementation HogeObject
{
    NSArray *_array;
}

- (void)hoge
{
    _array = [NSArray array];
}
```

###Property [cmd + option + E] 実行後
```objectivec:補完後
@implementation HogeObject

- (void)hoge
{
    self.array = [NSArray array];
}
```

```objectivec:補完後
@interface HogeObject

@property (nonatomic, strong) NSArray *array;

@end
```

###Parameter [cmd + option + P] 実行後

返り値からメソッドの引数を自動生成する。

ショートカット：
option + command + P

```objectivec:補完前
- (void)hoge
{
    NSMutableArray *array = [NSMutableArray array];
    [array addObject:@"hogehoge"];
}
```

```objectivec:補完後
// 変数 "array" にフォーカスしてcmd + option + P
- (void)hoge:(NSMutableArray *)array
{
//  NSMutableArray *array = [NSMutableArray array];
    [array addObject:@"hogehoge"];
}
```

もしくは

```objectivec:補完後
// "[NSMutableArray array]" を選択してcmd + option + P
- (void)hoge:(NSMutableArray *)mutableArray
{
//  NSMutableArray *array = [NSMutableArray array];
    NSMutableArray *array = mutableArray;
    [array addObject:@"hogehoge"];
}
```

また、`@"hogehoge"`を選択してる状態でExtract > Variableを実行すると以下のようになります。
（Variable以外のメニューも実行できます）

```objectivec:補完後
- (void)hoge
{
    NSMutableArray *array = [NSMutableArray array];
    NSString *object = @"hogehoge";
    [array addObject:object];
}
```

これらは`Ctrl + T`で呼び出せるものが多いです。
スピードや効率にこだわるなら一発で呼び出すショートカットを覚え、
中々覚えられない人はとりあえず`Ctrl + T`だけ押すという形でも良いと思います。
これらのショートカットを上手く使い分けて効率よくコードを書きましょう。

##その他

#####`ctrl + 上下`

開いているコード内で、メソッド単位のジャンプができます。
メソッドの頭に飛ぶので意外と便利。

#####`cmd + 1`

エディタ外のプロジェクトのウィンドウを開閉できます。
フォーカスもそのウィンドウへ移るので、そのまま`cmd + N`を押すとClass作成などのポップアップが表示されます。
ポップアップにはCategoryやGroupの作成メニューなどもあるので便利です。

`cmd + 数字`はエディタ外のウィンドウにアクセスする便利なショートカットです。

- `cmd + 1` : Project
- `cmd + 2` : Favorte
	- AppCodeはコード内にブックマークの設定ができます
- `cmd + 4` : Run
	- ctrl + Rで実行したウィンドウを開きます
	- このウィンドウ内もControl+左右でタブ切り替えができます
- `cmd + 5` : Debug
	- Cmd + 4とほぼほぼ同じ
- `cmd + 6` : TODO
	- コード内に`// TODO: `と書いてあればここに表示されます
	- 一覧表示されて探しやすいのでTODO書く気になれます
- `cmd + 7` : Structure
	- 開いてるファイルのクラスやメソッドを一覧表示してくれます
	- Eclipseで右側に表示されてるアレですね

これらウィンドウはエディタの上下左右のどこかに移動することができます。
大きな画面なら左にProject、右にStructure、下にRun/Debug、中央にエディタ、といった感じで配置すると使いやすいかもしれません。

エディタ外にフォーカスが移っている場合、`etc`を押すとエディタへフォーカスが戻ります。
エディタにフォーカスを戻したいときはとりあえず`etc`を押しましょう。

#####`ctrl + O`
Overrideできるメソッド(SuperClassのメソッド)を一覧表示する。

#####`ctrl + I`
実装しているDelegateメソッドを一覧表示する。

#####`cmd + shift + O`

ファイルを検索してくれます。
もちろんキャメルケースでも。
`cmd + O`（クラス検索）と併用すると便利。

#####`control + 左右`
タブ移動。

#####`cmd + ctrl + 上`
.hと.mの切り替え。

#####`alt + cmd + L`
Reformat Codeです。
コードのフォーマットをしてくれるので、超絶便利です。
これを使う場合は、フォーマッタの設定をしっかり行いましょう。