NeoVim と dein.vim を使ってみる!

  • 81
    いいね
  • 5
    コメント

最近 neobundle から dein.vim へとプラグインマネージャーを変更してる人が増え始めたので便乗して私も変更してみたいと思います。
ついでに Vim も NeoVim へシフトしてみたいと思います。

追記: (3/20/16) load_cache が非推奨になり load_state を使用してと仕様が変わったので内容を一部変更しました
追記: (5/5/16) 一部内容を更新しました
追記: (11/9/16) dein#begin() の第二引数は指定する必要が無いらしいので変更

NeoVim

何でも新世代の Vim らしいです。
まだまだ使いこなせてませんorz

Install

Mac では Homebrew を使用するとても簡単です。

$ brew install neovim/neovim/neovim

たったこれだけでインストールができます

他の環境の方は neovim の wiki に書いてあります

Settings

使用する場合 .bash_profile.zshenv に次の一文を入れないと動かない場合があります。

export XDG_CONFIG_HOME="$HOME/.config"

dein.vim

NeoBundle はオワコンだから dein 使おうと作者の Shougo 氏自身が reddit で発言したそうです。1
使ってみた感想としては速度も早くTOMLファイルで管理ができてとても使いやすかったです!

Install

python3 を使用してるプラグインを動かすため Homebrew を使用して事前にインストールします。

$ brew install python3
$ pip3 install --upgrade neovim

Settings

NeoVim の設定ファイルである $XDG_CONFIG_HOME/nvim/init.vim に書きます。標準では $XDG_CONFIG_HOME$HOME/.config となっています。

~/.config/nvim/init.vim
let g:cache_home = empty($XDG_CACHE_HOME) ? expand('$HOME/.cache') : $XDG_CACHE_HOME
let g:config_home = empty($XDG_CONFIG_HOME) ? expand('$HOME/.config') : $XDG_CONFIG_HOME

" dein {{{
let s:dein_cache_dir = g:cache_home . '/dein'

" reset augroup
augroup MyAutoCmd
    autocmd!
augroup END

if &runtimepath !~# '/dein.vim'
    let s:dein_repo_dir = s:dein_cache_dir . '/repos/github.com/Shougo/dein.vim'

    " Auto Download
    if !isdirectory(s:dein_repo_dir)
        call system('git clone https://github.com/Shougo/dein.vim ' . shellescape(s:dein_repo_dir))
    endif

    " dein.vim をプラグインとして読み込む
    execute 'set runtimepath^=' . s:dein_repo_dir
endif

" dein.vim settings
let g:dein#install_max_processes = 16
let g:dein#install_progress_type = 'title'
let g:dein#install_message_type = 'none'
let g:dein#enable_notification = 1

if dein#load_state(s:dein_cache_dir)
    call dein#begin(s:dein_cache_dir)

    let s:toml_dir = g:config_home . '/dein'

    call dein#load_toml(s:toml_dir . '/plugins.toml', {'lazy': 0})
    call dein#load_toml(s:toml_dir . '/lazy.toml', {'lazy': 1})
    if has('nvim')
        call dein#load_toml(s:toml_dir . '/neovim.toml', {'lazy': 1})
    endif

    call dein#end()
    call dein#save_state()
endif

if has('vim_starting') && dein#check_install()
    call dein#install()
endif
" }}}

追記: dein#begin() の第二引数は指定する必要が無いらしいので変更しました. 詳しくはこちらで言及されてます.

インストールするプラグインをTOML形式で書きます

~/.config/dein/plugins.toml
[[plugins]]
repo = 'Shougo/dein.vim'

[[plugins]] # ステータスライン
repo = 'itchyny/lightline.vim'
hook_add = '''
    let g:lightline = { 
    \   'colorscheme': 'wombat'
    \}
'''

# Lang

[[plugins]] # Haml
repo  = 'tpope/vim-haml'
on_ft = 'haml'

[[plugins]] # Html5
repo  = 'othree/html5.vim'
on_ft = 'html'

[[plugins]] # Toml
repo  = 'cespare/vim-toml'
on_ft = 'toml'

[[plugins]] # Markdown
repo = 'rcmdnk/vim-markdown'
on_ft = ['markdown','mkd']
hook_add = '''
    let g:vim_markdown_frontmatter = 1
    let g:vim_markdown_math = 1
'''

[[plugins]] # Golang
repo = 'fatih/vim-go'
on_ft = 'go'

[[plugins]] # Japanese doc
repo = 'vim-jp/vimdoc-ja'
on_ft = 'help'
hook_add = '''
    set helplang=ja,en
'''

# Colors

[[plugins]] # hybrid
repo = 'w0ng/vim-hybrid'

[[plugins]] # solarized
repo = 'altercation/vim-colors-solarized'

基本はこんな感じで遅延読み込みする方は次のように書きます

~/.config/dein/lazy.toml
[[plugins]] # Codic
repo = 'koron/codic-vim'
on_cmd = 'Codic'

[[plugins]] # Emmet
repo = 'mattn/emmet-vim'
on_i = 1
hook_source = '''
    let g:user_emmet_mode = 'i'
    let g:user_emmet_leader_key='<C-E>'
    let g:use_emmet_complete_tag = 1
    let g:user_emmet_settings = {
    \   'variables': {
    \       'lang': "ja"
    \   },
    \   'indentation': '    '
    \}
'''

[[plugins]] # EditorConfig
repo = 'editorconfig/editorconfig-vim'
on_path = '.*'

Neovim 用の設定

~/.config/dein/neovim.toml
[[plugins]] # 補完
repo = 'Shougo/deoplete.nvim'
if = 'has("python3")'
depends = 'context_filetype.vim'
on_event = 'InsertEnter'
hook_source = '''
    let g:deoplete#enable_at_startup = 1
    let g:deoplete#enable_ignore_case = 1
    let g:deoplete#enable_smart_case = 1

    " <TAB>: completion.
    imap <silent><expr> <TAB> pumvisible() ? "\<C-n>" : <SID>check_back_space() ? "\<TAB>" : deoplete#mappings#manual_complete()
    function! s:check_back_space() abort
        let col = col('.') - 1
        return !col || getline('.')[col - 1]  =~ '\s'
    endfunction

    " <S-TAB>: completion back.
    inoremap <expr><S-TAB>  pumvisible() ? "\<C-p>" : "\<C-h>"
'''

[[plugins]] # unite.vim 後継
repo = 'Shougo/denite.nvim'
if = 'has("python3")'
on_cmd = 'Denite'
hook_post_source = '''
    " file_rec
    if executable('pt')
        call denite#custom#var('file_rec', 'command', ['pt', '--follow', '--nocolor', '--nogroup', '--hidden', '-g', ''])
    endif

    " grep
    if executable('pt')
        call denite#custom#var('grep', 'command', ['pt', '--nogroup', '--nocolor', '--smart-case', '--hidden'])
        call denite#custom#var('grep', 'default_opts', [])
        call denite#custom#var('grep', 'recursive_opts', [])
    endif

    call denite#custom#source('file_mru', 'matchers', ['matcher_fuzzy', 'matcher_project_files'])
    call denite#custom#source('file_mru', 'converters', ['converter_relative_word'])
'''

[[plugins]]
repo = 'Shougo/neomru.vim'
depends = 'denite.nvim'
on_path = '.*'

[[plugins]]
repo = 'Shougo/neoyank.vim'
depends = 'denite.nvim'
on_event = 'TextYankPost'

Tomlファイルの位置や内容は自分の環境に合わせて使ってください!

最後に

といろいろ書かせてもらいましたがまだまだ vim も neovim も使い始めたばかりなので間違ってたところなどありましたらコメント等で教えて下さい

参考人させていただいた記事