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 実行のためのどこかのサーバと通信するのはセキュリティ的に嫌だ
候補となったツールは次の通り.
- phpactor
- language-server-protocol
- 略して LSP
- cf) Overview | LSP
- phpcd
これらのツールを比較・検討するために表にしてみる.
詳しくは上記リンク参照.
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
現状有効になっているかどうか確認.
1 2 3 4 |
$ php -i | grep "pcntl support" pcntl support => enabled |
有効になってそう.
JSON Extention
JSON data-interchange format らしい.
cf.) JSON
現状確認
1 2 3 4 |
$ 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.
1 2 3 4 5 6 7 8 |
$ 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 を指定する必要がある.
1 2 3 |
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.
Composer 経由でプロジェクトに inst.
1 2 3 |
$ 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 に次の一文を書く.
1 2 3 4 5 6 7 8 |
"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 に従って作業を進める.
プロジェクトディレクトリに次のファイルを作成する.
1 2 3 4 5 6 7 8 |
# .autoload.php <?php require './vendor/autoload.php'; require './_ide_helper.php'; |
vim からこのファイルを参照可能にする.
1 2 3 |
let g:phpcd_autoload_path = 'path/to/.autoload.php' |
設定は以上.
使ってみる
次の動作を試してみる.
- 自分で定義した service class method の補完
- facade の補完
自分で定義した service class method の補完
自作した service class 内で定義した method の補完もしてくれてる.
facade の補完
こちらはイマイチ.
保管してくれる時としてくれないときがあるけど… なぜだろう?
あと, gif をいい感じに表示してくれるツールないかな…
これじゃシェルの文字が見えない…
ひとまずこれで開発が捗りそう.
今回は以上.