Live Templateを使おう！

## Live Templateとは？

Live Templateはいわゆるスニペット機能です。
デフォルトでもいくつか登録されていますが、エディタを手に馴染ませていく過程でこの機能を使いこなすことは必須。
よく使う定型文やフレームワーク特有の書き方などをどんどん登録していきましょう。

## Live Templateを使ってみる

まずはデフォルトで登録されているLive Templateを使用して、使い方を紹介してみます。

任意のPHPファイル内で「forek」まで入力してみます。
オートコンプリート窓で以下のように出てきたら、Tabを押してみましょう。
![全画面_2013_12_23_18_05-2.png](https://qiita-image-store.s3.amazonaws.com/222/20074/de923816-897f-8025-bc4d-bd8d0a6498c2.png "全画面_2013_12_23_18_05-2.png")

そうすると以下のようなコードに展開されます。
この状態でさらにTabを押すと定義された箇所、この場合は$の直後にカーソルが移動してそのままコードを入力出来ます。(Shift+Tabで後ろにも戻れます)

これがLive Templateです。

![app_…_PagesController.php_-_cakephp-2.3.0_-____www_cakephp-2.3.0_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/700a2217-100b-a5b7-354c-f38e83bfe807.png "app_…_PagesController.php_-_cakephp-2.3.0_-____www_cakephp-2.3.0_.png")


※上のオートコンプリート窓が出てこない場合はCode Completion(Ctrl+Space)、それでもダメなようであればInsert LiveTemplate(Cmd+J)から挿入出来ます。

## Live Templateを登録してみる

上述の通りデフォルトでいくつかテンプレートが登録されていますが、普段使っていく上でカスタマイズしたい欲求が出てきたら自分好みに追加してみましょう。

追加は

- [Preferences] - [Live Templates]

から行います。

ここではPHPのvar_dump()関数を拡張した[dmp]というLive Templateを作ってみます。

右上の[+]から[1. Live Template]を選択し、下の画面でこのように入力してみます。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/222/20074/8ed5011e-40a2-2a83-eaa7-34499dbc221c.png "Preferences.png")

AbbrevivationはそのLive Templateの名前、Descriptionは説明文。
Template textに展開後の文字列を指定します。
また、Template textで$hoge$のようにすることでその箇所を変数として定義出来ます。
上記の様に$var$を入力したら、右の[Edit variables]から変数の初期値を定義できます。

ここまで右下のOKを押して完了です。

あとはPHPファイル内で[dmp]という文字列から以下のように展開されればOKです。

```php
   echo '<hr>' . basename(__FILE__) . ' :: ' . __LINE__;
   echo '<pre>';
   var_dump();
   echo '</pre>';
   exit;
```


## （おまけ）CakePHP用のLive Template

CakePHPのモデル系のメソッドの引数が多くてややこしいので、以下のようによく呼び出すものをLive Template化して使っています。
元スニペットは[CakeVim](https://github.com/violetyk/cake.vim)の作者である@violetyk氏のものを参考にさせて頂いています。

- find

```php
$this->$TABLE$->find('$first$', array(
    'contain' => false,
    'conditions' => array(
        '$column$' => $conditions$,
    ),
    // 'fields' => array(
    //   '',
    // ),
    // 'fields' => array('count(id) as "Model__count"'),
    // 'limit' => 10,
    // 'order' => array('Model.col' => 'desc/asc'),
    // 'order' => 'rand()',
    // 'group' => array('Model.col'),
    // 'recursive' => -1,
  ));
```

- hasMany

```php
var $hasMany = array(
  '$model_name$' => array(
    'className' => '$model_name$', // 相手側のモデルクラス名。
    'foreignKey' => '$id$', // 相手側で持っている自分に対するキーの名前。デフォルトは「自分_id」
    // 'conditions' => array(), // 該当レコードに追加する検索条件
    // 'fields' => array(), // 該当フィールド名
    // 'order' => array('' => 'desc/asc'), // 並び替え絵を行うフィールド
    // 'limit' => 10, // 取得したいレコード最大数
    // 'offset' => 5, // スキップするレコード数
    // 'dependent' => true, // 自分を削除した場合にアソシエーション側も削除する場合true(要deleteメソッドの第二引数true)
    // 'exclusive' => false, // deleteAllによって一括で削除を行いたい場合はtrue
    // 'finderQuery' => '', // find時に独自のSQLが必要な場合に指定する
   ),
);
```

- hasOne

```php
var $hasOne = array(
       '$model_name$' => array(
           'className' => '$model_name$', //相手側のモデルクラス名
           'foreignKey' => '$id$',     // 相手側で持っている自分に対するキーの名前。デフォルトは「自分_id」
           'conditions' => array(),    // 該当レコードに追加する検索条件
           'fields' => array(),        // 該当フィールド名
           'dependent' => false,       // 自分を削除した場合にアソシエーション側も削除する場合はtrue。
       ),
   );
```

- validate(配列内で展開する想定)

```php
'$field_name$' => array(
    'rule' => '$rule$',
    'message' => '$error_message$',
    // 'required' => true, /* 必須*/
    // 'allowEmpty' => true, /* 空文字の許可*/
    // 'last' => false, /* そのエラーが発生した時点で以降のバリデーションは打ち切り */
    // 'on' => 'update', /* 'create'か'update'時にバリデーションを限定する */
),
```