🤐

キーワードが短くなったらVimの補完ウィンドウを自動で閉じる

2024/08/10に公開

前回の記事で補完ウィンドウを自動で開く設定を追加したのですが:

https://zenn.dev/kawarimidoll/articles/c14c8bc0d7d73d

いったん入力した文字を削除していくと、候補数が多くなって動作が重くなることがわかりました。
ということで文字削除時に補完ウィンドウを自動で閉じる設定を追加しました。前回の記事と併せて使ってください。

" 補完の最低文字数
" 前回の記事と同じ
let s:MINIMUM_COMPLETE_LENGTH = 3

function! s:auto_cmp_close() abort
  " ファイルパス補完の場合は区切り文字が違うので無視
  if complete_info(['mode']).mode == "files"
    return
  endif

  " カーソル直前の部分(補完元文字列)の文字列を調査
  " 前回の記事と同じ
  let prev_str = slice(getline('.'), 0, charcol('.')-1)
        \ ->substitute('.*[^[:keyword:]]', '', '')

  " 最低文字数に満たなければ`<c-x><c-z>`で補完を終了する
  if strchars(prev_str) < s:MINIMUM_COMPLETE_LENGTH
    call feedkeys("\<c-x>\<c-z>", 'ni')
  endif
endfunction

" TextChangedPで補完ウィンドウ展開時に発火させる
autocmd TextChangedP * call s:auto_cmp_close()

Q: 前回の記事の関数に処理を追加するのではダメなの?
A: 前回の記事の関数はInsertCharPre、つまり文字の入力で発火します。文字を削除したときは発火しないので、別の関数を定義する必要があります。

Discussion