【Vimの補完機能】他エディタと同じようにEnterで最初の補完候補を挿入できるようにしたい

qlog公式からのメッセージ:ログインをしていなくてもいいねを押すことができます!

自分がしょっちゅう沼にはまり解決した後は、教訓としてドキュメントを読んだ方が良いという結論に行き着くのですが今回も「公式ドキュメントを読んだ方が良い」という結論になりました。

結論からコードを先に書くと

set completeopt=menu,menuone,noinsert
inoremap <expr><CR>  pumvisible() ? "<C-y>" : "<CR>"
inoremap <expr> <TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
inoremap <expr> <S-TAB> pumvisible() ? "\<C-p>" : "\<S-TAB>"
" これはasyncompleteのプラグインを使用している
let g:asyncomplete_auto_completeopt = 0

自分は以上のように設定しました。

menuの1個目をすでに選択状態にして、それを自動で補完しないようにする。
エンターを押した際に補完ができ、補完候補をTAB等で移動という設定にしました。

しかし動かない

当初は

set completeopt=menu,menuone,noinsert
inoremap <expr><CR>  pumvisible() ? "<C-y>" : "<CR>"
inoremap <expr> <TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
inoremap <expr> <S-TAB> pumvisible() ? "\<C-p>" : "\<S-TAB>"

しか設定しておらず、動きませんでした。

ググったりChatGPTに聞いたりして何度も何度も悩まされました。
自分はvimが初めてというか昨日vimを始めたのですが、いまいちよく分からず、ググっては人のコードを.vimrcにコピペして貼るというかなりロジカルではない方法で解決しようとしていました。

  Plug 'prabirshrestha/async.vim'
  Plug 'prabirshrestha/asyncomplete.vim'
  Plug 'prabirshrestha/asyncomplete-lsp.vim'

1,2時間経ってようやく「どうやらこのプラグインが競合しているっぽい」という仮説を立てました。

ドキュメント

一発でした。。。

g:asyncomplete_auto_completeopt               *g:asyncomplete_auto_completeopt*

    Type: |Number|
    Default: 1

    Set default `completeopt` options. These are `menuone,noinsert,noselect`.
    This effectively overwrites what ever the user has in their config file.

    Set to 0 to disable.

ユーザーの.vimrcに書いてあるcompleteoptのやつを上書きするから嫌なら無効にしてねという意味見たいです。

let g:asyncomplete_auto_completeopt = 0

と設定し、無事解決しました。

後日 let g:asyncomplete_auto_completeopt = 0 の設定を消しました。
サジェストの最初にあるものをすぐにエンターで選べる利便性があまりないためです。

結論

やっぱりドキュメントをなかなか読まない癖と仮説立てず適当にいじる癖は本当に直した方がいいと感じました。


yusa