vimで開発とかしてみたいので、とりあえずプラグインを入れてそれっぽくする（PHP）

いつもIDE（NetBeans）で開発を行っていましたが、vimかっこいい、使えるようになりたいと思ったので、
とりあえずプラグイン入れてなんかそれっぽくできるようにしていった時の備忘録です。

ちなみに私のvimスキルは、入力とか移動とか検索くらいしかできない感じの人です。
変な箇所があれば突っ込んでいただけると大変ありがたいです。

## vimのバージョンを8以上・luaオプション付きにする
プラグインによって上記条件を満たしていたほうが良い場合があるため

```bash
# とってくる
sudo curl -L https://copr.fedorainfracloud.org/coprs/unixcommunity/vim/repo/epel-7/unixcommunity-vim-epel-7.repo -o /etc/yum.repos.d/unixcommunity-vim-epel-7.repo

# アップデート
sudo yum -y update vim*

# バージョン確認
vim --version
# luaが有効か確認（-lua となっていたら無効、　+luaとなっていたら有効）
vim --version | grep lua
```

参考：[CentOS 7 に vim 8 を導入する方法 : パパは家族の長男　～都会暮らしを楽しく生きたい～](http://www.yukihisa08.com/archives/9683122.html)

## dein.vimインストール

プラグインマネージャーにdeinを使用する

* **[Shougo/dein.vim](https://github.com/Shougo/dein.vim)**

```bash
# 任意のディレクトリで
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh

# インストールするディレクトリ作成（名前任意）
mkdir -p ~/.vim/dein

# インストール
# ここで出力されたスクリプトを、.vimrcに張り付け設定を記載する
sh ./installer.sh ~/.vim/dein

# これはもういらないので削除
rm ./installer.sh
```

## .vimrcを編集

先ほどdeinをインストールした際に出力されたものを、`.vimrc`に張り付けてここに使用したいプラグインを記載していく。
基本は出力されたものそのまま使用したが、以下だけ修正。

* ホームディレクトリのパスを環境変数に変更
* インストールされていないものは自動インストールされるようにコメントアウト外す

```.vim:.vimrc
"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=$HOME/.vim/dein/repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('$HOME/.vim/dein')
  call dein#begin('$HOME/.vim/dein')

  " Let dein manage dein
  " Required:
  call dein#add('$HOME/.vim/dein/repos/github.com/Shougo/dein.vim')

  " 追加したいプラグインをここに記載
  " こんな感じで↓
  call dein#add('scrooloose/nerdtree')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" インストールされていないものは自動インストールする
if dein#check_install()
  call dein#install()
endif
"End dein Scripts-------------------------

```
## とりあえず今はこれだけ覚えておく

#### プラグイン追加
```.vim:
call dein#add('scrooloose/nerdtree')
```

もし、「やっぱこれ使わない」と思ったら、これ消しちゃえば無効になる（インストールした本体削除したい場合は別途操作必要）

#### 追加したプラグインをインストール

vimを起動すれば、勝手にインストールしてくれる。

## これでプラグイン入れてく準備完了
よし、いろいろ入れていくぞ


## 先に、設定を終えた.vimrcを晒します

**[.vimrc](https://github.com/carrry0209/dotfiles/blob/be1456d526222509c6b5526bc22ecdef69c1d6d6/.vimrc)**

※プラグイン以外の部分は、以下を参考に（完全にコピペ）させていただいてます。
[何も考えず~/.vimrcにこれを書くんだ！ 〜vim初心者によるvim初心者のためのvim入門〜 - Qiita](https://qiita.com/morikooooo/items/9fd41bcd8d1ce9170301)

## NerdTree
* **[scrooloose/nerdtree](https://github.com/scrooloose/nerdtree)**

こちらの設定をほぼ全部真似させていただきました。
[[Vim Plugin] NERDTreeのオススメ設定とコマンド一覧 - KAMIYAのアレ](https://kamiya555.github.io/2015/10/14/nerdtree-command/)

使用方法はまだよく分かっていないので、使いながら覚えていく

## 閉じ括弧補完

* **[cohama/lexima.vim](https://github.com/cohama/lexima.vim)**

![lexima.gif](https://qiita-image-store.s3.amazonaws.com/0/197235/97038405-4c4d-2e88-1548-97ea10233149.gif)



## HTML関連
#### 閉じタグ補完

* **[alvan/vim-closetag](https://github.com/alvan/vim-closetag)**

![closetag.gif](https://qiita-image-store.s3.amazonaws.com/0/197235/eb94b21a-cb5f-0feb-3586-6f9808718b83.gif)


```.vim:.vimrc
let g:closetag_filenames = '*.html,*.xhtml,*.php'
let g:closetag_xhtml_filenames = '*.xhtml,*.jsx'
let g:closetag_filetypes = 'html,xhtml,php'
let g:closetag_xhtml_filetypes = 'xhtml,jsx'

let g:closetag_emptyTags_caseSensitive = 1
let g:closetag_shortcut = '>'
let g:closetag_close_shortcut = '<leader>>'
```

`>`を打ったら閉じタグを自動挿入されるが、1回消したりなんなりした時のために
`</`と打ったら対応する閉じタグを自動挿入してくれるっぽい設定も書いとく

```.vim:.vimrc
augroup MyXML
  autocmd!
  autocmd Filetype xml inoremap <buffer> </ </<C-x><C-o>
  autocmd Filetype html inoremap <buffer> </ </<C-x><C-o>
  autocmd Filetype php inoremap <buffer> </ </<C-x><C-o>
augroup END
```

#### 対応するタグをハイライト

* **[Valloric/MatchTagAlways](https://github.com/Valloric/MatchTagAlways)**

![tagmatch.gif](https://qiita-image-store.s3.amazonaws.com/0/197235/1c761479-9e74-365b-61ea-fa29feab2809.gif)

```.vim:.vimrc
"オプション機能ONにする
let g:mta_use_matchparen_group = 1

"使用するファイルタイプ(phpを追加)
let g:mta_filetypes = {
    \ 'html' : 1,
    \ 'xhtml' : 1,
    \ 'xml' : 1,
    \ 'jinja' : 1,
    \ 'php' : 1,
    \}
```


## コード補完

* **[Shougo/neocomplete.vim](https://github.com/Shougo/neocomplete.vim)**
* **[Shougo/neosnippet.vim](https://github.com/Shougo/neosnippet.vim)**
* **[Shougo/neosnippet-snippets](https://github.com/Shougo/neosnippet-snippets)**

![hokan.gif](https://qiita-image-store.s3.amazonaws.com/0/197235/a651e89d-be01-b0e1-77f8-93605270bc53.gif)


#### PHPの辞書ファイル作成

```bash
# 辞書ファイルを置いとく任意のフォルダ作成
mkdir .vim/dein/dict/
# 作成
php -r '$f=get_defined_functions();echo join("\n",$f["internal"]);' | sort > .vim/dein/dict/php.dict
```

参考：[【vim】neobundle導入&neocomplcacheでPHP補完 - とあるプログラマの備忘録](http://raharu0425.hatenablog.com/entry/20130404/1365056221)

####または、スニペットファイルを作成
こちらのファイルを使用させていただいています。
https://qiita.com/tekkoc/items/8897cdf378305c4e547d

以下設定で辞書ファイルもスニペットファイルも指定していますが、
スニペットファイル指定しているなら辞書ファイルいらなそうだけど備忘録のために記載しています。

```.vim:.vimrc
"----------------------------------------------------------
"  neosnippet-snippets
"----------------------------------------------------------
" Plugin key-mappings.
" Note: It must be "imap" and "smap".  It uses <Plug> mappings.
" <C-k>で、TARGETのところへジャンプ
imap <C-k>     <Plug>(neosnippet_expand_or_jump)
smap <C-k>     <Plug>(neosnippet_expand_or_jump)
xmap <C-k>     <Plug>(neosnippet_expand_target)

" SuperTab like snippets behavior.
" Note: It must be "imap" and "smap".  It uses <Plug> mappings.
"imap <expr><TAB>
" \ pumvisible() ? "\<C-n>" :
" \ neosnippet#expandable_or_jumpable() ?
" \    "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"

" 独自スニペットファイルのあるディレクトリを指定
let g:neosnippet#enable_snipmate_compatibility = 1
let g:neosnippet#snippets_directory=$HOME.'/.vim/dein/vim-neosnippets/'

" For conceal markers.
if has('conceal')
  set conceallevel=2 concealcursor=niv
endif


"----------------------------------------------------------
"  neocomplete.vim
"----------------------------------------------------------
"Note: This option must be set in .vimrc(_vimrc).  NOT IN .gvimrc(_gvimrc)!
" Disable AutoComplPop.
let g:acp_enableAtStartup = 0
" Use neocomplete.
let g:neocomplete#enable_at_startup = 1
" Use smartcase.
let g:neocomplete#enable_smart_case = 1
" Set minimum syntax keyword length.
let g:neocomplete#sources#syntax#min_keyword_length = 3

" 辞書ファイルを設定（phpを追加）
let g:neocomplete#sources#dictionary#dictionaries = {
    \ 'default' : '',
    \ 'php' : $HOME.'/.vim/dein/dict/php.dict'
    \ }

" Define keyword.
if !exists('g:neocomplete#keyword_patterns')
    let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '\h\w*'

" Plugin key-mappings.
inoremap <expr><C-g>     neocomplete#undo_completion()
inoremap <expr><C-l>     neocomplete#complete_common_string()

" Recommended key-mappings.
" <CR>: close popup and save indent.
inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
  return (pumvisible() ? "\<C-y>" : "" ) . "\<CR>"
  " For no inserting <CR> key.
  "return pumvisible() ? "\<C-y>" : "\<CR>"
endfunction
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
" <C-h>, <BS>: close popup and delete backword char.
inoremap <expr><C-h> neocomplete#smart_close_popup()."\<C-h>"
inoremap <expr><BS> neocomplete#smart_close_popup()."\<C-h>"
" Close popup by <Space>.
"inoremap <expr><Space> pumvisible() ? "\<C-y>" : "\<Space>"

" AutoComplPop like behavior.
"let g:neocomplete#enable_auto_select = 1

" Shell like behavior(not recommended).
"set completeopt+=longest
"let g:neocomplete#enable_auto_select = 1
"let g:neocomplete#disable_auto_complete = 1
"inoremap <expr><TAB>  pumvisible() ? "\<Down>" : "\<C-x>\<C-u>"

" Enable omni completion.
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags
autocmd FileType php setlocal omnifunc=phpcomplete#CompletePHP

" Enable heavy omni completion.
if !exists('g:neocomplete#sources#omni#input_patterns')
  let g:neocomplete#sources#omni#input_patterns = {}
endif
let g:neocomplete#sources#omni#input_patterns.php = '[^. \t]->\h\w*\|\h\w*::'
```

設定はほとんど公式READMEをコピペです。辞書ファイルのパス・スニペットファイルのパスは設定して、
必要なさそうなのは消し、よく分からないものは残しました。


## Git関連

### HEADとの差分があるところを分かるようにする

* **[airblade/vim-gitgutter](https://github.com/airblade/vim-gitgutter)**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/c6524ddc-820b-1bf7-e147-8c637f1b1890.png)

```.vim:.vimrc
" 記号更新のタイミングを早くする
set updatetime=250
" 行に対するハイライトを有効にする場合はこちらを
let g:gitgutter_highlight_lines = 1
```

参考：[Vimメモ : vim-gitgutterで差分を左端に表示する - もた日記](https://wonderwall.hatenablog.com/entry/2016/03/26/211710)

### いろいろできるやつ

* **[tpope/vim-fugitive](https://github.com/tpope/vim-fugitive)**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/3bc7fa63-cd8d-7d62-3559-99c41fdea79b.png)
これは`:Gdiff`で差分を確認したもの。vim上でgitのあれやこれやができる

参考：[VimmerなGit使いはfugitive.vimを今すぐ入れたほうがいい - SELECT * FROM life;](http://blog.yuku-t.com/entry/20110427/1303868482)

## その他

### 自動インデントを外したい

dein.vimの設定してるスクリプトの中にある以下をoffにする（onで元通り）

```.vim:.vimrc
" Required:
filetype plugin indent off
```

## とりあえず終わる
まだまだいろいろ足りないので、随時直していきたい