勉強日記

チラ裏

Emacs company-modeでLaravelのPHPコードの補完・定義ジャンプ

環境

動機

ac-php

依存

導入

ac-php, company-php

  1. M-x package-list-packages RET
  2. ac-php, company-phpを探してINSTALL

PHP本体

なんで今更

  • 普段は仮想環境内のPHPを使っている
    • laradock on docker
    • Homestead on vagrant
  • エディタはホスト側にあるので、ホスト側にPHPを入れる必要が生じた

入れる

  1. php公式にアクセス、zipを落としてくる
    • とりあえず最新の
      • Laravel 5.5が7系必須だった気がする
    • とりあえずスレッドセーフなやつ
  2. 適当に解凍、パスを通す
  3. インストール確認
php --version
PHP 7.3.1 (cli) (built: Jan  9 2019 22:20:52) ( ZTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies

init.elいじる

(defun php-company-hook ()
  (require 'company-php)
  (company-mode t)
  (ac-php-core-eldoc-setup) ;; enable eldoc
  (make-local-variable 'company-backends)
  (add-to-list 'company-backends 'company-ac-php-backend)
  ; 定義にジャンプ
  (define-key php-mode-map  (kbd "M-.") 'ac-php-find-symbol-at-point)
  ; ジャンプ先から戻る
  (define-key php-mode-map  (kbd "M-,") 'ac-php-location-stack-back))


(add-hook 'php-mode-hook 'php-company-hook)

下準備

  • laravelプロジェクトルートに.ac-php-conf.jsonファイルを作る
    • 空でいい
  • M-x ac-php-remake-tags-all RET でタグファイルを作る
    • ~/.ac-phpの中にできる
    • Windowsの場合、~を解決するために%HOME%環境変数が必要かも
      f:id:wand_ta:20190115143002p:plain
  • バッファ右下に進捗が表示される。完了を待つ
    f:id:wand_ta:20190115143229p:plain

つかう

補完

  • ばっちり補完される
    • f:id:wand_ta:20190115143117p:plain
    • f:id:wand_ta:20190115143127p:plain
  • __callStatic()マジックメソッドで他モジュールに委譲している呼び出しまで拾ってくれる
    f:id:wand_ta:20190115143200p:plain
    • \Illuminate\Support\Facades\DB => \Illuminate\Database\DatabaseManager
    • \Illuminate\Database\DatabaseManager => \Illuminate\Database\Connection
    • たぶん@seeとか@mixinアノテーションのおかげ(未検証)
<?php

/**
 * @see \Illuminate\Database\DatabaseManager
 * @see \Illuminate\Database\Connection
 */
class DB extends Facade
<?php

/**
 * @mixin \Illuminate\Database\Connection
 */
class DatabaseManager implements ConnectionResolverInterface

定義ジャンプ

f:id:wand_ta:20190115143324p:plain

M-.

f:id:wand_ta:20190115143334p:plain

快適

限界

  • \DB::select()とかは補完してくれない
    f:id:wand_ta:20190115143348p:plain
    • <project_root>/config/app.phpaliases定義までは拾ってくれない模様
      f:id:wand_ta:20190115143359p:plain