vim で php の補完がしたい

vim デフォルトでも php の補完は可能.
でも他のエディタのように自分で定義した class method や フレームワークの facade も補完して欲しい.

いくつか plugin があるみたいだけど, 自分の環境に合うものをチョイスしたい.
今回は phpcd を利用して Laravel で定義される facade の補完まで実現する.

概要は次の通り.

動作環境

  • macOS Mojave 10.14.x
  • vim 8.1
  • Laravel 5.5.x

前提知識

次のような知識があるといいかも.

  • 補完だけならデフォルトの vim でも <C-x>, <C-o> で可能
  • Laravel の Facade について

今回は vim 中心の話なので前者についてざっと紹介する.

補完だけならデフォルトの vim でも <C-x>, <C-o> で可能

入力済み変数・メソッドは <C-n> or <C-p> で候補の表示が可能.
上の例では array_c まで入力して関数の候補を表示している.

今回比較・検討した plugin など

結論から言うと phpcd を採用した.
採用に至るまでに比較・検討した条件やツールを紹介する.

注目する条件は次の通り.

  • php version
  • 他のツールへの依存
  • 通信・セキュリティ

私が求める条件は次の通り.

  • 家 and 現場 で同じツールがいい
    • 現場の php version. が低いことが多いので php5.x, php7.x どちらでも使えるものがいい
  • 依存が少ないものがいい
    • 可能な限り他の plugin を入れたくない
  • 無駄な通信をしないものがいい
    • plugin 実行のためのどこかのサーバと通信するのはセキュリティ的に嫌だ

候補となったツールは次の通り.

これらのツールを比較・検討するために表にしてみる.
詳しくは上記リンク参照.

plugins php version dependencies communications
phpactor >= php7.1 – Composer – Standalone
LSP – (Composer) – JSON-RPC
phpcd >= php5.6 – PCNTL Extension
– JSON Extention
– Comporser
– Standalone

dependencies 列はちょっと曖昧かも.
plugin manager を使っているのなら Composer はなくてもok.

LSP が有力候補だったが, 現場で使うにはセキュリティ&通信速度の点で懸念があった.
また, 多くの現場では未だに php7 に移行できないシステムが多いため phpactor, LSP のどちらも採用を断念.

phpactor を php5.x で動かすハックがあるっぽい PR を見つけたけど, 私は試していない.
ソースはこれ↓

消去法的に残った候補は phpcd.
一見, 他ツールへの依存が多いように見えるけど, 調査したら特に意識せずとも各拡張機能は enable になっていたから思いの外依存は少ない.

plugin 選定理由は以上.

phpcd requirments について

後戻りを減らすために phpcd の requirements を眺める.
ぱっと見て見慣れないのはこのあたり.

  • PCNTL Extension
  • JSON Extention

調べてみる.

PCNTL Extension

Process Controle Extention の略.
Unix ライクなプロセスハンドラっぽい.

cf.) Process Control

現状有効になっているかどうか確認.

$ php -i | grep "pcntl support"
pcntl support => enabled

有効になってそう.

JSON Extention

JSON data-interchange format らしい.

cf.) JSON

現状確認

$ php -i | grep "json support"
json support => enabled

有効になってそう.

php5.6.x で使うなら php5 ブランチで

lvht/phpcd.vim master ブランチは php7.x を対象にしている.
README にも書いてあるけど, php5 で利用するなら利用するブランチを切り替える必要がある.

下準備

github の手順に従って下準備する.

install phpcd

ひとまず patheogen で inst.

$ cd ~/.vim/bundle/
$ git clone https://github.com/lvht/phpcd.vim.git

# error 回避
$ cd phpcd
$ composer update

普通に git clone して使用すると error が大量に出る.
$ composer update することで解決した.

phpcd はデフォルトで vendor/autoload.php を探してくれるらしい.
特定の prj. で利用したいなら, composer が生成する autoload.php の path を指定する必要がある.

let g:phpcd_autoload_path = 'path/to/autoload_file.php'

ここまでの作業で <C-]> で定義ジャンプ, <C-t> でジャンプバックが可能になった.
定義ジャンプの keymap は次のファイルで定義されている.

  • $HOME/.vim/bundle/phpcd/ftplugin/php_phpcd.vim

Facade 補完を有効化

次に Facade の補完を有効化するために laravel-ide-helper を利用する.

This package generates a file that your IDE understands, so it can provide accurate autocompletion.
Generation is done based on the files in your project, so they are always up-to-date.

引用: barryvdh/laravel-ide-helper

Composer 経由でプロジェクトに inst.

$ composer require --dev barryvdh/laravel-ide-helper

prd. 環境には反映したくないので --dev オプションを付けた.
Laravel 5.5 の場合は ServiceProvider へ記述しなくても自動的に見つけてくれる.

laravel-ide-helper は主要なコマンドが3つ程あるが, 今回は次のコマンドだけ使用する.

  • php artisan ide-helper:generate

commit 毎に phpDocs を再生成したい場合は composer.json に次の一文を書く.

"scripts":{
    "post-update-cmd": [
        "Illuminate\\Foundation\\ComposerScripts::postUpdate",
        "php artisan ide-helper:generate"
    ]
},

この状態で $ composer update して生成される _ide_helper.php は IDE に読み込ませるものらしい.
プロジェクトでは git 管理から外す.

アプリケーション起動時に _ide_helper.php を詠み込む方法が wiki に書いてあった.

この wiki に従って作業を進める.

プロジェクトディレクトリに次のファイルを作成する.

# .autoload.php

<?php

require './vendor/autoload.php';
require './_ide_helper.php';

vim からこのファイルを参照可能にする.

let g:phpcd_autoload_path = 'path/to/.autoload.php'

設定は以上.

使ってみる

次の動作を試してみる.

  • 自分で定義した service class method の補完
  • facade の補完

自分で定義した service class method の補完

自作した service class 内で定義した method の補完もしてくれてる.

facade の補完

こちらはイマイチ.
保管してくれる時としてくれないときがあるけど… なぜだろう?

あと, gif をいい感じに表示してくれるツールないかな…
これじゃシェルの文字が見えない…

ひとまずこれで開発が捗りそう.
今回は以上.

1985年生まれ 東京都在住 フリーランスWEBエンジニア.
30歳からWEBプログラミングを独学で習得. その後エンジニアとして某企業にコミット.
現在は週3日稼働のフリーランスエンジニアとして活躍.
学んだことを中心に web 界隈の人達に向けた情報を発信.

たきもとをフォローする
CODE
\ share /
t11o
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
Secured By miniOrange