VimでPHP開発環境を作成

チップスは概要のみ掲載しているため、詳細は[.vimrc](https://raw.githubusercontent.com/KazuakiM/dotfiles/master/.vim/vimrc)を参照して下さい。

# Vim本体設定
## PHP設定
``` vim:.vimrc
" $VIMRUNTIME/syntax/php.vim
let g:php_baselib       = 1
let g:php_htmlInStrings = 1
let g:php_noShortTags   = 1
let g:php_sql_query     = 1
```
## DB設定
おそらくデフォルトでは'sqloracle'になっているかと思われます。使用しているDBが異なる場合には、使用しているDBに変更する事でsyntax highlight機能がいい感じに機能するようになります。

``` vim:.vimrc
" $VIMRUNTIME/syntax/sql.vim
let g:sql_type_default = 'mysql' " MySQLの場合
```

# LSP設定

[Wiki](https://github.com/prabirshrestha/vim-lsp/wiki/Servers-PHP#intelephense)で[intelephense](https://www.npmjs.com/package/intelephense)がおすすめとありますので、  
そちらをインストールします。

```
npm -g install intelephense
```

# Composer設定

JetBrains社製のPHPStormの関数情報をグローバルにインストールします。

```
$ composer global require "jetbrains/phpstorm-stubs:dev-master"
```

# Plugin設定
## ディレクトリ作成
``` sh
$ mkdir -p \
    $HOME/.vim/dein.vim \
    $HOME/.vim/neosnippet.vim \
    $HOME/.vim/tags
```

## Pluginインストール
Neobundle作者のShougoさんの新しいプラグイン管理プラグイン「<a href="https://github.com/Shougo/dein.vim" target="_blank">dein.vim</a>」を設定します。

``` vim:.vimrc
let s:deinDir    = !exists('s:deinDir') ? $HOME . '/.vim/dein.vim' : s:deinDir
let &runtimepath = &runtimepath . ',' . s:deinDir . '/repos/github.com/Shougo/dein.vim'
" dein.vim
if dein#load_state(s:deinDir)
    call dein#begin(s:deinDir)
    call dein#load_dict({
    \    'KazuakiM/neosnippet-snippets':               {},
    \    'prabirshrestha/async.vim':                   {},
    \    'prabirshrestha/asyncomplete.vim':            {},
    \    'prabirshrestha/asyncomplete-file.vim':       {},
    \    'prabirshrestha/asyncomplete-lsp.vim':        {},
    \    'prabirshrestha/asyncomplete-neosnippet.vim': {},
    \    'prabirshrestha/vim-lsp':                     {},
    \    'Shougo/dein.vim':                            {},
    \    'Shougo/neosnippet.vim':                      {},
    \    'Shougo/vimproc.vim':                         {'build': 'make'},
    \    'StanAngeloff/php.vim':                       {'on_ft': 'php'},
    \    'thinca/vim-quickrun':                        {},
    \})
    call dein#end()
    call dein#save_state()
endif
filetype plugin indent on
syntax enable
```

## Universal Ctags設定
tagsファイルを適切に生成することでタグジャンプが可能となり、時間短縮が期待できます。

### 設定ファイル作成
Universal Ctags設定ファイルの設置位置が変わりました。  
詳しくはmanページをご参照下さい。

```:_.ctags
--exclude=*min.js
--input-encoding=UTF-8
--langmap=PHP:+.php.inc.tpl
--pattern-length-limit=300
--recurse=yes
```

### alias設定
``` sh:.bashrc.local
#.bashrc.localみたいな感じでGitHub管理外でよしなに管理する
tagsPhpCmd='ctags --languages=php -f'
tagsVariable=''
tagsVariable="$tagsVariable cd $HOME/sample1; $tagsPhpCmd $HOME/.vim/tags/sample1.tags $HOME/sample1;"
tagsVariable="$tagsVariable cd $HOME/sample2; $tagsPhpCmd $HOME/.vim/tags/sample2.tags $HOME/sample2;"
tagsVariable="$tagsVariable cd;"
alias TAGS=$tagsVariable
```

### .vimrc設定
``` vim:.vimrc
".vimrc.localみたいな感じでGitHub管理外でよしなに管理する
augroup MyTagsAutoCmd
    autocmd!
    autocmd BufNewFile,BufRead $HOME/sample1/*.php setlocal tags=$HOME/.vim/tags/sample1.tags
    autocmd BufNewFile,BufRead $HOME/sample2/*.php setlocal tags=$HOME/.vim/tags/sample2.tags
augroup END
```

## LSP環境構築
LSPでは以下の機能を実現してもらいます。LSPにより多くのプログラミング言語において特殊な設定が不要となります。
* 関数説明(ポップアップ)
* 補完機能
* Syntaxチェック

``` vim:.vimrc
" asyncomplete-neosnippet.vim
" neosnippet-snippets
" neosnippet.vim
" asyncomplete-file.vim
" asyncomplete-lsp.vim
" vim-lsp
" asyncomplete.vim
let g:lsp_preview_keep_focus = 0
nmap <silent> <Subleader>N <Plug>(lsp-previous-error)
nmap <silent> <Subleader>n <Plug>(lsp-next-error)
nmap <silent> <Subleader>b <Plug>(lsp-document-diagnostics)
nmap <silent> K <Plug>(lsp-hover)
augroup MyAsyncomplete
    autocmd!
    autocmd User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#neosnippet#get_source_options({
    \   'name': 'neosnippet',
    \   'completor': function('asyncomplete#sources#neosnippet#completor'),
    \   'whitelist': ['*'],
    \ }))

    autocmd User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#file#get_source_options({
    \   'name': 'file',
    \   'completor': function('asyncomplete#sources#file#completor'),
    \   'priority': 10,
    \   'whitelist': ['*'],
    \ }))

    autocmd User lsp_setup call lsp#register_server({
    \ 'name': 'php',
    \ 'cmd': {server_info->['node', expand('/usr/local/lib/node_modules/intelephense/lib/intelephense.js'), '--stdio']},
    \ 'initialization_options': {'storagePath': s:envHome . '.cache/intelephense'},
    \ 'whitelist': ['php'],
    \ })
augroup END
```

## Vim内でPHPプログラム実行設定
Quickrunを応用し、円滑にコマンドを実行できるようにします。

``` vim:.vimrc
" vim-quickrun
nnoremap <Leader>run  :<C-u>QuickRun<CR>
nnoremap <Leader>phpf :<C-u>QuickRun<Space>phpfixer<CR>
nnoremap <Leader>phpi :<C-u>QuickRun<Space>phpinfo<CR>
nnoremap <Leader>phpt :<C-u>QuickRun<Space>phpunit<CR>
let g:quickrun_config = {
\    '_': {
\        'hook/close_buffer/enable_empty_data': 0,
\        'hook/close_buffer/enable_failure':    0,
\        'outputter':                           'multi:buffer:quickfix',
\        'outputter/buffer/close_on_empty':     1,
\        'outputter/buffer/split':              ':botright',
\        'runner':                              'job'
\    },
\    'php': {
\        'command':                             'php',
\        'exec':                                '%c %s',
\        'hook/close_buffer/enable_empty_data': 0,
\        'hook/close_buffer/enable_failure':    0,
\        'outputter':                           'buffer',
\        'outputter/buffer/close_on_empty':     0,
\        'outputter/buffer/into':               0,
\        'outputter/buffer/split':              ':botright 7sp'
\    },
\    'phpfixer': {
\        'command':                'php-cs-fixer',
\        'cmdopt':                 'fix',
\        'exec':                   '%c %o %s:p',
\        'outputter':              'buffer',
\        'outputter/buffer/into':  1,
\        'outputter/buffer/split': ':botright 7sp',
\        'runner':                 'system'
\    },
\    'phpinfo': {
\        'command':   'php',
\        'cmdopt':    '-info',
\        'exec':      '%c %o',
\        'outputter': 'buffer'
\    },
\    'phpunit': {
\        'command':   'phpunit',
\        'exec':      '%c %s',
\        'outputter': 'buffer'
\    },
\}
```