coc.nvim と vim-endwise でちょっとだけハマった

TL;DR

github.com

環境

Plug 'itchyny/lightline.vim'
Plug 'ryanoasis/vim-devicons'
Plug 'scrooloose/nerdtree'
Plug 'previm/previm'
Plug 'Xuyuanp/nerdtree-git-plugin'
Plug 'tpope/vim-endwise'
Plug 'neoclide/coc.nvim', {'branch': 'release'}

経緯

勧められたのもあり、気になっていた coc.nvim と呼ばれるプラグインを使い始めたところ、ちょっとだけハマったことがあったので、記録しておこうと思います。 今思えば、公式リポジトリの README を雑に読みながら動かした事が原因だったなと ... :(

github.com

どこでハマったのか

公式の README には丁寧にも、 example-vim-configuration なるものがあります。 !important とコメントがあるのですが、そこを読まずに内容を丸々コピペして、動かしてみたら、 vim-endwise で設定されているキーマップと、以下のコピペした一部分の設定内容が、コンフリクトを起こした次第です。

コピペした内容の一部

" 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

vim-endwise のコード ~/.vim/plugged/vim-endwise/plugin/endwise.vim+133

if !exists('g:endwise_no_mappings')
  if maparg('<CR>','i') =~# '<C-R>=.*crend(.)<CR>\|<\%(Plug\|SNR\|SID\)>.*End'
    " Already mapped
  elseif maparg('<CR>','i') =~? '<cr>'
    exe "imap <script> <C-X><CR> ".maparg('<CR>','i')."<SID>AlwaysEnd"
    exe "imap <silent> <script> <CR>      ".maparg('<CR>','i')."<SID>DiscretionaryEnd"
  elseif maparg('<CR>','i') =~# '<Plug>\w\+CR'
    exe "imap <C-X><CR> ".maparg('<CR>', 'i')."<Plug>AlwaysEnd"
    exe "imap <silent> <CR> ".maparg('<CR>', 'i')."<Plug>DiscretionaryEnd"
  else
    imap <script> <C-X><CR> <CR><SID>AlwaysEnd
    imap <CR> <CR><Plug>DiscretionaryEnd
  endif
  autocmd endwise CmdwinEnter * call s:teardownMappings()
endif

何が起きたか

Enter を押すと改行されずに complete_info()["selected"] != "-1" と言う文字列が入力されるようになりました。

解決方法

解決方法としては、被ったマッピングの設定を解消してあげるだけで良さそうです。今回、私は ただただ公式の README からコピペしたマッピングの設定 を一旦削除することで対応しました。 削除しなくても、 以下のような設定を追記するだけで、コンフリクトの解消ができるみたいです。

let g:endwise_no_mappings = v:true
inoremap <expr> <Plug>CustomCocCR pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
imap <CR> <Plug>CustomCocCR<Plug>DiscretionaryEnd

とりあえずコピペした内容を消して、vim-endwise 側の設定も触らず、公式の wiki にあった以下の設定と、コピペしていたマッピング以外の設定を入れておきました。

Completion with sources · neoclide/coc.nvim Wiki · GitHub

" coc.vim -------------------------------------------------------
set hidden
set nobackup
set nowritebackup
set cmdheight=2
set updatetime=300
set shortmess+=c
set signcolumn=yes

inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
" ---------------------------------------------------------------

そして、補完候補が見れるようになりました。 Tabで一個下の候補を選択できて、Shift を押しながら Tab で一個上の候補を選択できるようになりました。

f:id:sorehaedamame:20200510010642p:plain

あとはコピペした設定が実は何をしようとしていたのか等を見つつ、 coc.nvim の設定を充実させていけたらなと思っています。