Fri May 01 2020, in programming
The following instructions are the basic steps I had when I
installed CoC.vim
and Intelephense
to have a VSCode or
PHPStorm like environment inside my Neovim.
What we need first is to install a Neovim package manager. My
suggestion is vim-plug
. After installing it, install the
CoC.vim
package so we can have our autocompletion and
code navigation functions in place.
After installing CoC.vim
, run the following command inside
Neovim:
:CocInstall coc-phpls
This will install the language server (yes, the same used by
VSCode) for the PHP Language. It is required to allow
Intelephense
to work properly.
After that we need to install Intelephense
itself. Much like
any Language Server for VSCode, it is a NPM package. So, if
you still don't have Node, please install the latest one
(LTS or Head) before proceeding. Once you have Node in
place, run the following command in the terminal of
your choice.
npm -g i intelephense
Note: This command will install
Intelephense
globally.
After the installation completes, it's necessary to add the
Intelephense License Key to be able to use all of its
features. To do so, we run the following command
inside of Neovim to open Coc.vim
config file:
:CocConfig
Once open, place the following content and substitute the
placeholde <your-key-here>
for your actual Intelephense
License Key:
{
"intelephense.licenseKey": "<your-key-here>"
}
Open the Neovim configuration ~/.config/nvim/init.vim
and
paste the following code anywhere after call plug#end()
:
if executable('intelephense')
augroup LspPHPIntelephense
au!
au User lsp_setup call lsp#register_server({
\ 'name': 'intelephense',
\ 'cmd': {server_info->[&shell, &shellcmdflag, 'intelephense --stdio']},
\ 'whitelist': ['php'],
\ 'initialization_options': {'storagePath': '/tmp/intelephense'},
\ 'workspace_config': {
\ 'intelephense': {
\ 'files': {
\ 'maxSize': 1000000,
\ 'associations': ['*.php', '*.phtml'],
\ 'exclude': [],
\ },
\ 'completion': {
\ 'insertUseDeclaration': v:true,
\ 'fullyQualifyGlobalConstantsAndFunctions': v:false,
\ 'triggerParameterHints': v:true,
\ 'maxItems': 100,
\ },
\ 'format': {
\ 'enable': v:true
\ },
\ },
\ }
\})
augroup END
endif
" Use tab for trigger completion with characters ahead and navigate.
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config.
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
" Use <c-space> to trigger completion.
inoremap <silent><expr> <c-space> coc#refresh()
" Use <cr> to confirm completion, `<C-g>u` means break undo chain at current
" position. Coc only does snippet and additional edit on confirm.
" <cr> could be remapped by other vim plugin, try `:verbose imap <CR>`.
if exists('*complete_info')
inoremap <expr> <cr> complete_info()["selected"] != "-1" ? "\<C-y>" : "\<C-g>u\<CR>"
else
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
endif
" Use `[g` and `]g` to navigate diagnostics
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)
" GoTo code navigation.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
" Use K to show documentation in preview window.
nnoremap <silent> K :call <SID>show_documentation()<CR>
function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
" Highlight the symbol and its references when holding the cursor.
autocmd CursorHold * silent call CocActionAsync('highlight')
" Symbol renaming.
nmap <leader>rn <Plug>(coc-rename)
" Formatting selected code.
xmap <leader>f <Plug>(coc-format-selected)
nmap <leader>f <Plug>(coc-format-selected)
augroup mygroup
autocmd!
" Setup formatexpr specified filetype(s).
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
" Update signature help on jump placeholder.
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end
" Applying codeAction to the selected region.
" Example: `<leader>aap` for current paragraph
xmap <leader>a <Plug>(coc-codeaction-selected)
nmap <leader>a <Plug>(coc-codeaction-selected)
" Remap keys for applying codeAction to the current line.
nmap <leader>ac <Plug>(coc-codeaction)
" Apply AutoFix to problem on the current line.
nmap <leader>qf <Plug>(coc-fix-current)
" Introduce function text object
" NOTE: Requires 'textDocument.documentSymbol' support from the language server.
xmap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap if <Plug>(coc-funcobj-i)
omap af <Plug>(coc-funcobj-a)
" Use <TAB> for selections ranges.
" NOTE: Requires 'textDocument/selectionRange' support from the language server.
" coc-tsserver, coc-python are the examples of servers that support it.
nmap <silent> <TAB> <Plug>(coc-range-select)
xmap <silent> <TAB> <Plug>(coc-range-select)
" Add `:Format` command to format current buffer.
command! -nargs=0 Format :call CocAction('format')
" Add `:Fold` command to fold current buffer.
command! -nargs=? Fold :call CocAction('fold', <f-args>)
" Add `:OR` command for organize imports of the current buffer.
command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')
" Add (Neo)Vim's native statusline support.
" NOTE: Please see `:h coc-status` for integrations with external plugins that
" provide custom statusline: lightline.vim, vim-airline.
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}
" Mappings using CoCList:
" Show all diagnostics.
nnoremap <silent> <space>a :<C-u>CocList diagnostics<cr>
" Manage extensions.
nnoremap <silent> <space>e :<C-u>CocList extensions<cr>
" Show commands.
nnoremap <silent> <space>c :<C-u>CocList commands<cr>
" Find symbol of current document.
nnoremap <silent> <space>o :<C-u>CocList outline<cr>
" Search workspace symbols.
nnoremap <silent> <space>s :<C-u>CocList -I symbols<cr>
" Do default action for next item.
nnoremap <silent> <space>j :<C-u>CocNext<CR>
" Do default action for previous item.
nnoremap <silent> <space>k :<C-u>CocPrev<CR>
" Resume latest coc list.
nnoremap <silent> <space>p :<C-u>CocListResume<CR>
Reload the source file on your Neovim by running the following command inside Neovim while the configuration file is open:
:source %
This will use the currently opened and selected file (it should be the configuration one) and use it to configure Neovim.
Restart your Neovim and open any PHP file. In the statusline you
should be able to see a message like indexing php files
. It
may take some time, depending on the size of your project.
Once it's done, you will be able to use the shortcuts and code autocompletion just like in VSCode or PHPStorm. With the power of Intelephense, we basically the same powers as PHPStorm with the extra power the Neovim provides us. A win-win situation!
If you want to see my currently incomplete Neovim configuration file, you can check this Gist file.