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 をいい感じに表示してくれるツールないかな…
これじゃシェルの文字が見えない…

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

スポンサーリンク
336 x 280 – レクタングル(大)
336 x 280 – レクタングル(大)
  • このエントリーをはてなブックマークに追加

この記事が気に入ったら
いいね!しよう

スポンサーリンク
336 x 280 – レクタングル(大)
トップへ戻る