Vim で Unicode 記号の入力補完をする
Julia 言語の特徴の一つとして広範な Unicode 記号を識別子として使える、というものがあります。その有用性について最初は懐疑的だったのですが、一度使ってしまうともう戻れなくなりました。過去のコードが mu
だの theta
だの phi
だので埋め尽くされているのをみると、そっと vim を閉じたくなります。
さて、問題はこれらの記号をいかにして入力するか、ということです。Julia REPL では Tab キーを使い、\
から始まる LaTeX っぽい記法から変換することができます。例えば、
\alp
--Tab-->\alpha
\alpha
--Tab-->α
といった具合です。julia-vim が同様の機能を vim 上で実現していて非常に助かるんですけど、私思うんです、vim にはポップアップウィンドウがあるんだから \alpha
を経由する必要なくない…?って。
というわけで書きました。
注意する点としては 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)')}