I have come to rely on Intelephense for any kind of PHP hackery, and this includes when I’m quickly editing a file on my own remote server, or in a vagrant box or what have you. Remote editing is one of the big strengths for me when it comes to using Emacs, and TRAMP has been serving me very well for it, by default so LSP servers don’t “just work”(TM) when accessing a remote file as the local LSP server won’t have access to the files. Luckily lsp-mode already has provisions for it so and will recognize that a file is remote, and startup an LSP server on the target machine if available, but it requires some configuration. For Intelephense this means making sure it is installed on the remote, easily done via NPM, and setting up a remote client configuration somewhere, for me best done as part of initializing lsp-mode.
(use-package lsp-php :config ;; register remote intelephense (lsp-register-client (make-lsp-client :new-connection (lsp-tramp-connection lsp-intelephense-server-command) :activation-fn (lsp-activate-on "php") :priority -1 :notification-handlers (ht ("indexingStarted" #'ignore) ("indexingEnded" #'ignore)) :initialization-options (lambda () (list :storagePath lsp-intelephense-storage-path :globalStoragePath lsp-intelephense-global-storage-path :licenceKey lsp-intelephense-licence-key :clearCache lsp-intelephense-clear-cache)) :multi-root lsp-intelephense-multi-root :completion-in-comments? t :remote? t :server-id 'iph-remote :synchronize-sections '("intelephense"))))
I am reusing the
lsp-intelephense-server-command and most of the other
lsp-intelephense variables as they contain the right configuration, and I haven’t had an issue, even so
lsp-intelephense-storage-path might need configuration depending on the value and setup, but it has worked for me. Importantly
remote? need to be set for lsp-mode to handle the remote server correctly, but this has worked like a charm for me. Having the same tooling both locally and remote sure is nice!