vimの補完プラグインasyncomplete-around.vimを作りました

asyncomplete-around.vimとは

asyncomplete-around.vimprabirshrestha/asyncomplete.vimのSourceプラグインです。

github.com

現在のカーソル位置を中心として上下20行(デフォルト値)に存在する単語を補完対象として表示します。

asyncomplete.vimは補完ポップアップを表示するプラグインで、これに適した補完対象(Source)を渡すプラグインと組み合わせることでポップアップに単語が表示され補完できるようになります。

asyncomplete.vimのソースプラグインとして代表的なものとして、LSPプラグインprabirshrestha/vim-lspprabirshrestha/asyncomplete-lsp.vimがあります。

作った経緯

もともと補完プラグインとしてShougo/deoplete.nvimを使っていました。
使用感に不満はありませんでしたが、Python環境を用意するのが面倒だと感じていました。

LSPとしてprabirshrestha/vim-lspを使っていたため同じ作者のprabirshrestha/asyncomplete.vimに乗り換えたところ、Buffer関連の補完が少し弱く、LSPで補完できないちょっとした単語を繰り返し入力することを面倒に感じていました。
少し調べると独自の補完ソースを追加できるとの記載があったため、asyncomplete-around.vimを作成することにしました。

オススメ設定

ここで私の設定を紹介します。
コードの詳細はGitHubにて公開しているため、適宜そちらを参照してください。

github.com

補完範囲の設定

私は画面に表示されている単語が補完できれば良いかなと思っているため50行にしています。

let g:asyncomplete_around_range = 50

Priorityの設定

asyncomplete.vimpreprocessorという仕組みがあり、補完の表示内容を編集することができます。
今回はそれを利用して補完ソースの表示順を使いやすいように制御します。

各ソースに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は非同期化されていないため場合によってはカクつくことがあるかもしれません。
そのため、まずは非同期化を進めていきたいと思います。