🦍
GitHubのissueを編集するときの補完機能を実装した話
初めに
最近VimからGitHubのissueなどを扱うプラグインgh.vimをdenopsに移植していて、
前から実現したかったissue編集時の補完機能を実装したので、その話です。
デモ
こんな感じで動きます。GitHubと比べると補完速度がちょっと遅いんですが、
GitHub上での編集では未公開のAPIを使っているため高速に動きます。
導入
denops-gh.vim以外にも次のプラグインをインストールする必要があります。
次に、vimrcに次の設定を追加します。これだけで補完が動くようになります。
augroup gh_autocmd
au!
autocmd User gh_open_issue call EnableAutoCompletion()
augroup END
function! EnableAutoCompletion() abort
" Enable source 'gh_issues' to current buffer.
call ddc#custom#patch_buffer('sources', ['gh_issues'])
call ddc#custom#patch_buffer('sourceOptions', {
\ 'gh_issues': {
\ 'matcherKey': 'menu'
\ }})
call ddc#custom#patch_buffer('specialBufferCompletion', v:true)
" If matsui54/denops-popup-preview.vim is installed,
" you can preview issue body's info.
call popup_preview#enable()
" remove 'preview' from completeopt
set completeopt-=preview
endfunction
実装
Shougo/ddc.vimを使って補完機能を実装しました。
ddc.vimはdark deno-powered completion
の略で、dein.vim
などでおなじみの暗黒美無王ことShougoさんが作られた補完フレームワークです。
このフレームワークを使用することで、実装者はデータをfetchして返す処理だけを書けば補完が動きます。
補完機能を実装するときはいろいろなことを考慮しないといないんですが、ddc.vimのおかげで実際のコードはこれだけで済んでいます。
export class Source extends BaseSource<Params, IssueItem | User> {
async gatherCandidates(args: {
denops: Denops;
context: Context;
options: DdcOptions;
sourceOptions: SourceOptions;
sourceParams: Params;
completeStr: string;
}): Promise<Candidate<IssueItem | User>[]> {
try {
const pos = await args.denops.call("getcurpos") as number[];
const col = pos[2];
const word = args.context.input.substring(0, col).split(" ").at(-1);
if (word?.at(0) !== "#" && word?.at(0) !== "@") {
return [];
}
return await getCandidates(args.denops, word);
} catch (e) {
console.error(e.message);
return [];
}
}
params(): Params {
return {
maxSize: 10,
};
}
}
最後に
denops-gh.vim自体はまだ移植中ですが、少しずつ動く様になってきています。現時点ではissue一覧の表示とissue編集、作成ができるようになりました。
目下、一番使うissue関連の機能を充実させていく予定です。
気になる方はぜひ試してみてください。
Happy Vimming!
Discussion