php書くときに知っといた方が捗るvimの使い方かも


### phpのエディタ選ぶのにvimだとどうするのか聞かれたのでメモを残す。

- 基本的な使い方はググれば載ってるので書いてないです。
- mac専用のpluginも書いてるかも。
- vimの使い方って書いたけどただのpluginの紹介かも。。。


### コードフォーマット

フォーマットをかけたい範囲を選択して```=```を押下。

ファイル全体に適用したいなら```ggVG=```でOK

### タグジャンプ

メソッド名等から定義先へジャンプしたい場合はvimだけだとgrep使うしかないのでctgasとかgtagsを使う。

#### macの場合はbrewでinstallできる。

```bash
brew install ctags
```

#### alias 作成

.zshrc等にalias作成

```bash
alias ctags="`brew --prefix`/bin/ctags"
```

#### tagを作成する

```bash
ctags -R
```

これだけでタグジャンプが使える。

#### phpの場合

```bash
ctags -R --regex-php="/^[ \t]*const[ \t]+([a-z0-9_]+)/\1/d/i"
```

phpの場合は上記のようにするとconstとかもジャンプできる。

#### タグジャンプの仕方

- ジャンプしたい単語にカーソルを合わせて```ctrl + }```でジャンプ。
- 戻りたい場合は```ctrl + o```で戻れる

### メソッドがどこで使われているか

grepでもできるんだけど今回はGNU GLOBAL（gtags）を使ったやり方を書きます。
* 対象の言語が対応しているかチェックしてください。
http://www.gnu.org/software/global/global.html
http://uguisu.skr.jp/Windows/gtags.html

何ができるかは上記のサイト読んでください。
いつの間にか色んな言語が追加できるようになってるみたいですね。
この記事書いてから気づいた。。。

gtagsについては後で全部書き換えるかも知れないので以下のサイトを先に読んでください。

参考：http://qiita.com/sona-tar/items/672df1259a76f082ce42

### 他の言語対応を試してみました。(新手順)

>#### 参考：http://qiita.com/5t111111/items/c14ac68f762ce71a7760

>今回はctagsが必要です。インストールについては上記のctagsを参照。

>```bash
$ ctags --version
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Jul  4 2014, 16:16:13
  Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
  Optional compiled features: +wildcards, +regex
```

>#### インストール(mac)

>```bash
brew install global --with-exuberant-ctags --with-pygments
```

>#### tagを作成

>プログラムのある場所に移動してコマンド実行

>```bash
gtags --gtagslabel=pygments
```

>ここまでで関数ジャンプや参照先一覧が動くようになります。
>とりあえずrubyで動くことが確認できましたー

>#### alias 貼っとくと楽

>.zshrc等にalias作成

>```bash
alias gtags="gtags --gtagslabel=pygments"
```

#### 旧手順 （デフォルトの対応言語のみで良ければこれでも良い）
> #### macの場合はbrewでinstallできる？

> brew search であったから多分できる。試してはない。

> ```
brew search global
```

> #### tagを作成する

> ```bash
gtags -v
```

#### vim用のplugin導入

```.vimrc
NeoBundle 'vim-scripts/gtags.vim'
```

使い方は以下のサイトが良い感じだった
http://blog.matsumoto-r.jp/?p=2369

使い方というか私のvimrcの設定を貼ります。

```.vimrc
" gtags
" 検索結果Windowを閉じる
nnoremap <C-q> <C-w><C-w><C-w>q
" Grep 準備
nnoremap <C-g> :Gtags -g
" このファイルの関数一覧
nnoremap <C-l> :Gtags -f %<CR><CR>
" カーソル以下の定義元を探す
"nnoremap <C-j> :Gtags <C-r><C-w><CR><CR>
map <C-j> :GtagsCursor<CR><CR>
" カーソル以下の使用箇所を探す
nnoremap <C-k> :Gtags -r <C-r><C-w><CR><CR>
" 次の検索結果
nnoremap <C-n> :cn<CR>
" 前の検索結果
nnoremap <C-p> :cp<CR>
```

上記の設定ができていれば単語にカーソルを合わせて```ctrl + k```で利用箇所の一覧が出てきます。

#### 強力な置換機能

リファクタリング等で使う場合は```thinca/vim-qfreplace```というプラグイン入れると便利です。

先ほどの利用箇所の一覧がquickfix のウィンドウにある状態で```:Qfreplace```と打ち込むと新しい画面（バッファ）が出てきます。ここで好きな置換等で書き換えて```wq```で抜けると変更した箇所が反映されます。
メソッド名の置換、引数の変更等が捗りますね。

参考：http://blog.supermomonga.com/articles/vim/qfreplace-benri.html

ちなみに当然、ctagsとgtagsの両方を使う必要はないです。
私はphp以外の言語用に両方はいってるから紹介しただけなので使いやすいものを選べば良いと思います。

### ファイル同士のdiff

```
vimdiff a.txt b.txt
```

詳細は以下で
参考：http://nanasi.jp/articles/howto/diff/merge_diff.html

### ちょっとターミナルの作業をしたい

```
:shell
```

上記でターミナルに制御が移ります。

```
exit
```

上記で抜けるとvimに戻ってきます。


### 置換

ファイル全体でhogeをfugaに置換する。

```
:%s/hoge/fuga/g
```

置換場所を確認しながら実行する場合は```c```をつける。


```
:%s/hoge/fuga/gc
```

hitした箇所で以下のように聞かれるので置換するなら```y```しないで次いくなら```n```になります。

```
replace with hoge (y/n/a/q/l/^E/^Y)?
```

参考：https://github.com/osyo-manga/vim-over

上記のpluginを入れるとビジュアル的にできるようです。


### SublimeTextみたいな複数カーソル

```.vimrc
NeoBundle 'terryma/vim-multiple-cursors'

:NeoBundleInstall
```

参考：http://qiita.com/sachin21/items/cfcb81bf4d1073429b68

上記に画像付きで説明があります。

### コーディング規約のチェック

```.vimrc
NeoBundle 'git://github.com/scrooloose/syntastic.git'

:NeoBundleInstall
```

設定は以下を参照すると良い。
参考：http://yuzuemon.hatenablog.com/entry/2014/08/13/135412

### 他にもたくさんある

書ききれないので私がphpで使ってるpluginを列挙だけしときます。
railsやjavascriptとかも含むともっとある。。。　

```.vimrc
" テキストオブジェクト拡張
NeoBundle 'git://github.com/tpope/vim-surround.git'
"入力補完機能
NeoBundle 'git://github.com/Shougo/neocomplcache.git'
"vim 用の統合ユーザインターフェース
NeoBundle 'git://github.com/Shougo/unite.vim.git'
" 非同期処理
NeoBundle 'git://github.com/Shougo/vimproc.git'
" 整形
NeoBundle 'git://github.com/tsaleh/vim-align.git'
" プログラム実行
NeoBundle 'git://github.com/thinca/vim-quickrun.git'
" SQLの整形
NeoBundle 'git://github.com/vim-scripts/SQLUtilities.git'
" ファイラー
NeoBundle 'Shougo/vimfiler'
" indentの見える化
NeoBundle 'nathanaelkane/vim-indent-guides'
" デバック
NeoBundle 'joonty/vdebug'
" git連携
NeoBundle 'git://github.com/tpope/vim-fugitive.git'
" スニペット
NeoBundle 'Shougo/neosnippet'
” スニペット集
NeoBundle 'Shougo/neosnippet-snippets'
” スニペット集
NeoBundle 'git://github.com/honza/snipmate-snippets.git'
" 見出し一覧
NeoBundle "Shougo/unite-outline"
" git の変更点見える化
NeoBundle 'airblade/vim-gitgutter'
" クリップボード連携
NeoBundle 'kana/vim-fakeclip'
" html サポート
NeoBundle 'mattn/emmet-vim'
" Dash連携
NeoBundle 'rizzatti/dash.vim'
```

:wq!