🦍

GitHubのissueを編集するときの補完機能を実装した話

2021/12/21に公開

初めに

最近VimからGitHubのissueなどを扱うプラグインgh.vimをdenopsに移植していて、
前から実現したかったissue編集時の補完機能を実装したので、その話です。

https://github.com/skanehira/denops-gh.vim

デモ

こんな感じで動きます。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