vimの補完プラグインasyncomplete-around.vimを作りました
asyncomplete-around.vimとは
asyncomplete-around.vim
は prabirshrestha/asyncomplete.vimのSourceプラグインです。
現在のカーソル位置を中心として上下20行(デフォルト値)に存在する単語を補完対象として表示します。
asyncomplete.vim
は補完ポップアップを表示するプラグインで、これに適した補完対象(Source)を渡すプラグインと組み合わせることでポップアップに単語が表示され補完できるようになります。
asyncomplete.vim
のソースプラグインとして代表的なものとして、LSPプラグインprabirshrestha/vim-lspのprabirshrestha/asyncomplete-lsp.vimがあります。
作った経緯
もともと補完プラグインとしてShougo/deoplete.nvimを使っていました。
使用感に不満はありませんでしたが、Python環境を用意するのが面倒だと感じていました。
LSPとしてprabirshrestha/vim-lsp
を使っていたため同じ作者のprabirshrestha/asyncomplete.vim
に乗り換えたところ、Buffer関連の補完が少し弱く、LSPで補完できないちょっとした単語を繰り返し入力することを面倒に感じていました。
少し調べると独自の補完ソースを追加できるとの記載があったため、asyncomplete-around.vim
を作成することにしました。
オススメ設定
ここで私の設定を紹介します。
コードの詳細はGitHubにて公開しているため、適宜そちらを参照してください。
補完範囲の設定
私は画面に表示されている単語が補完できれば良いかなと思っているため50行にしています。
let g:asyncomplete_around_range = 50
Priorityの設定
asyncomplete.vim
はpreprocessor
という仕組みがあり、補完の表示内容を編集することができます。
今回はそれを利用して補完ソースの表示順を使いやすいように制御します。
各ソースにPriorityを設定し、その値をもとにソートする関数をg:asyncomplete_preprocessor
に設定します。
function! s:sort_by_priority_preprocessor(options, matches) abort ... endfunction let g:asyncomplete_preprocessor = [function('s:sort_by_priority_preprocessor')] call asyncomplete#register_source(asyncomplete#sources#around#get_source_options({ \ 'name': 'around', \ 'allowlist': ['*'], \ 'priority': 10, \ 'completor': function('asyncomplete#sources#around#completor'), \ }))
私はasyncomplete-lsp.vim
, asyncomplete-file.vim
, asyncomplete-around.vim
という順番で表示させています。
asyncomplete-around.vim
は指定範囲内のマッチした単語が全て候補として表示されるため、LSPで候補となっている関数や変数よりも上に表示されてしまうと、とても使いづらくなってしまうためこの順番にしています。
asyncomplete-around.vimの今後
しばらく使用してみて私の要望を満たすものだと確信できたので、上位互換のプラグインが登場しない限り今後も使用、メンテナンスをしていきます。
asyncomplete-around.vim
は非同期化されていないため場合によってはカクつくことがあるかもしれません。
そのため、まずは非同期化を進めていきたいと思います。