Setting Up Vim and the Php Language Server Protocol

Vim is great at editing text, but doesn’t have the full language features built in that devs love in IDEs. At the same time, the Vim plugin ecosystem has allowed for new languages to quickly ramp up in Vim instead of waiting for adoption to support a full IDE.

Enter the Language Server Protocol. Originally to support another text editor, Visual Studio Code, LSP has been embraced by the Vim world as a way to get much richer language support than we’re used to, and now that’s available for PHP!

Let’s step through how to install Language Server Protocol support for PHP in Vim.

Assumptions

Some silly assumptions to start!

  • You have Vim installed and a method of installing plugins you prefer. Why? Because there are multiple plugin managers and I’d like to gloss over instructions for each.
  • You have Composer installed for your PHP project
  • You’re comfortable on the command line! This seems likely if you’re using Vim.

Step 1: Install the LSP client plugin

The most popular Vim plugin for LSP integration is Prabir Shrestha’s Vim-LSP plugin. Go ahead and install this plugin based on your plugin manager of choice and the instructions at the Github link. This is your LSP client for Vim!

Step 2: Install the LSP Server

In your project, run:


./vendor/bin/composer require -D felixfbecker/language-server

This will install the language server locally to your project, and add it to your composer.json dev dependencies. Why do this per project? I have a few projects and generally avoid depending on a global install if I can help it. If you have different requirements, you could install it with a global composer install.

Step 3: Parse stubs

There are plenty of parts of PHP that aren’t defined in your code but the language server still needs to know about! These are things that are in the PHP standard library, like definitions for DateTime or function signatures for built in functions like array_map.

From your project, run:


./vendor/bin/composer run-script --working-dir=vendor/felixfbecker/language-server parse-stubs

Step 4: Configure Vim to start and use the LSP

Now we need to configure Vim to use the server. Add this to your vimrc


au User lsp_setup call lsp#register_server({
    \ 'name': 'php',
    \ 'cmd': {server_info->['php',
expand('[PATH TO YOUR COMPOSER VENDOR DIRECTORY]/vendor/bin/php-language-server.php')]},
    \ 'whitelist': ['php'],
    \ })

autocmd FileType php setlocal omnifunc=lsp#complete

Replace the path with your path. I use Vim’s support for directory vimrc using exrc so I replace that path portion with .. But if you have a different setup, you’ll need to make sure it points to the vendor directory where you installed the language server earlier.

Step 5: Test it out!

Go into your project, and try autocompleting a class or function name using Ctrl+X Ctrl+O, the keyboard shortcut for Vim omnicomplete.

writing

I write about technology I'm using and the tech ecosystem.

speaking

I speak at tech and other events. You can see the recordings/slides.

resume

Here's my work history.

contact me

If you're interested in working together, let me know!