Phpactor VIM Plugin



It is recommended (but not necessary) for you to use a VIM plugin manager. In this document we will use the vim-plug plugin manager, but other plugin managers are quite similar.

Require Phpactor in your VIM configuration file (e.g. ~/.vimrc or ~/.config/nvim/init.vim when using Neovim):

Plug 'phpactor/phpactor', {'for': 'php', 'do': 'composer install'}

Then update your plugins:


If you need to install the dependencies manually, then:

$ cd ~/.vim/plugged/phpactor
$ composer install
Make a Pull Request to improve this installation procedure!

Now open a PHP file and issue the following command :call phpactor#Status():

[✔] Composer detected - faster class location and more features!
[✔] Git detected - enables faster refactorings in your repository scope!
[✔] XDebug is disabled. XDebug has a negative effect on performance.

Config files
[✔] /home/daniel/www/phpactor/phpactor/.phpactor.yml
[✔] /home/daniel/.config/phpactor/phpactor.yml
[✘] /etc/xdg/phpactor/phpactor.yml

Phpactor works best with Composer - but much functionality including auto-completion can still work (sometimes slowly depending on project size).


E117: Unknown function: phpactor#Status:

Vim-plug and most other package managers for Vim will lazy-load Phpactor when it's needed, i.e. when opening a PHP file. If you get this error, open a PHP file and run the command again.

Composer not found or Git not detected:

The Git and Composer checks are referring to the current "workspace" (i.e. where you started Vim from). If you've already setup Git and Composer for your project, ensure you are starting Vim from the project directory to enable detection.


Updating Phpactor from VIM is easy:

:call phpactor#Update()
Note that if the update included changes to the VIM plugin you will currently need to either re-source (`:source ~/path/to/phpactor/plugin/phpactor.vim`) the plugin or reload VIM (pull requests are open!).

If you are feeling dangerous, you may choose to track the develop branch, by specifying a branch name in your VIM configuration file:

let g:phpactorBranch = "develop"

Keyboard Mappings

The Phpactor plugin will not automatically assume any shortcuts, copy the following configuration into your .vimrc:

" Include use statement
nmap <Leader>u :call phpactor#UseAdd()<CR>

" Invoke the context menu
nmap <Leader>mm :call phpactor#ContextMenu()<CR>

" Invoke the navigation menu
nmap <Leader>nn :call phpactor#Navigate()<CR>

" Goto definition of class or class member under the cursor
nmap <Leader>oo :call phpactor#GotoDefinition()<CR>
nmap <Leader>oh :call phpactor#GotoDefinitionHsplit()<CR>
nmap <Leader>ov :call phpactor#GotoDefinitionVsplit()<CR>
nmap <Leader>ot :call phpactor#GotoDefinitionTab()<CR>

" Show brief information about the symbol under the cursor
nmap <Leader>K :call phpactor#Hover()<CR>

" Transform the classes in the current file
nmap <Leader>tt :call phpactor#Transform()<CR>

" Generate a new class (replacing the current file)
nmap <Leader>cc :call phpactor#ClassNew()<CR>

" Extract expression (normal mode)
nmap <silent><Leader>ee :call phpactor#ExtractExpression(v:false)<CR>

" Extract expression from selection
vmap <silent><Leader>ee :<C-U>call phpactor#ExtractExpression(v:true)<CR>

" Extract method from selection
vmap <silent><Leader>em :<C-U>call phpactor#ExtractMethod()<CR>

See the Refactorings chapter for more functions you can map shortcuts to.

Phpactor requires at least PHP 7.0. If you use a different version of PHP locally, you may need to target a new version of PHP - add the following to your .vimrc to change the PHP binary:

let g:phpactorPhpBin = "/usr/bin/local/php6.0"


The plugin has some configuration options:

let g:phpactorPhpBin = 'php'
let g:phpactorBranch = 'master'
let g:phpactorOmniAutoClassImport = v:true
let g:phpactorInputListStrategy = 'inputlist|fzf'

" Example of implementation with vim's inputlist() function
function! InputListCustomStrategy(label, choices, ResultHandler)
    echo a:label
    let choice = inputlist(s:add_number_to_choices(a:choices))

    if (choice == 0)
        throw "cancelled"

    call a:ResultHandler(a:choices[choice - 1])

let g:phpactorCustomInputListStrategy = 'InputListCustomStrategy'
  • g:phpactorPhpBin: PHP executable to use.
  • g:phpactorBranch: Phpactor branch (default is master, use develop for bleeding edge).
  • g:phpactorOmniAutoClassImport: Automatically import classes when completing class names with OmniComplete.
  • g:phpactorInputListStrategy: Select a strategy for the Input List.
  • g:phpactorCustomInputListStrategy: Specify your own strategy.


You can manage your Phpactor extensions from with VIM:

call phpactor#ExtensionList()
call phpactor#ExtensionInstall()
call phpactor#ExtensionRemove()

Note that these commands are not very verbose. For increased verbosity execute the commands from the command line (as detailed here.



Omni-completion (Screenshot) is VIM's built-in auto-completion mechanism.

Add the following to your .vimrc in order to use Phpactor for omni-completion (for PHP files):

autocmd FileType php setlocal omnifunc=phpactor#Complete

To invoke omni complete in insert mode <C-x><C-o> (ctrl-x then ctrl-o). See :help compl-omni.

For case sensitive searching, set

let g:phpactorCompletionIgnoreCase = 0

Omni complete can also provide feedback when something fails to complete, this can be useful, enable it with:

let g:phpactorOmniError = v:true

Completion plugins

Completion plugins provide a significantly better completion experience.

Neovim Completion Manager (NCM)

deprecated, use NCM2 below

The Neovim Completion Manager add this to your (e.g. ~/.config/nvim/init.vim) (NCM) is a very fast completion manager for Neovim, install using the Plug plugin manager:

Plug 'roxma/nvim-completion-manager'
Plug 'phpactor/ncm-phpactor'


The NCM2 is the successor to NCM.

See the README file for instructions on installing NCM2 and the Phpactor plugin.


deoplete.nvim is a completion plugin for both standard VIM Neovim, install it and the Phpactor integration as follows:

Plug 'Shougo/deoplete.nvim'
Plug 'kristijanhusak/deoplete-phpactor'

Context Menu

The context menu is the main point of contact with Phpactor. Invoke it on any class, member, variable, method call, or anything really.

If you move over a method and invoke the context menu with :call phpactor#ContextMenu() (or with <Leader>mm as per the configuration above) you should see something like the following:

Method "execute":
[r]eplace_references, (f)ind_references, (g)enerate_method, g(o)to_definition:

Input List

The input list is the window shown to let you choose an item among a list.


This plugin provides two strategy to handle input lists:

  • inputlist: Vim's internal inputlist() function.
  • fzf: Fuzzy finder using Fzf plugin.

You can choose between those strategies by specifying the option g:phpactorInputListStrategy.

Input list strategies auto-detection

When no strategy is defined the plugin will default to the fzf strategy if the Fzf plugin is loaded or to inputlist if it's not.

FZF Multi-selection

Some refactorings will allow you to select multiple entires (for example override method. Use <tab> to toggle selection and CTRL-A/CTRL-D to select all/select none.

See the Fzf documentation for more details.