TL;DR
環境
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 を雑に読みながら動かした事が原因だったなと ... :(
どこでハマったのか
公式の 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 で一個上の候補を選択できるようになりました。
あとはコピペした設定が実は何をしようとしていたのか等を見つつ、 coc.nvim の設定を充実させていけたらなと思っています。