おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

(PHP)プログラマのためのVIM (10) - PHP向けカスタマイズ(2) タグ・補完・netrw

Yahoo!のAndreiさんのプレゼンのPDFを勉強がてら訳していってます。訳は微妙です。

  1. カーソル位置・カーソル移動・マーク・挿入
  2. 削除・検索
  3. 置換・テキストオブジェクト
  4. コピー/削除/貼り付け、レジスタ
  5. undo
  6. ビジュアルモード、ウィンドウ、タブ
  7. 補完・マップ・オプション
  8. セッション、misc、ヘルプ
  9. PHP向けカスタマイズ

そのまえに

Andreiの実際使っているvimの設定についての説明が含まれます。ファイルは元記事からダウンロードすることができます。
PHPと付いてはいますが、ほとんど他の言語でも使えるものです。

PHP: タグ

  • タグとは、PHPの識別子(クラス、関数、定数)を指します
  • tagsファイルがあれば、かんたんにその定義にジャンプできます
  • Exuberant Ctagsをインストールしよう
  • これは、あなたのスクリプトを解析して、タグファイルを出力してくれる
  • 現在は、クラスのメンバシップ情報をサポートしていない (メソッドは関数として出力される)
  • 編集後にタグファイルをリビルドするようにマッピングする
nmap <silent> <F4>
    \ :!ctags-ex -f %:p:h/tags
    \ --langmap="php:+.inc"
    \ -h ".php.inc" -R --totals=yes
    \ --tag-relative=yes --PHP-kinds=+cf-v %:p:h<CR>
set tags=./tags,tags
  • CTRL-] - カーソル下のタグにジャンプする
  • CTRL-W CTRL-] - 新しいウィンドウにジャンプ先のタグを開く
  • :tag <ident> - 任意のタグにジャンプ
  • :tag /<regexp> - 正規表現にマッチするタグにジャンプもしくは一覧表示
    • 複数マッチしたときは、リストから1つ選ぶ
  • :tselect <ident> もしくは :tselect /<regexp> - ジャンプせずに、タグを一覧表示
  • CTRL-T - 前いたところに戻る
  • taglist.vimプラグインも参照してください

PHP: 補完

  • vim7では、強力なheuristics-base(経験則ベース)のomni completionが登場した
  • CTRL-X CTRL-Oで補完が開始する (僕はCTRL-Fにマップしてる)
  • クラス、変数、メソッドを文脈をベースにかしこい方法で補完する
  • 組み込み関数も補完してくれる
  • 関数補完はプロトタイプもプレビューしてくれる
    • array_<CTRL-X><CTRL-O>で、配列関数を一覧表示
    • リストの中で選択された項目のプロトタイプがプレビューウィンドウに表示
    • CTRL-W CTRL-Zで、プレビューウィンドウを閉じる


  • PHPブロックの外でHTML/CSS/JavaScript補完に切り替えることができる
  • 詳しいことは、
    • :help ins-completion
    • :help popupmenu-completion
    • :help popupmenu-keys

プラグイン

  • vimプラグインを利用することで無限にカスタマイズと拡張が可能
  • 既に数千ものプラグインが書かれている
  • インストールはとてもかんたん。拾ってきて、./vim/pluginにつっこむだけ
    • 最初に付属の説明は読んでね

netrw

  • リモートのディレクトリ、ファイルの読み書き、ブラウズを可能にする
  • 自分はscp経由でのssh接続で利用している
  • パスフレーズ確認のプロンプトを表示させないために、ssh-agentを動かしておく必要がある
  • 開くにはこんな感じでパスを指定
    • vim scp://hostname/path/to/file
    • :new scp://hostname/path/to/dir/

NERDTree

  • netrwブラウザに似てるけれど、見た目が階層的なエクスプローラビューになる
  • リモートファイルの操作はサポートしてない
    • :nmap <silent> <F7> :NERDTreeToggle<CR>

あとちょっと

だけど、もう寝る。
あと1回で終わります。