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


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

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

コードフォーマット

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

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

タグジャンプ

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

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

brew install ctags

alias 作成

.zshrc等にalias作成

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

tagを作成する

ctags -R

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

phpの場合

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を参照。

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

インストール(mac)

brew install global --with-exuberant-ctags --with-pygments

tagを作成

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

gtags --gtagslabel=pygments

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

alias 貼っとくと楽

.zshrc等にalias作成

alias gtags="gtags --gtagslabel=pygments"

旧手順 (デフォルトの対応言語のみで良ければこれでも良い)

macの場合はbrewでinstallできる?

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

brew search global

tagを作成する

gtags -v

vim用のplugin導入

NeoBundle 'vim-scripts/gtags.vim'

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

使い方というか私の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みたいな複数カーソル

NeoBundle 'terryma/vim-multiple-cursors'

:NeoBundleInstall

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

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

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

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

:NeoBundleInstall

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

他にもたくさんある

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

" テキストオブジェクト拡張
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!