Vim で Unicode 記号の入力補完をする

Julia 言語の特徴の一つとして広範な Unicode 記号を識別子として使える、というものがあります。その有用性について最初は懐疑的だったのですが、一度使ってしまうともう戻れなくなりました。過去のコードが mu だの theta だの phi だので埋め尽くされているのをみると、そっと vim を閉じたくなります。

さて、問題はこれらの記号をいかにして入力するか、ということです。Julia REPL では Tab キーを使い、\ から始まる LaTeX っぽい記法から変換することができます。例えば、

  1. \alp --Tab--> \alpha
  2. \alpha --Tab--> α

といった具合です。julia-vim が同様の機能を vim 上で実現していて非常に助かるんですけど、私思うんです、vim にはポップアップウィンドウがあるんだから \alpha を経由する必要なくない…?って。

というわけで書きました。

github.com

asyncomplete-unicodesymbol.vim

注意する点としては julia-vim と asyncomplete.vim v2 branch が必要なことです。リリースまでもうすこしらしいんですけど、よかったらデバッグに参加してみましょう。

(※ 2019/4/2 追記 asyncomplete.vim v2 無事リリースされました!今は master branch を使えば大丈夫です。)

さらに、当然といえば当然なのですが \alphaα に文字列としてはマッチしていません。このような補完 (変換?) をおこなうために、補完要素のフィルターをいじる必要があります。asyncomplete は v2 からこの部分をカスタマイズできるようになりました。わかる人は自分で何とかしてください。よくわからん、という人は asyncomplete-ezfilter.vim を使ってください。これは asyncomplete で complete-source 毎にフィルタをかけるためのプラグインです。まとめるとこんな感じです。

let g:asyncomplete_preprocessor =
  \ [function('asyncomplete#preprocessor#ezfilter#filter')]

autocmd User asyncomplete_setup call asyncomplete#register_source(
  \ asyncomplete#sources#unicodesymbol#get_source_options({
  \   'name': 'unicodesymbol',
  \   'whitelist': ['julia'],
  \   'completor': function('asyncomplete#sources#unicodesymbol#completor'),
  \ }))

let g:asyncomplete#preprocessor#ezfilter#config = {}
let g:asyncomplete#preprocessor#ezfilter#config.unicodesymbol =
  \ {ctx, items -> filter(items, 'ctx.match(v:val.menu)')}