Skip to content

Psalmの言語サーバーの使用

Psalmには言語サーバー互換性サポートが組み込まれており、お気に入りのIDEで実行できるようになりました。 現在、診断(エラーと警告の検出)、定義へのジャンプ、ホバーをサポートしており、オートコンプリートも限定的にサポートしています(PRを歓迎します!)。 様々なエディタで良好に動作します(アルファベット順):

クライアント設定

Emacs

eglotで動作確認しました。 以下は使用した設定です:

(when (file-exists-p "vendor/bin/psalm-language-server")
  (progn
    (require 'php-mode)
    (require 'eglot)
    (add-to-list 'eglot-server-programs '(php-mode . ("php" "vendor/bin/psalm-language-server")))
    (add-hook 'php-mode-hook 'eglot-ensure)
    (advice-add 'eglot-eldoc-function :around
                (lambda (oldfun)
                  (let ((help (help-at-pt-kbd-string)))
                    (if help (message "%s" help) (funcall oldfun)))))
    )
  )

PhpStorm

ネイティブサポート

PhpStorm 2020.3以降、psalmのサポートがデフォルトで有効になっています。詳細はこちらで確認できます。

LSPを使用する場合

alternatively、psalmはgtache/intellij-lspプラグイン(Jetbrains承認版最新版)で動作します。セットアップはGUIで行います。

プラグインをインストールすると、"Languages & Frameworks"タブの下に"Language Server Protocol"セクションが表示されるはずです。 "Server definitions"タブでPsalmの定義を追加する必要があります: - Executableを選択 - 拡張子:php - パス:<PHPバイナリへのパス> 例:/usr/local/bin/phpまたはC:\php\php.exe - これは絶対パスである必要があり、単にphpではいけません - 引数:vendor/bin/psalm-language-server(Windowsの場合はvendor/vimeo/psalm/psalm-language-server、または'グローバル'インストールの場合は'%APPDATA%' + \Composer\vendor\vimeo\psalm\psalm-language-server、'%APPDATA%'環境変数は通常C:\Users\<homedir>\AppData\Roaming\のようになります)

"Timeouts"タブで初期化タイムアウトを調整できます。これは大規模なプロジェクトがある場合に重要です。"Init"の値を、Psalmがプロジェクト全体とその依存関係をスキャンすることを許可するミリ秒数に設定する必要があります。大規模なPHPフレームワークを使用するいくつかのプロジェクトを開く場合、高性能のビジネスラップトップで、Initに240000ミリ秒を試してみてください。

Sublime Text

優れたSublimeのLSPプラグインを以下の設定で使用しています(Package Settings > LSP > Settings):

    "clients": {
        "psalm": {
            "command": ["php", "vendor/bin/psalm-language-server"],
            "selector": "source.php | embedding.php",
            "enabled": true
        }
    }

Vim & Neovim

ALE

ALEはPsalmをサポートしています(v2.3.0以降)。

let g:ale_linters = { 'php': ['php', 'psalm'] }

vim-lsp

vim-lspでも動作確認しました。 以下は使用した設定です(Vim用):

au User lsp_setup call lsp#register_server({
     \ 'name': 'psalm-language-server',
     \ 'cmd': {server_info->[expand('vendor/bin/psalm-language-server')]},
     \ 'allowlist': ['php'],
     \ })

coc.nvim

coc.nvimでも動作します。 coc-settings.jsonに以下の設定を追加してください:

  "languageserver": {
    "psalmls": {
      "command": "vendor/bin/psalm-language-server",
      "filetypes": ["php"],
      "rootPatterns": ["psalm.xml", "psalm.xml.dist"],
      "requireRootPattern": true
    }
  }

VS Code

Psalmプラグインはこちらから入手できます(VS Code 1.26以降が必要):

Dockerコンテナでサーバーを実行する

--map-folderオプションを必ず使用してください。引数なしで使用すると、サーバーのCWDをホストのプロジェクトルートフォルダにマッピングします。カスタムマッピングを指定することもできます。例:

docker-compose exec php /usr/share/php/psalm/psalm-language-server \
   -r=/var/www/html \
   --map-folder=/var/www/html:$PWD

ユーザーノート